internal void AddData(
            MyMeshTableEntry key,
            MyVertexFormatPositionHalf4 [] positions, MyVertexFormatTexcoordNormalTangent [] vertices, uint [] indices)
        {
            var vertexOffset = (uint)m_vertexPositionList.Count;
            var indexOffset = (uint)m_indicesList.Count;

            m_vertexPositionList.AddArray(positions);
            m_vertexList.AddArray(vertices);

            var list = new List<int>();

            for (int k = 0; k < indices.Length; k += m_indexPageSize)
            {
                int iEnd = Math.Min(k + m_indexPageSize, indices.Length);

                for (int i = k; i < iEnd; i++)
                {
                    m_indicesList.Add(indices[i] + indexOffset);
                }

                list.Add(m_pagesUsed++);
            }

            if ((indices.Length % m_indexPageSize) != 0)
            {
                uint lastIndex = m_indicesList[m_indicesList.Count - 1];
                for (int i = indices.Length % m_indexPageSize; i < m_indexPageSize; i++)
                {
                    m_indicesList.Add(lastIndex);
                }
            }

            m_table.Add(key, new MyMeshTableSRV_Entry { Pages = list });
        }
예제 #2
0
        internal void AddData(
            MyMeshTableEntry key,
            MyVertexFormatPositionHalf4 [] positions, MyVertexFormatTexcoordNormalTangent [] vertices, uint [] indices)
        {
            var vertexOffset = (uint)m_vertexPositionList.Count;
            var indexOffset  = (uint)m_indicesList.Count;

            m_vertexPositionList.AddArray(positions);
            m_vertexList.AddArray(vertices);

            var list = new List <int>();

            for (int k = 0; k < indices.Length; k += m_indexPageSize)
            {
                int iEnd = Math.Min(k + m_indexPageSize, indices.Length);

                for (int i = k; i < iEnd; i++)
                {
                    m_indicesList.Add(indices[i] + indexOffset);
                }

                list.Add(m_pagesUsed++);
            }

            if ((indices.Length % m_indexPageSize) != 0)
            {
                uint lastIndex = m_indicesList[m_indicesList.Count - 1];
                for (int i = indices.Length % m_indexPageSize; i < m_indexPageSize; i++)
                {
                    m_indicesList.Add(lastIndex);
                }
            }

            m_table.Add(key, new MyMeshTableSRV_Entry {
                Pages = list
            });
        }
예제 #3
0
 internal bool ContainsKey(MyMeshTableEntry key)
 {
     return m_table.ContainsKey(key);
 }
예제 #4
0
        internal unsafe void AddMesh(MeshId model)
        {
            Debug.Assert(IsMergable(model));

            var key = new MyMeshTableEntry { Model = model, Lod = 0, Part = 0 };
            if (!ContainsKey(key))
            {
                var vertexOffset = m_vertices;
                var indexOffset = m_indices;

                var mesh = MyMeshes.GetLodMesh(model, 0);
                Debug.Assert(mesh.Info.Data.IndicesFmt == SharpDX.DXGI.Format.R16_UInt);

                var meshInfo = mesh.Info;
                var data = meshInfo.Data;

                int verticesCapacity = vertexOffset + meshInfo.VerticesNum;
                int indicesCapacity = CalculateIndicesCapacity(indexOffset, meshInfo.IndicesNum);

                m_vertices = verticesCapacity;
                m_indices = indicesCapacity;

                MyArrayHelpers.Reserve(ref m_vertexStream0, verticesCapacity * Stride0, 1024 * 1024);
                MyArrayHelpers.Reserve(ref m_vertexStream1, verticesCapacity * Stride1, 1024 * 1024);
                MyArrayHelpers.Reserve(ref m_indexStream, indicesCapacity * IndexStride, 1024 * 1024);

                var list = new List<int>();

                fixed(byte* src = data.VertexStream0, dst_ = m_vertexStream0)
                {
                    byte* dst = dst_ + data.Stride0 * vertexOffset;
                    SharpDX.Utilities.CopyMemory(new IntPtr(dst), new IntPtr(src), data.Stride0 * meshInfo.VerticesNum);
                }
                fixed (byte* src = data.VertexStream1, dst_ = m_vertexStream1)
                {
                    byte* dst = dst_ + data.Stride1 * vertexOffset;
                    SharpDX.Utilities.CopyMemory(new IntPtr(dst), new IntPtr(src), data.Stride1 * meshInfo.VerticesNum);
                }

                fixed (void* dst = m_indexStream)
                {
                    uint* stream = (uint*) dst;
                    stream += indexOffset;
                    fixed(void* src = data.Indices)
                    {
                        ushort* indices = (ushort*)src;
                        for (int k = 0; k < meshInfo.IndicesNum; k += m_indexPageSize)
                        {
                            int iEnd = Math.Min(k + m_indexPageSize, meshInfo.IndicesNum);

                            for (int i = k; i < iEnd; i++)
                            {
                                stream[i] = (uint) (indices[i] + vertexOffset);
                            }

                            list.Add(m_pagesUsed++);
                        }

                        if ((meshInfo.IndicesNum % m_indexPageSize) != 0)
                        {
                            var pageIndex = meshInfo.IndicesNum / m_indexPageSize;
                            var pageOffset = meshInfo.IndicesNum % m_indexPageSize;
                            uint lastIndex = stream[pageIndex * m_indexPageSize + pageOffset - 1];
                            for (int i = pageOffset; i < m_indexPageSize; i++)
                            {
                                stream[pageIndex * m_indexPageSize + i] = lastIndex;
                            }
                        }
                    }
                }

                m_table.Add(key, new MyMeshTableSrv_Entry { Pages = list });
                m_dirty = true;
            }
        }
예제 #5
0
 internal List<int> Pages(MyMeshTableEntry key)
 {
     return m_table.Get(key).Pages;
 }
예제 #6
0
 internal bool ContainsKey(MyMeshTableEntry key)
 {
     return(m_table.ContainsKey(key));
 }
예제 #7
0
        internal unsafe void AddMesh(MeshId model)
        {
            Debug.Assert(IsMergable(model));

            var key = new MyMeshTableEntry {
                Model = model, Lod = 0, Part = 0
            };

            if (!ContainsKey(key))
            {
                var vertexOffset = m_vertices;
                var indexOffset  = m_indices;

                var mesh = MyMeshes.GetLodMesh(model, 0);
                Debug.Assert(mesh.Info.Data.IndicesFmt == SharpDX.DXGI.Format.R16_UInt);

                var meshInfo = mesh.Info;
                var data     = meshInfo.Data;

                int verticesCapacity = vertexOffset + meshInfo.VerticesNum;
                int indicesCapacity  = CalculateIndicesCapacity(indexOffset, meshInfo.IndicesNum);

                m_vertices = verticesCapacity;
                m_indices  = indicesCapacity;

                MyArrayHelpers.Reserve(ref m_vertexStream0, verticesCapacity * Stride0, 1024 * 1024);
                MyArrayHelpers.Reserve(ref m_vertexStream1, verticesCapacity * Stride1, 1024 * 1024);
                MyArrayHelpers.Reserve(ref m_indexStream, indicesCapacity * IndexStride, 1024 * 1024);

                var list = new List <int>();

                fixed(byte *src = data.VertexStream0, dst_ = m_vertexStream0)
                {
                    byte *dst = dst_ + data.Stride0 * vertexOffset;

                    SharpDX.Utilities.CopyMemory(new IntPtr(dst), new IntPtr(src), data.Stride0 * meshInfo.VerticesNum);
                }

                fixed(byte *src = data.VertexStream1, dst_ = m_vertexStream1)
                {
                    byte *dst = dst_ + data.Stride1 * vertexOffset;

                    SharpDX.Utilities.CopyMemory(new IntPtr(dst), new IntPtr(src), data.Stride1 * meshInfo.VerticesNum);
                }

                fixed(void *dst = m_indexStream)
                {
                    uint *stream = (uint *)dst;

                    stream += indexOffset;
                    fixed(void *src = data.Indices)
                    {
                        ushort *indices = (ushort *)src;

                        for (int k = 0; k < meshInfo.IndicesNum; k += m_indexPageSize)
                        {
                            int iEnd = Math.Min(k + m_indexPageSize, meshInfo.IndicesNum);

                            for (int i = k; i < iEnd; i++)
                            {
                                stream[i] = (uint)(indices[i] + vertexOffset);
                            }

                            list.Add(m_pagesUsed++);
                        }

                        if ((meshInfo.IndicesNum % m_indexPageSize) != 0)
                        {
                            var  pageIndex  = meshInfo.IndicesNum / m_indexPageSize;
                            var  pageOffset = meshInfo.IndicesNum % m_indexPageSize;
                            uint lastIndex  = stream[pageIndex * m_indexPageSize + pageOffset - 1];
                            for (int i = pageOffset; i < m_indexPageSize; i++)
                            {
                                stream[pageIndex * m_indexPageSize + i] = lastIndex;
                            }
                        }
                    }
                }

                m_table.Add(key, new MyMeshTableSrv_Entry {
                    Pages = list
                });
                m_dirty = true;
            }
        }
예제 #8
0
 internal List <int> Pages(MyMeshTableEntry key)
 {
     return(m_table.Get(key).Pages);
 }
예제 #9
0
 internal List <int> Pages(MyMeshTableEntry key)
 {
     return(m_table[key].Pages);
 }