예제 #1
0
 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,
 };
예제 #2
0
        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));
        }
예제 #3
0
        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);
        }
예제 #4
0
        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));
        }
예제 #5
0
 float4 dot(float3_soa4 l, float3_soa4 r) =>
 l.x * r.x + l.y * r.y + l.z * r.z;