TerrainDisplay.MPQ.WMO.WMOManager.TransformWMOM2 C# (CSharp) Method

TransformWMOM2() private static method

private static TransformWMOM2 ( M2Model model, IEnumerable indicies, DoodadDefinition modd ) : M2.M2
model TerrainDisplay.MPQ.M2.M2Model
indicies IEnumerable
modd TerrainDisplay.MPQ.WMO.Components.DoodadDefinition
return M2.M2
        private static M2.M2 TransformWMOM2(M2Model model, IEnumerable<int> indicies, DoodadDefinition modd)
        {
            var currentM2 = new M2.M2();

            currentM2.Vertices.Clear();
            currentM2.Indices.Clear();

            var origin = new Vector3(modd.Position.X, modd.Position.Y, modd.Position.Z);

            // Create the scalar
            var scalar = modd.Scale;
            var scaleMatrix = Matrix.CreateScale(scalar);

            // Create the rotations
            var quatX = modd.Rotation.X;
            var quatY = modd.Rotation.Y;
            var quatZ = modd.Rotation.Z;
            var quatW = modd.Rotation.W;

            var rotQuat = new Quaternion(quatX, quatY, quatZ, quatW);
            var rotMatrix = Matrix.CreateFromQuaternion(rotQuat);

            var compositeMatrix = Matrix.Multiply(scaleMatrix, rotMatrix);

            for (var i = 0; i < model.BoundingVertices.Length; i++)
            {
                // Scale and transform
                var basePosVector = model.BoundingVertices[i];
                var baseNormVector = model.BoundingNormals[i];
                //PositionUtil.TransformToXNACoordSystem(ref vertex.Position);

                // Scale
                //Vector3 scaledVector;
                //Vector3.Transform(ref vector, ref scaleMatrix, out scaledVector);

                // Rotate
                Vector3 rotatedPosVector;
                Vector3.Transform(ref basePosVector, ref compositeMatrix, out rotatedPosVector);

                Vector3 rotatedNormVector;
                Vector3.Transform(ref baseNormVector, ref compositeMatrix, out rotatedNormVector);
                rotatedNormVector.Normalize();

                // Translate
                Vector3 finalPosVector;
                Vector3.Add(ref rotatedPosVector, ref origin, out finalPosVector);

                currentM2.Vertices.Add(finalPosVector);
            }

            currentM2.Indices.AddRange(indicies);
            return currentM2;
        }