void SetIndices(MLOD mlod, s3pi.GenericRCOLResource.GenericRCOLResource.ChunkReference myIBI, Int32 beforeLength, Int32 afterPos, Int32[] indices) { Int32[] before = new Int32[beforeLength]; Array.Copy(mBuffer, 0, before, 0, before.Length); Int32[] after = new Int32[mBuffer.Length - afterPos]; Array.Copy(mBuffer, afterPos, after, 0, after.Length); mBuffer = new Int32[before.Length + indices.Length + after.Length]; Array.Copy(before, 0, mBuffer, 0, before.Length); Array.Copy(indices, 0, mBuffer, before.Length, indices.Length); Array.Copy(after, 0, mBuffer, before.Length + indices.Length, after.Length); int offset = beforeLength + indices.Length - afterPos; if (offset != 0) foreach (var m in mlod.Meshes.FindAll(m => m.IndexBufferIndex.Equals(myIBI))) if (m.StartIndex > beforeLength) { m.StartIndex += offset; foreach (var g in m.GeometryStates) if (g.StartIndex > beforeLength) g.StartIndex += offset; } }
private bool SetVertices(MLOD mlod, s3pi.GenericRCOLResource.GenericRCOLResource.ChunkReference myVBI, long beforeLength, int count, VRTF vrtf, IEnumerable<Vertex> vertices, float[] uvscales) { bool okay = true; byte[] before = new byte[beforeLength]; Array.Copy(mBuffer, before, before.Length); long afterPos = Math.Min(mBuffer.Length, beforeLength + (count * vrtf.Stride)); byte[] after = new byte[mBuffer.Length - afterPos]; Array.Copy(mBuffer, afterPos, after, 0, after.Length); long offset = 0; using (MemoryStream mg = new MemoryStream()) { if (!SetVertices(mg, vrtf, vertices, uvscales)) okay = false; offset = beforeLength + mg.Length - afterPos; mBuffer = new byte[before.Length + mg.Length + after.Length]; Array.Copy(before, mBuffer, before.Length); Array.Copy(mg.ToArray(), 0, mBuffer, before.Length, mg.Length); Array.Copy(after, 0, mBuffer, before.Length + mg.Length, after.Length); mg.Close(); } int voffset = (int)offset / vrtf.Stride; if (offset != 0) foreach (var m in mlod.Meshes.Where(m => m.VertexBufferIndex.Equals(myVBI) && m.StreamOffset > beforeLength)) { m.StreamOffset = (uint)(m.StreamOffset + offset); foreach (var g in m.GeometryStates) if (g.MinVertexIndex * vrtf.Stride > beforeLength) g.MinVertexIndex += voffset; } return okay; }
void SetIndices(MLOD mlod, s3pi.GenericRCOLResource.GenericRCOLResource.ChunkReference myIBI, ModelPrimitiveType type, Int32 startIndex, Int32 primCount, Int32[] indices) { SetIndices(mlod, myIBI, startIndex, startIndex + primCount * IndexCountFromPrimitiveType(type), indices); }