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; } }
private static M2 TransformWMOM2(M2Model model, List <int> indices, 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(indices); return(currentM2); }
private void InsertModelGeometry(DoodadDefinition def, Model model) { var transformation = Transformation.GetTransformation(def); var vertOffset = (uint)Vertices.Count; foreach (var vert in model.Vertices) { Vertices.Add(Vector3.Transform(vert, transformation)); } foreach (var tri in model.Triangles) { Triangles.Add(new Triangle <uint>(TriangleType.Doodad, tri.V0 + vertOffset, tri.V1 + vertOffset, tri.V2 + vertOffset)); } }
private void ReadDoodadDefinitions(Chunk c) { int count = (int)c.Length / 36; _definitions = new List <DoodadDefinition>(count); var stream = c.GetStream(); for (int i = 0; i < count; i++) { var def = new DoodadDefinition(); def.Read(stream); _definitions.Add(def); } }
private static void CalculateModelsWMOSpaceBounds(DoodadDefinition def, M2Model model) { var wmoSpaceVecs = new List <Vector3>(model.BoundingVertices.Length); for (var j = 0; j < model.BoundingVertices.Length; j++) { Vector3 rotated; Vector3.Transform(ref model.BoundingVertices[j], ref def.ModelToWMO, out rotated); Vector3 final; Vector3.Add(ref rotated, ref def.Position, out final); wmoSpaceVecs.Add(final); } def.Extents = new BoundingBox(wmoSpaceVecs.ToArray()); }
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 void InsertModelGeometry(DoodadDefinition def, Model model) { var transformation = Transformation.GetTransformation(def); var vertOffset = (uint)Vertices.Count; foreach (var vert in model.Vertices) Vertices.Add(Vector3.Transform(vert, transformation)); foreach (var tri in model.Triangles) Triangles.Add(new Triangle<uint>(TriangleType.Doodad, tri.V0 + vertOffset, tri.V1 + vertOffset, tri.V2 + vertOffset)); }
private void ReadDoodadDefinitions(Chunk c) { int count = (int)c.Length/36; _definitions = new List<DoodadDefinition>(count); var stream = c.GetStream(); for (int i = 0; i < count; i++) { var def = new DoodadDefinition(); def.Read(stream); _definitions.Add(def); } }