Example #1
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;
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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));
            }
        }
Example #4
0
        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());
        }
Example #6
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 #7
0
 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));
 }
Example #8
0
        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);
            }
        }