private static TileModel TransformM2Model(MapObjectDefinition wmo, DoodadDefinition definition, M2Model m2model) { var model = new TileModel { Vertices = new Vector3[m2model.BoundingVertices.Length] }; var origin = new Vector3(-definition.Position.X, definition.Position.Z, definition.Position.Y); var wmoOrigin = CorrectWMOOrigin(wmo.Position); var rotation = definition.Rotation; var rotateY = Matrix.CreateRotationY((wmo.OrientationB - 90) * RadiansPerDegree); for (var i = 0; i < m2model.BoundingVertices.Length; i++) { var vector = m2model.BoundingVertices[i]; var rotatedVector = Vector3.Transform(vector, rotation); rotatedVector = TransformToIntermediateCoords(rotatedVector); var finalModelVector = rotatedVector + origin; var rotatedWMOVector = Vector3.Transform(finalModelVector, rotateY); var finalWMOVector = rotatedWMOVector + wmoOrigin; model.Vertices[i] = finalWMOVector; } // Add the triangle indices to the model model.Triangles = new Index3[m2model.BoundingTriangles.Length]; for (var i = 0; i < m2model.BoundingTriangles.Length; i++) { var tri = m2model.BoundingTriangles[i]; model.Triangles[i] = new Index3 { Index0 = (short)tri[2], Index1 = (short)tri[1], Index2 = (short)tri[0] }; } // Calculate the boundingbox model.Bounds = new BoundingBox(model.Vertices); return model; }
private static void WriteModel(BinaryWriter writer, TileModel tileModel) { if (tileModel == null) { Console.WriteLine("Cannot write null Building to file."); return; } writer.Write(tileModel.Bounds); writer.Write(tileModel.Vertices.Length); for (var i = 0; i < tileModel.Vertices.Length; i++) { writer.Write(tileModel.Vertices[i]); } writer.Write(tileModel.Triangles.Length); for (var i = 0; i < tileModel.Triangles.Length; i++) { writer.Write(tileModel.Triangles[i]); } }
private static TileModel TransformM2Model(MapDoodadDefinition definition, M2Model m2model) { var model = new TileModel { Vertices = new Vector3[m2model.BoundingVertices.Length] }; // Rotate var origin = new Vector3( (TerrainConstants.CenterPoint - definition.Position.X), definition.Position.Y, (TerrainConstants.CenterPoint - definition.Position.Z) ); for (var i = 0; i < model.Vertices.Length; i++) { // Reverse the previos coord transform for the rotation. var vector = TransformToIntermediateCoords(m2model.BoundingVertices[i]); // Create the rotation matrices var rotateX = Matrix.CreateRotationX(definition.OrientationC * RadiansPerDegree); var rotateY = Matrix.CreateRotationY((definition.OrientationB - 90) * RadiansPerDegree); var rotateZ = Matrix.CreateRotationZ(-definition.OrientationA * RadiansPerDegree); // Rotate the vector var rotatedVector = Vector3.Transform(vector, rotateY); rotatedVector = Vector3.Transform(rotatedVector, rotateZ); rotatedVector = Vector3.Transform(rotatedVector, rotateX); var finalVector = rotatedVector + origin; model.Vertices[i] = finalVector; } // Add the triangle indices to the model model.Triangles = new Index3[m2model.BoundingTriangles.Length]; for (var i = 0; i < m2model.BoundingTriangles.Length; i++) { var tri = m2model.BoundingTriangles[i]; model.Triangles[i] = new Index3 { Index0 = (short)tri[2], Index1 = (short)tri[1], Index2 = (short)tri[0] }; } // Calculate the boundingbox model.Bounds = new BoundingBox(model.Vertices); return model; }