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 }); }
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 }); }
internal bool ContainsKey(MyMeshTableEntry key) { return m_table.ContainsKey(key); }
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; } }
internal List<int> Pages(MyMeshTableEntry key) { return m_table.Get(key).Pages; }
internal bool ContainsKey(MyMeshTableEntry key) { return(m_table.ContainsKey(key)); }
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; } }
internal List <int> Pages(MyMeshTableEntry key) { return(m_table.Get(key).Pages); }
internal List <int> Pages(MyMeshTableEntry key) { return(m_table[key].Pages); }