コード例 #1
0
        virtual public void AddInstance(Matrix worldTrans, Color4 color)
        {
            // hlsl is column-major memory layout, so we must transpose matrix
            m_instanceMainVtxConst[m_nextInstanceIndex] = new _VertexShaderConst_Main()
            {
                worldMat = Matrix.Transpose(worldTrans)
            };
            m_instanceMainPixConst[m_nextInstanceIndex] = new _PixelShaderConst_Main()
            {
                instanceColor = color
            };

            m_nextInstanceIndex++;
            if (m_nextInstanceIndex == m_maxInstanceCount)
            {
                // update vertex shader resouce
                m_context.UpdateSubresource <_VertexShaderConst_Main>(m_instanceMainVtxConst, m_mainVtxConst);

                // update pixel shader resouce
                m_context.UpdateSubresource <_PixelShaderConst_Main>(m_instanceMainPixConst, m_mainPixConst);

                // low performance @todo
                for (int i = 0; i < m_tmpBoneMatrices.Length; ++i)
                {
                    m_tmpBoneMatrices[i] = Matrix.Identity;
                }
                m_context.UpdateSubresource <Matrix>(m_tmpBoneMatrices, m_boneVtxConst);

                // draw
                m_context.DrawInstanced(m_lastVertexCount, m_nextInstanceIndex, 0, 0);
                m_drawCallCount++;

                m_nextInstanceIndex = 0;
            }
        }
コード例 #2
0
        virtual public void DrawDebugModel(Matrix worldTrans, DrawSystem.MeshData mesh, DrawSystem.RenderMode renderMode)
        {
            _SetModelParams(mesh, null, renderMode);

            // update vertex shader resouce
            {
                var vdata = new _VertexShaderConst_Main()
                {
                    // hlsl is column-major memory layout, so we must transpose matrix
                    worldMat = Matrix.Transpose(worldTrans),
                };
                m_context.UpdateSubresource(ref vdata, m_mainVtxConst);
            }

            // update pixel shader resouce
            {
                var pdata = new _PixelShaderConst_Main()
                {
                    instanceColor = Color4.White,
                };
                m_context.UpdateSubresource(ref pdata, m_mainPixConst);
            }

            // do not use bone matrices
            // m_context.UpdateSubresource<Matrix>(m_tmpBoneMatrices, m_boneVtxConst);

            // draw
            m_context.Draw(mesh.VertexCount, 0);
            m_drawCallCount++;
        }
コード例 #3
0
        virtual public void DrawModel(Matrix worldTrans, Color4 color, DrawSystem.MeshData mesh, MaterialBase material, DrawSystem.RenderMode renderMode, Matrix[] boneMatrices)
        {
            _SetModelParams(mesh, material, renderMode);

            // update vertex shader resouce
            var vdata = new _VertexShaderConst_Main()
            {
                // hlsl is column-major memory layout, so we must transpose matrix
                worldMat = Matrix.Transpose(worldTrans),
            };

            m_context.UpdateSubresource(ref vdata, m_mainVtxConst);

            // update pixel shader resouce
            var pdata = new _PixelShaderConst_Main()
            {
                instanceColor = color
            };

            m_context.UpdateSubresource(ref pdata, m_mainPixConst);

            // update a bone constant buffer
            if (boneMatrices != null)
            {
                // UpdateSubresouce supports only to upate entire of resource.
                // so, we must copy boneMatrices to m_tmpBoneMatrices.
                // It seems inefficient. we search for better solutions.

                Debug.Assert(boneMatrices.Length <= m_tmpBoneMatrices.Length);
                for (int i = 0; i < boneMatrices.Length; ++i)
                {
                    m_tmpBoneMatrices[i] = boneMatrices[i];
                    m_tmpBoneMatrices[i].Transpose();
                }

                m_context.UpdateSubresource <Matrix>(m_tmpBoneMatrices, m_boneVtxConst);
            }
            else
            {
                // low performance @todo
                for (int i = 0; i < m_tmpBoneMatrices.Length; ++i)
                {
                    m_tmpBoneMatrices[i] = Matrix.Identity;
                }

                m_context.UpdateSubresource <Matrix>(m_tmpBoneMatrices, m_boneVtxConst);
            }

            // draw
            m_context.Draw(mesh.VertexCount, 0);
            m_drawCallCount++;
        }
コード例 #4
0
        public DrawContext(DeviceContext context, CommonInitParam initParam)
        {
            m_initParam = initParam;
            m_context   = context;

            var d3d = m_initParam.D3D;

            m_mainVtxConst         = DrawUtil.CreateConstantBuffer <_VertexShaderConst_Main>(d3d, m_maxInstanceCount);
            m_boneVtxConst         = DrawUtil.CreateConstantBuffer(d3d, Utilities.SizeOf <Matrix>() * MaxBoneMatrices);
            m_modelVtxConst        = DrawUtil.CreateConstantBuffer <_VertexShaderConst_Model>(d3d, 1);
            m_mainPixConst         = DrawUtil.CreateConstantBuffer <_PixelShaderConst_Main>(d3d, m_maxInstanceCount);
            m_modelPixConst        = DrawUtil.CreateConstantBuffer <_PixelShaderConst_Model>(d3d, 1);
            m_modelMinimapPixConst = DrawUtil.CreateConstantBuffer <_PixelShaderConst_ModelMinimap>(d3d, 1);

            m_instanceMainVtxConst = new _VertexShaderConst_Main[m_maxInstanceCount];
            m_instanceMainPixConst = new _PixelShaderConst_Main[m_maxInstanceCount];

            m_lastTextureSlots = new _TextureSlot[2];
            for (int index = 0; index < m_lastTextureSlots.Count(); ++index)
            {
                m_lastTextureSlots[index] = _TextureSlot.Create(index);
            }
        }