float3_soa4 cross(float3_soa4 l, float3_soa4 r) => new float3_soa4 { x = l.y * r.z - l.z * r.y, y = l.z * r.x - l.x * r.z, z = l.x * r.y - l.y * r.x, };
public bool IsInside(AABB bbox) { var n = this.plane4.xyz; var d = this.plane4.w; var c = bbox.Center.ExpandToSoa4(); var e = bbox.Extents.ExpandToSoa4(); var l = new float3_soa4() { x = c.x + e.x * math.sign(n.x), y = c.y + e.y * math.sign(n.y), z = c.z + e.z * math.sign(n.z), }; return(math.all(dot(l, n) + d >= 0.0f)); }
float3_soa4 rotate(float4_soa4 q, float3_soa4 v) { var qv = cross(q.xyz, v); var t = new float3_soa4 { x = 2.0f * qv.x, y = 2.0f * qv.y, z = 2.0f * qv.z, }; var qt = cross(q.xyz, t); var o = new float3_soa4 { x = v.x + q.w * t.x + qt.x, y = v.y + q.w * t.y + qt.y, z = v.z + q.w * t.z + qt.z, }; return(o); }
bool isInside <TScaling>(AABB localBbox, Rotation rot, Translation pos, NonUniformScale scl) where TScaling : IScaling, new() { var pl = this.plane4; var ir = math.inverse(rot.Value).value.ExpandToSoa4(); var t = pos.Value.ExpandToSoa4(); var n = rotate(ir, pl.xyz); var d = pl.w + dot(pl.xyz, t); var c = localBbox.Center.ExpandToSoa4(); var e = localBbox.Extents.SmartScaling <TScaling>(scl).ExpandToSoa4(); var l = new float3_soa4() { x = c.x + e.x * math.sign(n.x), y = c.y + e.y * math.sign(n.y), z = c.z + e.z * math.sign(n.z), }; return(math.all(dot(l, n) + d >= 0.0f)); }
float4 dot(float3_soa4 l, float3_soa4 r) => l.x * r.x + l.y * r.y + l.z * r.z;