Example #1
0
        private static TileModel ExtractModel(MapObjectDefinition wmo, DoodadDefinition definition)
        {
            var filePath = definition.FilePath;
            var m2model = ExtractM2Model(filePath);

            return TransformM2Model(wmo, definition, m2model);
        }
Example #2
0
        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;
        }
Example #3
0
        static void ReadMODD(BinaryReader br, WMORoot wmo, uint size)
        {
            // Why oh why is wmo.Header.DoodadCount wrong sometimes
            uint count = size / 40; // 40 is the size of DoodadDefinition
            wmo.DoodadDefinitions = new DoodadDefinition[count];

            for (int 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.ReadUInt32()
                };

                if (dd.NameIndex != -1)
                {
                    if (!wmo.DoodadFiles.TryGetValue(dd.NameIndex, out dd.FilePath))
                    {
                        Console.WriteLine("Erroneous dd.NameIndex in WmoRoot: {0}", wmo.FilePath);
                    }
                }

                wmo.DoodadDefinitions[i] = dd;
            }
        }