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; } }
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++; }
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++; }
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); } }