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