public void Write(EndianBinaryWriter writer) { long start = writer.BaseStream.Position; writer.Write("MAT3".ToCharArray()); writer.Write(0); // Placeholder for section offset writer.Write((short)m_RemapIndices.Count); writer.Write((short)-1); writer.Write(132); // Offset to material init data. Always 132 for (int i = 0; i < 29; i++) { writer.Write(0); } bool[] writtenCheck = new bool[m_Materials.Count]; List <string> names = m_MaterialNames; for (int i = 0; i < m_RemapIndices.Count; i++) { if (writtenCheck[m_RemapIndices[i]]) { continue; } else { WriteMaterialInitData(writer, m_Materials[m_RemapIndices[i]]); writtenCheck[m_RemapIndices[i]] = true; } } long curOffset = writer.BaseStream.Position; // Remap indices offset writer.Seek((int)start + 16, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); for (int i = 0; i < m_RemapIndices.Count; i++) { writer.Write((short)m_RemapIndices[i]); } curOffset = writer.BaseStream.Position; // Name table offset writer.Seek((int)start + 20, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); NameTableIO.Write(writer, names); StreamUtility.PadStreamWithString(writer, 8); curOffset = writer.BaseStream.Position; // Indirect texturing offset writer.Seek((int)start + 24, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); IndirectTexturingIO.Write(writer, m_IndirectTexBlock); curOffset = writer.BaseStream.Position; // Cull mode offset writer.Seek((int)start + 28, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); CullModeIO.Write(writer, m_CullModeBlock); curOffset = writer.BaseStream.Position; // Material colors offset writer.Seek((int)start + 32, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); ColorIO.Write(writer, m_MaterialColorBlock); curOffset = writer.BaseStream.Position; // Color channel count offset writer.Seek((int)start + 36, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); foreach (byte chanNum in NumColorChannelsBlock) { writer.Write(chanNum); } StreamUtility.PadStreamWithStringByOffset(writer, (int)(writer.BaseStream.Position - curOffset), 4); curOffset = writer.BaseStream.Position; // Color channel data offset writer.Seek((int)start + 40, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); ColorChannelIO.Write(writer, m_ChannelControlBlock); curOffset = writer.BaseStream.Position; // ambient color data offset writer.Seek((int)start + 44, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); ColorIO.Write(writer, m_AmbientColorBlock); curOffset = writer.BaseStream.Position; // light color data offset writer.Seek((int)start + 48, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); if (m_LightingColorBlock != null) { ColorIO.Write(writer, m_LightingColorBlock); } curOffset = writer.BaseStream.Position; // tex gen count data offset writer.Seek((int)start + 52, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); foreach (byte texGenCnt in NumTexGensBlock) { writer.Write(texGenCnt); } StreamUtility.PadStreamWithStringByOffset(writer, (int)(writer.BaseStream.Position - curOffset), 4); curOffset = writer.BaseStream.Position; // tex coord 1 data offset writer.Seek((int)start + 56, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); TexCoordGenIO.Write(writer, m_TexCoord1GenBlock); curOffset = writer.BaseStream.Position; if (m_TexCoord2GenBlock != null) { // tex coord 2 data offset writer.Seek((int)start + 60, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); TexCoordGenIO.Write(writer, m_TexCoord2GenBlock); } else { writer.Seek((int)start + 60, System.IO.SeekOrigin.Begin); writer.Write((int)0); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); } curOffset = writer.BaseStream.Position; // tex matrix 1 data offset writer.Seek((int)start + 64, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); TexMatrixIO.Write(writer, m_TexMatrix1Block); curOffset = writer.BaseStream.Position; if (m_TexMatrix2Block != null) { // tex matrix 1 data offset writer.Seek((int)start + 68, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); TexMatrixIO.Write(writer, m_TexMatrix2Block); } else { writer.Seek((int)start + 60, System.IO.SeekOrigin.Begin); writer.Write((int)0); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); } curOffset = writer.BaseStream.Position; // tex number data offset writer.Seek((int)start + 72, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); foreach (int inte in m_TexRemapBlock) { writer.Write((short)inte); } StreamUtility.PadStreamWithString(writer, 4); curOffset = writer.BaseStream.Position; // tev order data offset writer.Seek((int)start + 76, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); TevOrderIO.Write(writer, m_TevOrderBlock); curOffset = writer.BaseStream.Position; // tev color data offset writer.Seek((int)start + 80, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); Int16ColorIO.Write(writer, m_TevColorBlock); curOffset = writer.BaseStream.Position; // tev konst color data offset writer.Seek((int)start + 84, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); ColorIO.Write(writer, m_TevKonstColorBlock); curOffset = writer.BaseStream.Position; // tev stage count data offset writer.Seek((int)start + 88, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); foreach (byte bt in NumTevStagesBlock) { writer.Write(bt); } StreamUtility.PadStreamWithStringByOffset(writer, (int)(writer.BaseStream.Position - curOffset), 4); curOffset = writer.BaseStream.Position; // tev stage data offset writer.Seek((int)start + 92, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); TevStageIO.Write(writer, m_TevStageBlock); curOffset = writer.BaseStream.Position; // tev swap mode offset writer.Seek((int)start + 96, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); TevSwapModeIO.Write(writer, m_SwapModeBlock); curOffset = writer.BaseStream.Position; // tev swap mode table offset writer.Seek((int)start + 100, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); TevSwapModeTableIO.Write(writer, m_SwapTableBlock); curOffset = writer.BaseStream.Position; // fog data offset writer.Seek((int)start + 104, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); FogIO.Write(writer, m_FogBlock); curOffset = writer.BaseStream.Position; // alpha compare offset writer.Seek((int)start + 108, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); AlphaCompareIO.Write(writer, m_AlphaCompBlock); curOffset = writer.BaseStream.Position; // blend data offset writer.Seek((int)start + 112, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); BlendModeIO.Write(writer, m_blendModeBlock); curOffset = writer.BaseStream.Position; // zmode data offset writer.Seek((int)start + 116, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); ZModeIO.Write(writer, m_zModeBlock); curOffset = writer.BaseStream.Position; // z comp loc data offset writer.Seek((int)start + 120, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); foreach (bool bol in m_zCompLocBlock) { writer.Write(bol); } StreamUtility.PadStreamWithStringByOffset(writer, (int)(writer.BaseStream.Position - curOffset), 4); curOffset = writer.BaseStream.Position; if (m_ditherBlock != null) { // dither data offset writer.Seek((int)start + 124, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); foreach (bool bol in m_ditherBlock) { writer.Write(bol); } StreamUtility.PadStreamWithStringByOffset(writer, (int)(writer.BaseStream.Position - curOffset), 4); } curOffset = writer.BaseStream.Position; // NBT Scale data offset writer.Seek((int)start + 128, System.IO.SeekOrigin.Begin); writer.Write((int)(curOffset - start)); writer.Seek((int)curOffset, System.IO.SeekOrigin.Begin); NBTScaleIO.Write(writer, m_NBTScaleBlock); StreamUtility.PadStreamWithString(writer, 32); long end = writer.BaseStream.Position; long length = (end - start); writer.Seek((int)start + 4, System.IO.SeekOrigin.Begin); writer.Write((int)length); writer.Seek((int)end, System.IO.SeekOrigin.Begin); }