Example #1
0
 public VertexBufferImp(int[] buffer, VertexBufferDesc description) : base(buffer)
 {
     this.Description = description;
 }
Example #2
0
        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
                }
            }
        }