public VertexBufferImp(int[] buffer, VertexBufferDesc description) : base(buffer) { this.Description = description; }
private void Setup(LmGeometry geometry) { // Create index buffer var indexBufferDescription = new IndexBufferDesc(geometry.IdxBufferSize, geometry.IdxType); this.IndexBuffer = new IndexBuffer(geometry.IdxBuffer, indexBufferDescription); // Create vertex buffers this.VertexCount = geometry.VtxNum; this.TotalTriangleCount = geometry.IdxNum / 3; this.TriangleCount = this.VertexCount; var meshVertexDeclaration = new MeshVertexDeclaration(); var readFunctions = MakeReadFunctions(); for (byte i = 0; i < geometry.VtxStreamGroupDesc.VtxStreamDescs.Count; i++) { var vtxStreamDesc = geometry.VtxStreamGroupDesc.VtxStreamDescs[i]; var structuredVBDesc = vtxStreamDesc.StructuredVBDesc; var vtxBufferDesc = new VertexBufferDesc(structuredVBDesc.Stride * this.VertexCount); // Ugly hack var vtxBuffer = new VertexBuffer(null, vtxBufferDesc); // new VertexBuffer(new ArraySegment<byte>(geometry.VtxBuffer, (int)structuredVBDesc.StartOffset, (int)vtxBufferDesc.Size), vtxBufferDesc); this.VertexBuffers.Add(vtxBuffer); if (i >= 8) { DefaultPrintFunction.Write("i<EBONY_COUNTOF(this->bufferStrides)"); } // Add vertex elements foreach (var vtxElementDesc in structuredVBDesc.VtxElementDescs) { var usage = LmVertexElementDesc.GetUsageFromSemantic(vtxElementDesc.Semantic); var size = LmVertexElementDesc.FormatToVertexComponentCount(vtxElementDesc.Format); var type = LmVertexElementDesc.FormatToVertexType(vtxElementDesc.Format); var vertexElement = new VertexElement(i, type, usage, 0, (ushort)vtxElementDesc.Offset, (ushort)size, vtxElementDesc.Semantic, 0); meshVertexDeclaration.AddVertexElement(vertexElement, vtxBuffer); } // Parse vertex buffer //var vertexElementArrays = new Dictionary<string, IList>(); foreach (var vtxElementDesc in structuredVBDesc.VtxElementDescs) { var values = CreateVertexElementArray(vtxElementDesc.Format); VertexElementArrays.Add(vtxElementDesc.Semantic, values); } var vertexBufferPosition = (int)structuredVBDesc.StartOffset; for (var j = 0; j < vtxBufferDesc.Size / structuredVBDesc.Stride; j++) { foreach (var vtxElementDesc in structuredVBDesc.VtxElementDescs) { var readFunction = readFunctions[vtxElementDesc.Format]; var size = LmVertexElementDesc.FormatToVertexComponentCount(vtxElementDesc.Format); for (var _ = 0; _ < size; _++) { var value = readFunction(geometry.VtxBuffer, vertexBufferPosition, out int componentSize); VertexElementArrays[vtxElementDesc.Semantic].Add(value); vertexBufferPosition += componentSize; } } } this.MainStreamSet = meshVertexDeclaration; this.BoneInstanceCount = geometry.InstanceNum; if (this.BoneInstanceCount != 0) { // TODO instance buffer } } }