internal Mesh(BinaryReaderEx br, List <Material> materials, int dataOffset) { Dynamic = br.ReadBoolean(); MaterialIndex = br.ReadByte(); Unk02 = br.ReadBoolean(); Unk03 = br.ReadByte(); int vertexIndexCount = br.ReadInt32(); int vertexCount = br.ReadInt32(); DefaultBoneIndex = br.ReadInt16(); BoneIndices = br.ReadInt16s(28); br.AssertInt16(0); br.AssertInt32(vertexIndexCount * 2); int vertexIndicesOffset = br.ReadInt32(); int bufferSize = br.ReadInt32(); int bufferOffset = br.ReadInt32(); br.ReadInt32(); // Buffers header offset br.AssertInt32(0); br.AssertInt32(0); VertexIndices = br.GetUInt16s(dataOffset + vertexIndicesOffset, vertexIndexCount); br.StepIn(dataOffset + bufferOffset); { BufferLayout layout = null; foreach (var bl in materials[MaterialIndex].Layouts) { if (bl.Size * vertexCount == bufferSize) { layout = bl; } } float uvFactor = 1024; // NB hack if (!br.BigEndian) { uvFactor = 2048; } Vertices = new List <FLVER.Vertex>(vertexCount); for (int i = 0; i < vertexCount; i++) { var vert = new FLVER.Vertex(); vert.Read(br, layout, uvFactor); Vertices.Add(vert); } } br.StepOut(); }
internal Mesh(BinaryReaderEx br, FLVER0 flv, int dataOffset) { Dynamic = br.ReadByte(); MaterialIndex = br.ReadByte(); Unk02 = br.ReadBoolean(); Unk03 = br.ReadByte(); int vertexIndexCount = br.ReadInt32(); int vertexCount = br.ReadInt32(); DefaultBoneIndex = br.ReadInt16(); BoneIndices = br.ReadInt16s(28); Unk46 = br.ReadInt16(); br.ReadInt32(); // Vertex indices length int vertexIndicesOffset = br.ReadInt32(); int bufferDataLength = br.ReadInt32(); int bufferDataOffset = br.ReadInt32(); int vertexBuffersOffset1 = br.ReadInt32(); int vertexBuffersOffset2 = br.ReadInt32(); br.AssertInt32(0); if (flv.VertexIndexSize == 16) { VertexIndices = new List <int>(vertexCount); foreach (ushort index in br.GetUInt16s(dataOffset + vertexIndicesOffset, vertexIndexCount)) { VertexIndices.Add(index); } } else if (flv.VertexIndexSize == 32) { VertexIndices = new List <int>(br.GetInt32s(dataOffset + vertexIndicesOffset, vertexIndexCount)); } VertexBuffer buffer; // Stupid hack for old (version F?) flvers; for example DeS o9993. if (vertexBuffersOffset1 == 0) { buffer = new VertexBuffer() { BufferLength = bufferDataLength, BufferOffset = bufferDataOffset, LayoutIndex = 0, }; } else { br.StepIn(vertexBuffersOffset1); { List <VertexBuffer> vertexBuffers1 = VertexBuffer.ReadVertexBuffers(br); if (vertexBuffers1.Count == 0) { throw new NotSupportedException("First vertex buffer list is expected to contain at least 1 buffer."); } for (int i = 1; i < vertexBuffers1.Count; i++) { if (vertexBuffers1[i].BufferLength != 0) { throw new NotSupportedException("Vertex buffers after the first one in the first buffer list are expected to be empty."); } } buffer = vertexBuffers1[0]; } br.StepOut(); } if (vertexBuffersOffset2 != 0) { br.StepIn(vertexBuffersOffset2); { List <VertexBuffer> vertexBuffers2 = VertexBuffer.ReadVertexBuffers(br); if (vertexBuffers2.Count != 0) { throw new NotSupportedException("Second vertex buffer list is expected to contain exactly 0 buffers."); } } br.StepOut(); } br.StepIn(dataOffset + buffer.BufferOffset); { LayoutIndex = buffer.LayoutIndex; BufferLayout layout = flv.Materials[MaterialIndex].Layouts[LayoutIndex]; float uvFactor = 1024; // NB hack if (!br.BigEndian) { uvFactor = 2048; } Vertices = new List <FLVER.Vertex>(vertexCount); for (int i = 0; i < vertexCount; i++) { var vert = new FLVER.Vertex(); vert.Read(br, layout, uvFactor); Vertices.Add(vert); } } br.StepOut(); }