コード例 #1
0
        private void CreateIndexBuffer(int triangleCount)
        {
            int indexSize = sizeof(int);

            if (m_indexBuffer == null || m_indexBuffer.Description.Size < triangleCount * 3 * indexSize)
            {
                if (m_indexBuffer != null)
                {
                    m_indexBuffer.Dispose();
                }

                m_indexBuffer = new IndexBuffer(MyRender.GraphicsDevice, triangleCount * 3 * indexSize, Usage.WriteOnly, Pool.Default, false);
            }

            int indexOffset = 0;

            m_meshes.Clear();
            foreach (var pair in m_materialGroups)
            {
                var mesh = new MyRenderGroup()
                {
                    IndexStart = indexOffset, Material = pair.Key
                };

                foreach (var meshInfo in pair.Value)
                {
                    // Copy indices
                    var compoundIb = m_indexBuffer.Lock(indexOffset * indexSize, meshInfo.Mesh.TriCount * 3 * indexSize, LockFlags.None);

                    var format = meshInfo.Model.IndexBuffer.Description.Format;
                    Debug.Assert(format == Format.Index16 || format == Format.Index32);
                    int modelIndexSize = format == Format.Index16 ? sizeof(short) : sizeof(int);
                    var modelIb        = meshInfo.Model.IndexBuffer.Lock(meshInfo.Mesh.IndexStart * modelIndexSize, meshInfo.Mesh.TriCount * 3 * modelIndexSize, LockFlags.ReadOnly);

                    while (modelIb.RemainingLength > 0)
                    {
                        if (format == Format.Index16)
                        {
                            int index = modelIb.Read <short>() + meshInfo.VertexOffset;
                            compoundIb.Write(index);
                        }
                        else
                        {
                            int index = modelIb.Read <int>() + meshInfo.VertexOffset;
                            compoundIb.Write(index);
                        }
                    }
                    m_indexBuffer.Unlock();
                    meshInfo.Model.IndexBuffer.Unlock();

                    mesh.TriangleCount += meshInfo.Mesh.TriCount;
                    indexOffset        += meshInfo.Mesh.TriCount * 3;
                }

                m_meshes.Add(mesh);
            }
        }
コード例 #2
0
        private void CreateIndexBuffer(int triangleCount)
        {
            int indexSize = sizeof(int);
            if (m_indexBuffer == null || m_indexBuffer.Description.Size < triangleCount * 3 * indexSize)
            {
                if (m_indexBuffer != null)
                    m_indexBuffer.Dispose();

                m_indexBuffer = new IndexBuffer(MyRender.GraphicsDevice, triangleCount * 3 * indexSize, Usage.WriteOnly, Pool.Default, false);
            }

            int indexOffset = 0;
            m_meshes.Clear();
            foreach (var pair in m_materialGroups)
            {
                var mesh = new MyRenderGroup() { IndexStart = indexOffset, Material = pair.Key };

                foreach (var meshInfo in pair.Value)
                {
                    // Copy indices
                    var compoundIb = m_indexBuffer.Lock(indexOffset * indexSize, meshInfo.Mesh.TriCount * 3 * indexSize, LockFlags.None);

                    var format = meshInfo.Model.IndexBuffer.Description.Format;
                    Debug.Assert(format == Format.Index16 || format == Format.Index32);
                    int modelIndexSize = format == Format.Index16 ? sizeof(short) : sizeof(int);
                    var modelIb = meshInfo.Model.IndexBuffer.Lock(meshInfo.Mesh.IndexStart * modelIndexSize, meshInfo.Mesh.TriCount * 3 * modelIndexSize, LockFlags.ReadOnly);

                    while (modelIb.RemainingLength > 0)
                    {
                        if (format == Format.Index16)
                        {
                            int index = modelIb.Read<short>() + meshInfo.VertexOffset;
                            compoundIb.Write(index);
                        }
                        else
                        {
                            int index = modelIb.Read<int>() + meshInfo.VertexOffset;
                            compoundIb.Write(index);
                        }
                    }
                    m_indexBuffer.Unlock();
                    meshInfo.Model.IndexBuffer.Unlock();

                    mesh.TriangleCount += meshInfo.Mesh.TriCount;
                    indexOffset += meshInfo.Mesh.TriCount * 3;
                }

                m_meshes.Add(mesh);
            }
        }