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); }
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); } }
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); } }
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); }
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); }
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); }
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); }
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++; } } }
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); }