Beispiel #1
0
		private static M2 TransformWMOM2(M2Model model, IEnumerable<int> indicies, DoodadDefinition modd)
		{
			var currentM2 = new 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;
		}
Beispiel #2
0
        static void ReadMODD(BinaryReader br, WMORoot wmo, uint size)
        {
            // Why oh why is wmo.Header.DoodadCount wrong sometimes
            // 40 is the size of DoodadDefinition
            wmo.DoodadDefinitions = new DoodadDefinition[size / 40];

            for (var i = 0; i < wmo.DoodadDefinitions.Length; i++)
            {
                var dd = new DoodadDefinition
                             {
                                 NameIndex = br.ReadInt32(),
                                 Position = br.ReadVector3(),
                                 Rotation = br.ReadQuaternion(),
                                 Scale = br.ReadSingle(),
                                 Color = br.ReadColor4()
                             };

                if (dd.NameIndex != -1)
                {
                    if(!wmo.DoodadFiles.TryGetValue(dd.NameIndex, out dd.FilePath))
                    {
                        dd.FilePath = "";
                        log.Error(String.Format("Doodad File Path for index: {0} missing from the Dictionary!", dd.NameIndex));
                    }
                }

                wmo.DoodadDefinitions[i] = dd;
            }
        }