Пример #1
0
        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)));
            }
        }
Пример #2
0
        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;
        }
Пример #3
0
        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;
        }
Пример #4
0
        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);
            }
        }