示例#1
0
        public ModelSpawn(string directory, BinaryReader reader)
        {
            if (reader.BaseStream.Position == reader.BaseStream.Length)
            {
                return;
            }

            var flags = reader.ReadInt32();

            reader.BaseStream.Position += 2 + 4;

            var position = reader.Read <Vector3>();

            position.X -= 32 * 533.333313f;
            position.Y -= 32 * 533.333313f;

            var rotation       = reader.Read <Vector3>();
            var rotationMatrix = RenderingExtensions.FromEulerAngles(rotation.Z * MathHelper.Pi / 180.0f,
                                                                     rotation.X * MathHelper.Pi / 180.0f,
                                                                     rotation.Y * MathHelper.Pi / 180.0f);

            var translationMatrix = Matrix4.CreateTranslation(position);
            var scaleMatrix       = Matrix4.CreateScale(reader.ReadSingle());

            PositionMatrix = rotationMatrix * scaleMatrix * translationMatrix;

            if ((flags & 0x4) != 0)
            {
                reader.BaseStream.Position += 4 * 6; // BBox
            }
            var nameLength = reader.ReadInt32();

            ModelName = string.Intern(System.Text.Encoding.UTF8.GetString(reader.ReadBytes(nameLength)));
        }
示例#2
0
        public ModelSpawn(string directory, BinaryReader reader)
        {
            Valid = false;
            if (reader.BaseStream.Position == reader.BaseStream.Length)
            {
                return;
            }

            Valid = true;
            Flags = reader.ReadUInt32();
            AdtID = reader.ReadUInt16();
            ID    = reader.ReadUInt32();

            var position = reader.Read <Vector3>();

            position.X -= 32 * 533.333313f;
            position.Y -= 32 * 533.333313f;

            var rotation = reader.Read <Vector3>();
            /// THIS IS OK. IF IT IS BECOMING WRONG, SWAP ROT.Z AND ROT.X
            var rotationMatrix = RenderingExtensions.FromEulerAngles(rotation.Z * MathHelper.Pi / 180.0f,
                                                                     rotation.X * MathHelper.Pi / 180.0f,
                                                                     rotation.Y * MathHelper.Pi / 180.0f);

            var translationMatrix = Matrix4.CreateTranslation(position);
            var scaleMatrix       = Matrix4.CreateScale(reader.ReadSingle());

            PositionMatrix = rotationMatrix * scaleMatrix * translationMatrix;

            if (HasBoundingBox)
            {
                BoundingBoxLow  = reader.Read <Vector3>();
                BoundingBoxHigh = reader.Read <Vector3>();
            }

            var nameLength = reader.ReadInt32();

            Name = System.Text.Encoding.UTF8.GetString(reader.ReadBytes(nameLength));

            Model = WorldModelCache.OpenInstance(directory, Name);
            foreach (var model in Model.GroupModels)
            {
                model.AddInstance(PositionMatrix);
            }
        }