Firstborn/Assets/AwesomeTechnologies/VegetationStudioPro/Runtime/Utility/BVHTree/BVHBBox.cs
Schaken-Mods 959e80cf72 assets upload
assets upload description.
2023-03-28 12:16:30 -05:00

64 lines
1.8 KiB
C#

using UnityEngine;
using AwesomeTechnologies.MeshTerrains;
using Unity.Mathematics;
namespace AwesomeTechnologies.Utility.BVHTree
{
[System.Serializable]
// ReSharper disable once InconsistentNaming
public class BVHBBox
{
public Vector3 Center = Vector3.zero;
public Vector3 Min = Vector3.one * float.MaxValue;
public Vector3 Max = Vector3.one * -float.MaxValue;
public static bool IntersectRay(BVHRay r, float3 min, float3 max, out float hitDist)
{
float tXmin, tXmax, tYmin, tYmax, tZmin, tZmax;
float xA = 1f / r.Direction.x, yA = 1f / r.Direction.y, zA = 1f / r.Direction.z;
float xE = r.Origin.x, yE = r.Origin.y, zE = r.Origin.z;
// calculate t interval in x-axis
if (xA >= 0)
{
tXmin = (min.x - xE) * xA;
tXmax = (max.x - xE) * xA;
}
else
{
tXmin = (max.x - xE) * xA;
tXmax = (min.x - xE) * xA;
}
// calculate t interval in y-axis
if (yA >= 0)
{
tYmin = (min.y - yE) * yA;
tYmax = (max.y - yE) * yA;
}
else
{
tYmin = (max.y - yE) * yA;
tYmax = (min.y - yE) * yA;
}
// calculate t interval in z-axis
if (zA >= 0)
{
tZmin = (min.z - zE) * zA;
tZmax = (max.z - zE) * zA;
}
else
{
tZmin = (max.z - zE) * zA;
tZmax = (min.z - zE) * zA;
}
var tMin = math.max(tXmin, math.max(tYmin, tZmin));
var tMax = math.min(tXmax, math.min(tYmax, tZmax));
hitDist = tMin;
return (tMin <= tMax);
}
}
}