127 lines
3.1 KiB
HLSL
127 lines
3.1 KiB
HLSL
#ifndef BOUNDS_INCLUDE
|
|
#define BOUNDS_INCLUDE
|
|
|
|
#include "Transform.cginc"
|
|
#include "Matrix.cginc"
|
|
|
|
struct aabb
|
|
{
|
|
float4 min_;
|
|
float4 max_;
|
|
|
|
void FromTriangle(float4 v1, float4 v2, float4 v3, float4 margin)
|
|
{
|
|
min_ = min(min(v1, v2), v3) - margin;
|
|
max_ = max(max(v1, v2), v3) + margin;
|
|
}
|
|
|
|
void FromEdge(float4 v1, float4 v2, float4 radius)
|
|
{
|
|
min_ = min(v2 - radius, v1 - radius);
|
|
max_ = max(v2 + radius, v1 + radius);
|
|
}
|
|
|
|
void FromParticle(float4 v1, float radius)
|
|
{
|
|
min_ = v1 - radius;
|
|
max_ = v1 + radius;
|
|
}
|
|
|
|
bool IntersectsAabb(in aabb b, bool in2D = false)
|
|
{
|
|
if (in2D)
|
|
{
|
|
return (min_[0] <= b.max_[0] && max_[0] >= b.min_[0]) &&
|
|
(min_[1] <= b.max_[1] && max_[1] >= b.min_[1]);
|
|
}
|
|
else
|
|
{
|
|
return (min_[0] <= b.max_[0] && max_[0] >= b.min_[0]) &&
|
|
(min_[1] <= b.max_[1] && max_[1] >= b.min_[1]) &&
|
|
(min_[2] <= b.max_[2] && max_[2] >= b.min_[2]);
|
|
}
|
|
}
|
|
|
|
float AverageAxisLength()
|
|
{
|
|
float4 d = max_ - min_;
|
|
return (d.x + d.y + d.z) * 0.33f;
|
|
}
|
|
|
|
float MaxAxisLength()
|
|
{
|
|
float4 d = max_ - min_;
|
|
return max(max(d.x,d.y),d.z);
|
|
}
|
|
|
|
void EncapsulateParticle(in float4 position, float radius)
|
|
{
|
|
min_ = min(min(min_, position - radius), position - radius);
|
|
max_ = max(max(max_, position + radius), position + radius);
|
|
}
|
|
|
|
void EncapsulateParticle(in float4 previousPosition, in float4 position, float radius)
|
|
{
|
|
min_ = min(min(min_, position - radius), previousPosition - radius);
|
|
max_ = max(max(max_, position + radius), previousPosition + radius);
|
|
}
|
|
|
|
void EncapsulateBounds(in aabb bounds)
|
|
{
|
|
min_ = min(min_,bounds.min_);
|
|
max_ = max(max_,bounds.max_);
|
|
}
|
|
|
|
void Expand(float4 amount)
|
|
{
|
|
min_ -= amount;
|
|
max_ += amount;
|
|
}
|
|
|
|
void Sweep(float4 velocity)
|
|
{
|
|
min_ = min(min_, min_ + velocity);
|
|
max_ = max(max_, max_ + velocity);
|
|
}
|
|
|
|
float4 Center()
|
|
{
|
|
return (min_ + (max_ - min_) * 0.5f);
|
|
}
|
|
|
|
void Transform(in float4x4 transform)
|
|
{
|
|
float3 xa = transform._m00_m10_m20 * min_.x;
|
|
float3 xb = transform._m00_m10_m20 * max_.x;
|
|
|
|
float3 ya = transform._m01_m11_m21 * min_.y;
|
|
float3 yb = transform._m01_m11_m21 * max_.y;
|
|
|
|
float3 za = transform._m02_m12_m22 * min_.z;
|
|
float3 zb = transform._m02_m12_m22 * max_.z;
|
|
|
|
min_ = float4(min(xa, xb) + min(ya, yb) + min(za, zb) + transform._m03_m13_m23, 0);
|
|
max_ = float4(max(xa, xb) + max(ya, yb) + max(za, zb) + transform._m03_m13_m23, 0);
|
|
}
|
|
|
|
void Transform(in transform transform)
|
|
{
|
|
Transform(TRS(transform.translation.xyz, transform.rotation, transform.scale.xyz));
|
|
}
|
|
|
|
aabb Transformed(in float4x4 trfm)
|
|
{
|
|
aabb cpy = this;
|
|
cpy.Transform(trfm);
|
|
return cpy;
|
|
}
|
|
|
|
aabb Transformed(in transform trfm)
|
|
{
|
|
aabb cpy = this;
|
|
cpy.Transform(trfm);
|
|
return cpy;
|
|
}
|
|
};
|
|
|
|
#endif |