示例#1
0
 public void TransformPoint(out CalVector4 result, ref CalVector4 point)
 {
     result = new CalVector4(
         (RowX.X * point.X) + (RowX.Y * point.Y) + (RowX.Z * point.Z) + RowX.W,
         (RowY.X * point.X) + (RowY.Y * point.Y) + (RowY.Z * point.Z) + RowY.W,
         (RowZ.X * point.X) + (RowZ.Y * point.Y) + (RowZ.Z * point.Z) + RowZ.W
         );
 }
示例#2
0
 public void TransformVector(out CalVector4 result, ref CalVector4 vector)
 {
     result = new CalVector4(
         (RowX.X * vector.X) + (RowX.Y * vector.Y) + (RowX.Z * vector.Z),
         (RowY.X * vector.X) + (RowY.Y * vector.Y) + (RowY.Z * vector.Z),
         (RowZ.X * vector.X) + (RowZ.Y * vector.Y) + (RowZ.Z * vector.Z)
         );
 }
 public void TransformVector(out CalVector4 result, ref CalVector4 vector)
 {
     result = new CalVector4(
         (RowX.X * vector.X) + (RowX.Y * vector.Y) + (RowX.Z * vector.Z),
         (RowY.X * vector.X) + (RowY.Y * vector.Y) + (RowY.Z * vector.Z),
         (RowZ.X * vector.X) + (RowZ.Y * vector.Y) + (RowZ.Z * vector.Z)
     );
 }
 public void TransformPoint(out CalVector4 result, ref CalVector4 point)
 {
     result = new CalVector4(
         (RowX.X * point.X) + (RowX.Y * point.Y) + (RowX.Z * point.Z) + RowX.W,
         (RowY.X * point.X) + (RowY.Y * point.Y) + (RowY.Z * point.Z) + RowY.W,
         (RowZ.X * point.X) + (RowZ.Y * point.Y) + (RowZ.Z * point.Z) + RowZ.W
     );
 }
示例#5
0
    public static void Main()
    {
        const int  N             = 10000;
        const long SecondInTicks = 10000000;

        var vertices   = new Vertex[N];
        var influences = new Influence[N];

        for (int i = 0; i < N; i++)
        {
            vertices[i] = new Vertex {
                Position = new CalVector4(1, 2, 3),
                Normal   = new CalVector4(0, 0, 1)
            };

            influences[i] = new Influence {
                BoneId = 0,
                Weight = 1.0f,
                LastInfluenceForThisVertex = true
            };
        }

        var boneTransforms = new BoneTransform[] {
            new BoneTransform()
        };

        var output = new CalVector4[N * 2];

        for (int i = 0; i < 100; i++)
        {
            long verticesSkinned = 0;
            long started         = DateTime.UtcNow.Ticks;

            while (DateTime.UtcNow.Ticks < (started + SecondInTicks))
            {
                CalculateVerticesAndNormals(
                    boneTransforms, N, vertices, influences, output
                    );

                verticesSkinned += N;
            }

            long elapsed = DateTime.UtcNow.Ticks - started;

            Console.WriteLine(
                "Skinned vertices per second: {0}",
                (verticesSkinned * SecondInTicks) / elapsed
                );
        }
    }
    public static void Main()
    {
        const int N = 10000;
        const long SecondInTicks = 10000000;

        var vertices = new Vertex[N];
        var influences = new Influence[N];

        for (int i = 0; i < N; i++) {
            vertices[i] = new Vertex {
                Position = new CalVector4(1, 2, 3),
                Normal = new CalVector4(0, 0, 1)
            };

            influences[i] = new Influence {
                BoneId = 0,
                Weight = 1.0f,
                LastInfluenceForThisVertex = true
            };
        }

        var boneTransforms = new BoneTransform[] {
            new BoneTransform()
        };

        var output = new CalVector4[N * 2];

        for (int i = 0; i < 100; i++) {
            long verticesSkinned = 0;
            long started = DateTime.UtcNow.Ticks;

            while (DateTime.UtcNow.Ticks < (started + SecondInTicks)) {
                CalculateVerticesAndNormals(
                    boneTransforms, N, vertices, influences, output
                );

                verticesSkinned += N;
            }

            long elapsed = DateTime.UtcNow.Ticks - started;

            Console.WriteLine(
                "Skinned vertices per second: {0}",
                (verticesSkinned * SecondInTicks) / elapsed
            );
        }
    }
    public static void CalculateVerticesAndNormals(
        BoneTransform[] boneTransforms,
        int vertexCount,
        Vertex[] vertices,
        Influence[] influences,
        CalVector4[] output
    )
    {
        Debug.Assert(output.Length == vertices.Length * 2);

        BoneTransform totalTransform;

        for (
            int sourceVertex = 0, sourceInfluence = 0, outputVertex = 0;
            sourceVertex < vertices.Length;
            sourceVertex++, sourceInfluence++, outputVertex += 2
        ) {
            var influence = influences[sourceInfluence];

            boneTransforms[influence.BoneId].Scale(
                out totalTransform, influence.Weight
            );

            while (!influence.LastInfluenceForThisVertex) {
                sourceInfluence += 1;
                influence = influences[sourceInfluence];

                boneTransforms[influence.BoneId].AddScaled(
                    ref totalTransform, influence.Weight
                );
            }

            totalTransform.TransformPoint(
                out output[outputVertex], ref vertices[sourceVertex].Position
            );
            totalTransform.TransformVector(
                out output[outputVertex + 1], ref vertices[sourceVertex].Normal
            );
        }
    }