public override void Read(FileReader reader, HsfFile header) { Attributes = reader.ReadMultipleStructs <AttributeData>(this.Count); for (int i = 0; i < Attributes.Count; i++) { AttributeNames.Add(header.GetString(reader, Attributes[i].NameOffset)); } }
public override void Read(FileReader reader, HsfFile header) { Objects = reader.ReadMultipleStructs <ObjectData>(this.Count); for (int i = 0; i < Objects.Count; i++) { ObjectNames.Add(header.GetString(reader, Objects[i].StringOffset)); } }
public override void Read(FileReader reader, HsfFile header) { List <MaterialObject> Materials = reader.ReadMultipleStructs <MaterialObject>(this.Count); for (int i = 0; i < Materials.Count; i++) { string name = header.GetString(reader, Materials[i].NameOffset); header.AddMaterial(Materials[i], name); } }
public override void Read(FileReader reader, HsfFile header) { for (int i = 0; i < this.Count; i++) { Nodes.Add(new Node() { Name = header.GetString(reader, reader.ReadUInt32()), Transform = reader.ReadStruct <Transform>() }); } }
internal void ReadEffectMeshes(FileReader reader, HsfFile header) { var primitives = header.GetPrimitiveList(); //Read additional custom effect meshes List <uint> readMeshes = new List <uint>(); for (int i = 0; i < Objects.Count; i++) { if (Objects[i].PositionsOffset == 0 || Objects[i].VertexIndex < 0 || readMeshes.Contains((uint)Objects[i].PositionsOffset)) { continue; } EffectMesh mesh = new EffectMesh(); mesh.ObjectParent = Objects[i]; Meshes.Add(mesh); if (Objects[i].FaceIndex != -1 && Objects[i].FaceIndex < primitives.Count) { mesh.Primitive = primitives[Objects[i].FaceIndex]; } readMeshes.Add((uint)Objects[i].PositionsOffset); var comp = header.PositionData.Components[Objects[i].VertexIndex]; mesh.Name = header.GetString(reader, comp.StringOffset); using (reader.TemporarySeek(Objects[i].PositionsOffset, System.IO.SeekOrigin.Begin)) { for (int j = 0; j < comp.DataCount; j++) { mesh.Positions.Add(reader.ReadVec3()); } } if (Objects[i].NormalIndex >= 0) { var normalData = header.NormalData.Components[Objects[i].NormalIndex]; using (reader.TemporarySeek(Objects[i].NormalsOffset, System.IO.SeekOrigin.Begin)) { for (int j = 0; j < normalData.DataCount; j++) { mesh.Normals.Add(reader.ReadVec3()); } } } } }
public override void Read(FileReader reader, HsfFile header) { var textures = reader.ReadMultipleStructs <TextureInfo>(this.Count); long pos = reader.Position; for (int i = 0; i < textures.Count; i++) { string name = header.GetString(reader, textures[i].NameOffset); reader.SeekBegin(pos + textures[i].DataOffset); var format = FormatList[textures[i].Format]; if (format == Decode_Gamecube.TextureFormats.C8) { if (textures[i].Bpp == 4) { format = Decode_Gamecube.TextureFormats.C4; } } var size = Decode_Gamecube.GetDataSize(format, textures[i].Width, textures[i].Height, false); var data = reader.ReadBytes(size); header.AddTexture(name, textures[i], data); } }
public override void Read(FileReader reader, HsfFile header) { List <MotionData> anims = reader.ReadMultipleStructs <MotionData>(this.Count); long pos = reader.Position; for (int i = 0; i < anims.Count; i++) { HSFMotionAnimation anm = new HSFMotionAnimation(); Animations.Add(anm); anm.Name = header.GetString(reader, anims[i].NameOffset); anm.FrameCount = anims[i].MotionLength; reader.SeekBegin(pos + anims[i].TrackDataOffset); for (int j = 0; j < anims[i].TrackCount; j++) { TrackData track = new TrackData(); track.mode = (TrackMode)reader.ReadByte(); track.unk = reader.ReadByte(); track.stringOffset = reader.ReadInt16(); track.valueIndex = reader.ReadInt16(); //Used if no string (stringOffset = -1) track.effect = (TrackEffect)reader.ReadInt16(); track.interpolate_type = (InterpolationMode)reader.ReadInt16(); track.keyframe_count = reader.ReadInt16(); if (track.keyframe_count > 0 && track.interpolate_type != InterpolationMode.Constant) { track.keyframe_offset = reader.ReadInt32(); } else { track.Constant = reader.ReadSingle(); } Console.WriteLine($"{j} TrackMode {track.mode} valueIndex {track.valueIndex} effect {track.effect} interp {track.interpolate_type} Constant {track.Constant}"); if (track.valueIndex != 0) { //Console.WriteLine($"valueIndex {track.valueIndex} str {track.stringOffset}"); } anm.trackInfo.Add(track); } } Dictionary <string, AnimationNode> animationNodes = new Dictionary <string, AnimationNode>(); long dataStart = reader.Position; for (int i = 0; i < Animations.Count; i++) { var anim = Animations[i]; for (int j = 0; j < anim.trackInfo.Count; j++) { var track = anim.trackInfo[j]; string name = header.GetString(reader, (uint)track.stringOffset); if (track.stringOffset == -1) { name = $"{track.mode}_{track.valueIndex}"; } else if (track.valueIndex > 0) { name = $"{name}_{track.valueIndex}"; } if (!animationNodes.ContainsKey(name)) { animationNodes.Add(name, new AnimationNode() { Name = name, Mode = track.mode, ValueIndex = track.valueIndex, }); } AnimationNode currentGroup = animationNodes[name]; List <STKeyFrame> keyFrames = new List <STKeyFrame>(); if (track.keyframe_count > 0 && track.interpolate_type != InterpolationMode.Constant) { reader.SeekBegin(dataStart + track.keyframe_offset); for (int key = 0; key < track.keyframe_count; key++) { switch (track.interpolate_type) { //8 bytes case InterpolationMode.Step: { keyFrames.Add(new STKeyFrame() { Frame = reader.ReadSingle(), Value = reader.ReadSingle(), }); } break; //8 bytes case InterpolationMode.Bitmap: { keyFrames.Add(new STKeyFrame() { Frame = reader.ReadSingle(), Value = reader.ReadInt32(), }); } break; //16 bytes case InterpolationMode.Bezier: { keyFrames.Add(new STBezierKeyFrame() { Frame = reader.ReadSingle(), Value = reader.ReadSingle(), SlopeIn = reader.ReadSingle(), SlopeOut = reader.ReadSingle(), }); } break; case InterpolationMode.Linear: { keyFrames.Add(new STKeyFrame() { Frame = reader.ReadSingle(), Value = reader.ReadSingle(), }); } break; default: throw new Exception($"Unsupported interpolation mode! track {j} " + track.interpolate_type); } } } currentGroup.TrackList.Add(new AnimTrack(currentGroup) { ConstantUnk = track.keyframe_count, //When constant used, value is used for something else? KeyFrames = keyFrames, TrackEffect = track.effect, TrackMode = track.mode, ValueIdx = track.valueIndex, Unknown = track.unk, Constant = track.Constant, InterpolationType = ConvertType(track.interpolate_type), }); } foreach (var group in animationNodes) { anim.AnimGroups.Add(group.Value); } } }