示例#1
0
        static protected void MirrorMatrix(PieceTransform pieceTransform, ref float4x4 m)
        {
            byte mirror = (byte)((byte)pieceTransform & MirrorMask);

            switch (mirror)
            {
            case (byte)PieceTransform.MirrorX: m.c0.x *= -1; m.c1.x *= -1; m.c2.x *= -1; break;

            case (byte)PieceTransform.MirrorY: m.c0.y *= -1; m.c1.y *= -1; m.c2.y *= -1; break;

            case (byte)PieceTransform.MirrorZ: m.c0.z *= -1; m.c1.z *= -1; m.c2.z *= -1; break;
            }
        }
示例#2
0
        static protected float4x4 ToRotationMatrix(PieceTransform pieceTransform)
        {
            byte rotation = (byte)((byte)pieceTransform & RotationMask);

            switch (rotation)
            {
            case (byte)PieceTransform.Rotate90: return(float4x4.RotateY(math.radians(-90)));

            case (byte)PieceTransform.Rotate180: return(float4x4.RotateY(math.radians(-180)));

            case (byte)PieceTransform.Rotate270: return(float4x4.RotateY(math.radians(-270)));
            }
            return(float4x4.identity);
        }
示例#3
0
            /// <summary>
            /// can value configuration be transformed into target configuration
            /// </summary>
            /// <param name="value"></param>
            /// <param name="target"></param>
            /// <param name="mirrorDirection"></param>
            /// <returns></returns>
            static private bool FindTransform(byte value, byte target, out PieceTransform transform)
            {
                transform = PieceTransform.None;

                if (value == target)
                {
                    return(true);
                }

                byte value90  = RotateCW90(value);
                byte value180 = RotateCW90(value90);
                byte value270 = RotateCW90(value180);

                byte valueMirX    = MirrorX(value);
                byte valueMirX90  = RotateCW90(valueMirX);
                byte valueMirX180 = RotateCW90(valueMirX90);
                byte valueMirX270 = RotateCW90(valueMirX180);

                byte[]           values = { value90, value180, value270, valueMirX, valueMirX90, valueMirX180, valueMirX270 };
                PieceTransform[] dirs   =
                {
                    PieceTransform.Rotate90, PieceTransform.Rotate180,                         PieceTransform.Rotate270,
                    PieceTransform.MirrorX,  PieceTransform.MirrorX | PieceTransform.Rotate90, PieceTransform.MirrorX | PieceTransform.Rotate180, PieceTransform.MirrorX | PieceTransform.Rotate270
                };

                for (int i = 0; i < values.Length; ++i)
                {
                    if (values[i] == target)
                    {
                        transform = dirs[i];
                        return(true);
                    }
                }

                // this is handled separately because y mirroring will be optional,
                // there will be tile sets where it is banned (and for 2d it wouldn't even make sense)
                for (int i = 0; i < values.Length; ++i)
                {
                    if (MirrorY(values[i]) == target)
                    {
                        transform = dirs[i] | PieceTransform.MirrorY;
                        return(true);
                    }
                }

                return(false);
            }
示例#4
0
        static protected float4x4 CreateTransform(float3 pos, PieceTransform pieceTransform)
        {
            float4x4 transform = ToRotationMatrix(pieceTransform);

            if (HasFlag(pieceTransform, PieceTransform.MirrorX))
            {
                MirrorMatrix(PieceTransform.MirrorX, ref transform);
            }
            if (HasFlag(pieceTransform, PieceTransform.MirrorY))
            {
                MirrorMatrix(PieceTransform.MirrorY, ref transform);
            }

            transform.c3.x = pos.x;
            transform.c3.y = pos.y;
            transform.c3.z = pos.z;

            return(transform);
        }
示例#5
0
 static protected bool HasFlag(PieceTransform transform, PieceTransform flag)
 {
     return((byte)(transform & flag) != 0);
 }
示例#6
0
 public ConfigTransform(int baseMeshIndex, PieceTransform pieceTransform)
 {
     this.baseMeshIndex  = baseMeshIndex;
     this.pieceTransform = pieceTransform;
 }