internal static void TestModel(MyMesh mesh) { if (m_test == null) { m_test = new MyMergeInstancing(); m_test.m_rootMaterial = MyAssetsLoader.GetModel("Models//Cubes//Large//StoneCube.mwm").LODs[0].m_meshInfo.m_submeshes[MyMesh.DEFAULT_MESH_TECHNIQUE][0].Material; } if (m_test.IsMergable(mesh)) { Debug.WriteLine(String.Format("{0} mergable: {1}", mesh.Name, m_test.IsMergable(mesh))); } }
internal override void AddMesh(string mesh) { if (m_includedMeshes.Get(mesh) != null) { return; } var meshInfo = MyAssetsLoader.GetModel(mesh).LODs[0].m_meshInfo; var indices = meshInfo.Indices; List <int> meshPages = new List <int>(); uint indexOffset = (uint)m_vertexPositionList.Count; for (int v = 0; v < meshInfo.VertexPositions.Length; v++) { m_vertexPositionList.Add(meshInfo.VertexPositions[v]); m_vertexNormalList.Add(meshInfo.VertexExtendedData[v]); } for (int k = 0; k < indices.Length; k += m_pageSize) { int iEnd = Math.Min(k + m_pageSize, indices.Length); for (int i = k; i < iEnd; i++) { m_indicesList.Add(indices[i] + indexOffset); } meshPages.Add(m_pagesUsed++); } if ((indices.Length % m_pageSize) != 0) { uint lastIndex = m_indicesList[m_indicesList.Count - 1]; for (int i = indices.Length % m_pageSize; i < m_pageSize; i++) { m_indicesList.Add(lastIndex); } } m_includedMeshes[mesh] = meshPages; }
internal override void AddMesh(string mesh) { if (m_includedMeshes.Get(mesh) != null) { return; } var meshInfo = MyAssetsLoader.GetModel(mesh).LODs[0].m_meshInfo; var indices = meshInfo.Indices; List <int> meshPages = new List <int>(); for (int k = 0; k < indices.Length; k += m_pageSize) { int iEnd = Math.Min(k + m_pageSize, indices.Length); for (int i = k; i < iEnd; i++) { m_vertexPositionList.Add(meshInfo.VertexPositions[indices[i]]); m_vertexNormalList.Add(meshInfo.VertexExtendedData[indices[i]]); } meshPages.Add(m_pagesUsed++); } if ((indices.Length % m_pageSize) != 0) { // add degenerate triangles for (int i = indices.Length % m_pageSize; i < m_pageSize; i++) { m_vertexPositionList.Add(new MyVertexFormatPositionHalf4()); m_vertexNormalList.Add(new MyVertexFormatTexcoordNormalTangent()); } } m_includedMeshes[mesh] = meshPages; }
internal override void Draw() { var RC = MyImmediateRC.RC; RC.Context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList; var mapping = MyMapping.MapDiscard(RC.Context, MyCommon.ProjectionConstants.Buffer); mapping.stream.Write(Matrix.Transpose(MyEnvironment.ViewProjection)); mapping.Unmap(); RC.Context.Rasterizer.SetViewport(0, 0, MyRender.ViewportResolution.X, MyRender.ViewportResolution.Y); RC.Context.PixelShader.SetSamplers(0, MyRender.StandardSamplers); RC.SetCB(MyCommon.FRAME_SLOT, MyCommon.FrameConstants.Buffer); RC.SetCB(MyCommon.PROJECTION_SLOT, MyCommon.ProjectionConstants.Buffer); RC.SetVS(m_vs); RC.SetPS(m_ps); RC.SetIL(m_inputLayout); RC.BindGBufferForWrite(MyGBuffer.Main); foreach (var m in m_meshes) { RC.BindRawSRV(0, m.Value.m_instanceBuffer.m_SRV); var meshInfo = MyAssetsLoader.GetModel(m.Key).LODs[0].m_meshInfo; RC.SetVB(meshInfo.VB.Select(x => x.Buffer).ToArray(), meshInfo.VB.Select(x => x.Stride).ToArray()); RC.SetIB(meshInfo.IB.Buffer, meshInfo.IB.Format); RC.Context.DrawIndexedInstanced(meshInfo.IndicesNum, m.Value.instancesCounter, 0, 0, 0); } }