예제 #1
0
        public override void Save(Stream fileStream)
        {
            var writer = new GensWriter(fileStream, Header);

            // Root Node
            writer.Write(Entries.Count);
            writer.AddOffset("entriesOffset");

            // AR Entry Offsets
            writer.FillInOffset("entriesOffset", false, false);
            writer.AddOffsetTable("entry", (uint)Entries.Count);

            // AR Entries
            for (int i = 0; i < Entries.Count; ++i)
            {
                var entry = Entries[i];
                writer.FillInOffset($"entry_{i}", false, false);

                writer.AddOffset($"nameOffset{i}");
                writer.Write(entry.PFDOffset);
                writer.Write(entry.Size);

                writer.FillInOffset($"nameOffset{i}", false, false);
                writer.WriteNullTerminatedString(entry.Name);
                writer.FixPadding(4);
            }

            writer.FinishWrite(Header);
        }
        public override void Save(Stream fileStream)
        {
            var writer = new GensWriter(fileStream, Header);

            Write(writer);
            writer.FinishWrite(Header);
        }
        public override void Save(Stream fileStream)
        {
            // Header
            var writer = new GensWriter(fileStream, Header);

            // Root Node
            writer.Write(InstanceInfos.Length);
            writer.AddOffset("instanceInfoOffsetsOffset");

            writer.Write(TerrainModels.Length);
            writer.AddOffset("terrainModelOffsetsOffset");

            // Instance Infos
            writer.FillInOffset("instanceInfoOffsetsOffset", false);
            writer.AddOffsetTable("instanceInfoOffset", (uint)InstanceInfos.Length);

            for (int i = 0; i < InstanceInfos.Length; ++i)
            {
                var instanceInfo = InstanceInfos[i];
                writer.FillInOffset("instanceInfoOffset_" + i, false);

                writer.Write(instanceInfo.FileNames.Length);
                writer.AddOffset("fileNameOffsetOffset");
                writer.AddOffset("boundingSphereOffset");

                // File Names
                writer.FillInOffset("fileNameOffsetOffset", false);
                writer.AddOffsetTable("fileNameOffset",
                                      (uint)instanceInfo.FileNames.Length);

                for (int i2 = 0; i2 < instanceInfo.FileNames.Length; ++i2)
                {
                    writer.FillInOffset($"fileNameOffset_{i2}", false);
                    writer.WriteNullTerminatedString(instanceInfo.FileNames[i2]);
                    writer.FixPadding(4);
                }

                // Bounding Sphere
                writer.FillInOffset("boundingSphereOffset", false);
                writer.Write(instanceInfo.BoundingSphereCenter);
                writer.Write(instanceInfo.BoundingSphereRadius);
            }

            // Terrain Models
            writer.FillInOffset("terrainModelOffsetsOffset", false);
            writer.AddOffsetTable("terrainModelOffset", (uint)TerrainModels.Length);

            for (int i = 0; i < TerrainModels.Length; ++i)
            {
                writer.FillInOffset($"terrainModelOffset_{i}", false);
                writer.WriteNullTerminatedString(TerrainModels[i]);
                writer.FixPadding(4);
            }

            writer.FinishWrite(Header);
        }
예제 #4
0
        public override void Save(Stream fileStream)
        {
            var writer = new GensWriter(fileStream, Header);

            writer.Write(textures.Count);
            writer.AddOffset("texturesOffset");

            writer.FillInOffset("texturesOffset", false, false);
            Write(writer);

            writer.FinishWrite(Header);
        }
예제 #5
0
            public void Write(GensWriter writer, float[] data, uint i, float scale = 1)
            {
                switch ((DataTypes)Type)
                {
                case DataTypes.Vector2:
                    writer.Write(data[i] * scale);
                    writer.Write(data[++i] * scale);
                    break;

                case DataTypes.Vector2_Half:
                    // TODO: Is this correct?
                    writer.WriteHalf((Half)(data[i] * scale));
                    writer.WriteHalf((Half)(data[++i] * scale));
                    break;

                case DataTypes.Vector3:
                    writer.Write(data[i] * scale);
                    writer.Write(data[++i] * scale);
                    writer.Write(data[++i] * scale);
                    break;

                case DataTypes.Vector3_360:
                    // TODO: Write this properly
                    throw new NotImplementedException(
                              "Cannot yet write Vector3_360 values");

                case DataTypes.Vector3_Forces:
                    // TODO: Write this properly
                    throw new NotImplementedException(
                              "Cannot yet write Vector3_Forces values");

                case DataTypes.Vector4:
                    writer.Write(data[i] * scale);
                    writer.Write(data[++i] * scale);
                    writer.Write(data[++i] * scale);
                    writer.Write(data[++i] * scale);
                    break;

                case DataTypes.Vector4_Byte:
                case DataTypes.Indices:
                    // TODO: Write this properly
                    throw new NotImplementedException(
                              "Cannot yet write Vector4_Byte/Indices values");

                case DataTypes.Indices_Byte:
                    // TODO: Write this properly
                    throw new NotImplementedException(
                              "Cannot yet write Indices_Byte values");
                }
            }
예제 #6
0
        public override void Save(Stream fileStream)
        {
            // Header
            var writer = new GensWriter(fileStream, Header);

            // Root Node
            writer.Write((uint)LightNames.Count);
            writer.AddOffset("lightTableOffset");

            // Data
            writer.FillInOffset("lightTableOffset", false);
            writer.AddOffsetTable("lightOffset", (uint)LightNames.Count);

            for (int i = 0; i < LightNames.Count; ++i)
            {
                writer.FillInOffset($"lightOffset_{i}", false);
                writer.WriteNullTerminatedString(LightNames[i]);
            }

            writer.FinishWrite(Header);
        }
예제 #7
0
        public override void Save(Stream fileStream)
        {
            // Header
            var writer = new GensWriter(fileStream, Header);

            // Root Node
            writer.Write((uint)LightType);

            // Data
            writer.Write(Position);
            writer.Write(Color);

            if (LightType == LightTypes.Omni)
            {
                writer.Write(UnknownTotal1);
                writer.Write(UnknownTotal2);
                writer.Write(UnknownTotal3);

                writer.Write(OmniInnerRange);
                writer.Write(OmniOuterRange);
            }

            writer.FinishWrite(Header);
        }
예제 #8
0
        protected virtual void Write(Stream fileStream,
                                     string additionalString = null)
        {
            // WHY ARE SIZeS IN THE OFfSET TABlE SEGA YOU BUMS?>??!??!
            int stringTableSize = 0;
            var stringTable     = new List <string>();
            var writer          = new GensWriter(fileStream, Header);

            writer.AddOffset("metaDataOffset");
            writer.AddOffset("metaAnimsSize");
            writer.AddOffset("keyframesOffset");
            writer.AddOffset("keyframesSize");
            writer.AddOffset("stringTableOffset");
            writer.AddOffset("stringTableSize");

            // MetaData
            uint metaDataOffset = (uint)fileStream.Position;

            writer.FillInOffset("metaDataOffset", false, false);
            AddStringToTable(name);

            if (!string.IsNullOrEmpty(additionalString))
            {
                AddStringToTable(additionalString);
            }

            writer.Write(Animations.Count);
            writer.AddOffsetTable("animsOffset", (uint)Animations.Count);

            // Animations
            for (int i = 0; i < Animations.Count; ++i)
            {
                var anim = Animations[i];
                writer.FillInOffset($"animsOffset_{i}", false, false);
                AddStringToTable(anim.BlendType);
                anim.Write(writer, true);
            }

            // Keyframes
            uint keyframesOffset = (uint)fileStream.Position;

            writer.FillInOffset("keyframesOffset", false, false);
            writer.FillInOffset("metaAnimsSize", keyframesOffset -
                                metaDataOffset, true, false);

            foreach (var anim in Animations)
            {
                foreach (var set in anim.KeyframeSets)
                {
                    set.WriteKeyframes(writer);
                }
            }

            // String Table
            uint stringTablePos = (uint)fileStream.Position;

            writer.FillInOffset("stringTableOffset", false, false);
            writer.FillInOffset("keyframesSize", stringTablePos -
                                keyframesOffset, true, false);

            foreach (string str in stringTable)
            {
                writer.WriteNullTerminatedString(str);
            }

            writer.FixPadding(4);
            writer.FillInOffset("stringTableSize", (uint)fileStream.Position -
                                stringTablePos, true, false);

            writer.FinishWrite(Header, writeEOFNull: false);

            // Sub-Methods
            void AddStringToTable(string str)
            {
                writer.Write(stringTableSize);
                stringTableSize += str.Length + 1;
                stringTable.Add(str);
            }
        }
        public override void Save(Stream fileStream)
        {
            bool useExternalTexset = !string.IsNullOrEmpty(TexsetName);

            if (useExternalTexset && Texset.Textures.Count > 255)
            {
                throw new NotSupportedException(
                          "Embedded texsets cannot contain more than 255 textures");
            }

            // Header
            var writer = new GensWriter(fileStream, Header, MaterialMirageType);

            // Root Node
            writer.AddOffset("shaderOffset");
            writer.AddOffset("subShaderOffset");
            writer.AddOffset("texsetOffset");
            writer.AddOffset("texturesOffset");

            writer.Write(MaterialFlag);
            writer.Write(NoBackFaceCulling);
            writer.Write(AdditiveBlending);
            writer.Write(UnknownFlag1);

            writer.Write((byte)parameters.Count);
            writer.Write((byte)0); // Padding1
            writer.Write((byte)0); // UnknownFlag2
            byte textureCount = (byte)Texset.Textures.Count;

            writer.Write(textureCount);

            writer.AddOffset("paramsOffset");
            writer.Write(0u); // Padding2
            writer.Write(0u); // Unknown1

            // Shader Name
            writer.FillInOffset("shaderOffset", false, false);
            writer.WriteNullTerminatedString(ShaderName);

            // Sub-Shader Name
            writer.FillInOffset("subShaderOffset", false, false);
            writer.WriteNullTerminatedString(SubShaderName);
            writer.FixPadding(4);

            // Parameter Offsets
            writer.FillInOffset("paramsOffset", false, false);
            writer.AddOffsetTable("param", (uint)parameters.Count);

            // Parameters
            for (int i = 0; i < parameters.Count; ++i)
            {
                var param = parameters[i];
                writer.FillInOffset($"param_{i}", false, false);
                writer.Write(param.ParamFlag1);
                writer.Write(param.ParamFlag2);

                writer.AddOffset($"paramNameOffset{i}");
                writer.AddOffset($"paramValueOffset{i}");

                // Parameter Name
                writer.FillInOffset($"paramNameOffset{i}", false, false);
                writer.WriteNullTerminatedString(param.Name);
                writer.FixPadding(4);

                // Parameter Value
                writer.FillInOffset($"paramValueOffset{i}", false, false);
                writer.Write(param.Value);
            }

            // Texset
            writer.FillInOffset("texsetOffset", false, false);
            if (useExternalTexset)
            {
                writer.WriteNullTerminatedString(TexsetName);
                writer.FixPadding(4);
            }
            else
            {
                Texset.Write(writer);

                // Texture Offsets
                writer.FillInOffset("texturesOffset", false, false);
                writer.AddOffsetTable("tex", textureCount);

                // Textures
                for (int i = 0; i < textureCount; ++i)
                {
                    writer.FillInOffset($"tex_{i}", false, false);
                    Texset.Textures[i].Write(writer, i.ToString());
                }
            }

            // Footer
            writer.FinishWrite(Header, MaterialMirageType, false);
        }