Exemplo n.º 1
0
 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));
     }
 }
Exemplo n.º 2
0
 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));
     }
 }
Exemplo n.º 3
0
        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);
            }
        }
Exemplo n.º 4
0
 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>()
         });
     }
 }
Exemplo n.º 5
0
        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());
                        }
                    }
                }
            }
        }
Exemplo n.º 6
0
        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);
            }
        }
Exemplo n.º 7
0
        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);
                }
            }
        }