Пример #1
0
        public override void Write(FileWriter writer, HsfFile header)
        {
            var meshes = header.Meshes.Where(x => x.TexCoords.Count > 0).ToList();

            long posStart = writer.Position;

            foreach (var mesh in meshes)
            {
                writer.Write(header.GetStringOffset(mesh.Name));
                writer.Write(mesh.TexCoords.Count);
                writer.Write(uint.MaxValue);
            }

            long dataPos = writer.Position;

            for (int i = 0; i < meshes.Count; i++)
            {
                meshes[i].ObjectData.TexCoordIndex = i;

                writer.Align(0x20);
                writer.WriteUint32Offset(posStart + 8 + (i * 12), dataPos);
                for (int j = 0; j < meshes[i].TexCoords.Count; j++)
                {
                    writer.Write(meshes[i].TexCoords[j]);
                }
            }
            writer.Align(4);
        }
Пример #2
0
 public override void Write(FileWriter writer, HsfFile header)
 {
     for (int i = 0; i < Nodes.Count; i++)
     {
         writer.Write(header.GetStringOffset(Nodes[i].Name));
         writer.WriteStruct(Nodes[i].Transform);
     }
 }
Пример #3
0
 public override void Write(FileWriter writer, HsfFile header)
 {
     for (int i = 0; i < Objects.Count; i++)
     {
         var obj = Objects[i];
         obj.StringOffset = (uint)header.GetStringOffset(ObjectNames[i]);
         writer.WriteStruct(obj);
     }
 }
Пример #4
0
 public override void Write(FileWriter writer, HsfFile header)
 {
     for (int i = 0; i < Attributes.Count; i++)
     {
         var mat = Attributes[i];
         mat.NameOffset = (uint)header.GetStringOffset(AttributeNames[i]);
         writer.WriteStruct(mat);
     }
     writer.Align(4);
 }
Пример #5
0
 public override void Write(FileWriter writer, HsfFile header)
 {
     for (int i = 0; i < header.Materials.Count; i++)
     {
         var mat = header.Materials[i];
         mat.MaterialData.NameOffset = (uint)header.GetStringOffset(mat.Name);
         writer.WriteStruct(mat.MaterialData);
     }
     writer.Align(4);
 }
Пример #6
0
        public override void Write(FileWriter writer, HsfFile header)
        {
            var meshes = header.Meshes.Where(x => x.Positions.Count > 0).ToList();

            long posStart = writer.Position;

            foreach (var mesh in meshes)
            {
                writer.Write(header.GetStringOffset(mesh.Name));
                writer.Write(mesh.Normals.Count);
                writer.Write(uint.MaxValue);
            }

            if (meshes.Count == 1)
            {
                TypeFlag = DataType.Sbyte;
            }

            long dataPos = writer.Position;

            for (int i = 0; i < meshes.Count; i++)
            {
                meshes[i].ObjectData.NormalIndex = i;

                writer.Align(0x20);
                writer.WriteUint32Offset(posStart + 8 + (i * 12), dataPos);
                for (int j = 0; j < meshes[i].Normals.Count; j++)
                {
                    if (TypeFlag == DataType.Sbyte)
                    {
                        writer.Write((sbyte)(meshes[i].Normals[j].X * sbyte.MaxValue));
                        writer.Write((sbyte)(meshes[i].Normals[j].Y * sbyte.MaxValue));
                        writer.Write((sbyte)(meshes[i].Normals[j].Z * sbyte.MaxValue));
                    }
                    else
                    {
                        writer.Write(meshes[i].Normals[j]);
                    }
                }
            }
            writer.Align(4);
        }
Пример #7
0
        public override void Write(FileWriter writer, HsfFile header)
        {
            long texpos = writer.Position;

            for (int i = 0; i < header.Textures.Count; i++)
            {
                var tex = header.Textures[i].TextureInfo;
                tex.NameOffset = (uint)header.GetStringOffset(header.Textures[i].Name);
                writer.WriteStruct(tex);
            }

            long datapos = writer.Position;

            for (int i = 0; i < header.Textures.Count; i++)
            {
                writer.Align(0x20);
                writer.WriteUint32Offset(texpos + 28 + (i * 32), datapos);
                writer.Write(header.Textures[i].ImageData);
            }
            writer.Align(8);
        }
Пример #8
0
        public override void Write(FileWriter writer, HsfFile header)
        {
            //Turn our animation back into HSF structures
            List <MotionData> motionData = new List <MotionData>();

            foreach (var anim in Animations)
            {
                var motion = new MotionData()
                {
                    NameOffset      = (uint)header.GetStringOffset(anim.Name),
                    MotionLength    = anim.FrameCount,
                    TrackCount      = anim.GetTrackCount(),
                    TrackDataOffset = 0,
                };
                writer.WriteStruct(motion);
            }

            long animStart = writer.Position;

            long trackStart = writer.Position;

            for (int i = 0; i < Animations.Count; i++)
            {
                writer.WriteUint32Offset(animStart + 12 + (i * 16), trackStart);

                var tracks = Animations[i].GetAllTracks();
                foreach (var track in tracks)
                {
                    string name          = track.ParentGroup.Name;
                    var    interpolation = ConvertType(track.InterpolationType);

                    writer.Write((byte)track.TrackMode);
                    writer.Write((byte)track.Unknown);
                    if (track.TrackMode == TrackMode.Normal ||
                        track.TrackMode == TrackMode.Material ||
                        track.TrackMode == TrackMode.Object)
                    {
                        writer.Write((short)header.GetStringOffset(name));
                    }
                    else
                    {
                        writer.Write(ushort.MaxValue);
                    }
                    writer.Write((short)track.ValueIdx);
                    writer.Write((short)track.TrackEffect);
                    writer.Write((short)interpolation);
                    if (track.InterpolationType != STInterpoaltionType.Constant)
                    {
                        writer.Write((short)track.KeyFrames.Count);
                        writer.Write(uint.MaxValue);
                    }
                    else
                    {
                        writer.Write((short)track.ConstantUnk);
                        writer.Write(track.Constant);
                    }
                }
            }

            long dataStart  = writer.Position;
            int  trackIndex = 0;

            for (int i = 0; i < Animations.Count; i++)
            {
                var anim   = Animations[i];
                var tracks = anim.GetAllTracks();

                for (int j = 0; j < tracks.Count; j++)
                {
                    var track = tracks[j];

                    if (track.InterpolationType != STInterpoaltionType.Constant)
                    {
                        //Save the keyframe offset
                        if (track.KeyFrames.Count > 0)
                        {
                            writer.WriteUint32Offset(trackStart + 12 + (trackIndex * 16), dataStart);
                        }

                        for (int key = 0; key < track.KeyFrames.Count; key++)
                        {
                            var keyFrame = track.KeyFrames[key];
                            switch (track.InterpolationType)
                            {
                            //8 bytes
                            case STInterpoaltionType.Step:
                            {
                                writer.Write(keyFrame.Frame);
                                writer.Write(keyFrame.Value);
                            }
                            break;

                            //8 bytes
                            case STInterpoaltionType.Linear:
                            {
                                writer.Write(keyFrame.Frame);
                                writer.Write(keyFrame.Value);
                            }
                            break;

                            //8 bytes
                            case STInterpoaltionType.Bitmap:
                            {
                                writer.Write(keyFrame.Frame);
                                writer.Write((int)keyFrame.Value);
                            }
                            break;

                            //16 bytes
                            case STInterpoaltionType.Bezier:
                            {
                                writer.Write(keyFrame.Frame);
                                writer.Write(keyFrame.Value);
                                writer.Write(((STBezierKeyFrame)keyFrame).SlopeIn);
                                writer.Write(((STBezierKeyFrame)keyFrame).SlopeOut);
                            }
                            break;

                            default:
                                throw new Exception("Unsupported interpolation mode! " + track.InterpolationType);
                            }
                        }
                    }

                    trackIndex++;
                }
            }
        }
Пример #9
0
        public override void Write(FileWriter writer, HsfFile header)
        {
            var meshes = header.Meshes.Where(x => x.Primitives.Count > 0).ToList();

            long posStart = writer.Position;

            foreach (var mesh in meshes)
            {
                writer.Write(header.GetStringOffset(mesh.Name));
                writer.Write(mesh.Primitives.Count);
                writer.Write(uint.MaxValue);
            }


            long dataStart = writer.Position;

            var ExtOffset = dataStart;

            foreach (var mesh in meshes)
            {
                ExtOffset += mesh.Primitives.Count * 48;
            }
            var triangleStripPosition = ExtOffset;

            int  meshIndex = 0;
            long dataPos   = writer.Position;

            foreach (var mesh in meshes)
            {
                writer.WriteUint32Offset(posStart + 8 + (meshIndex * 12), dataPos);
                foreach (var primitive in mesh.Primitives)
                {
                    writer.Write((ushort)primitive.Type);
                    primitive.Flags  = (ushort)(primitive.MaterialIndex);
                    primitive.Flags |= (ushort)(primitive.FlagValue << 12);

                    writer.Write(primitive.Flags);

                    int primCount = 3;
                    if (primitive.Type == PrimitiveType.Triangle || primitive.Type == PrimitiveType.Quad)
                    {
                        primCount = 4;
                    }

                    for (int i = 0; i < primCount; i++)
                    {
                        writer.WriteStruct(primitive.Vertices[i]);
                    }

                    if (primitive.Type == PrimitiveType.TriangleStrip)
                    {
                        writer.Write((uint)(primitive.Vertices.Length - 4));
                        long stripOffsetPos = writer.Position;
                        long offset         = triangleStripPosition - ExtOffset;
                        if (offset != 0)
                        {
                            offset /= 8;
                        }
                        writer.Write((uint)offset);

                        using (writer.TemporarySeek(triangleStripPosition, System.IO.SeekOrigin.Begin))
                        {
                            for (int i = 4; i < primitive.Vertices.Length; i++)
                            {
                                writer.WriteStruct(primitive.Vertices[i]);
                            }

                            triangleStripPosition = writer.Position;
                        }
                    }
                    writer.Write(primitive.NbtData);
                }
                meshIndex++;
            }

            writer.SeekBegin(triangleStripPosition);
        }