| 743 | } |
| 744 | |
| 745 | void Tr2DebugRenderer::Pick( EvePendingPickingReadback& readback, bool synchronize, Tr2RenderContext& renderContext ) |
| 746 | { |
| 747 | auto shader = m_pickingEffect->GetShaderStateInterface(); |
| 748 | if( !shader ) |
| 749 | { |
| 750 | return; |
| 751 | } |
| 752 | if( m_objectLineOffsets.empty() && m_objectTriangleOffsets.empty() ) |
| 753 | { |
| 754 | return; |
| 755 | } |
| 756 | |
| 757 | Tr2PickBuffer& pickBuffer = readback.m_debugPickBuffer; |
| 758 | pickBuffer.SetClearColor( 0 ); |
| 759 | pickBuffer.PrepareResources(); |
| 760 | |
| 761 | if( !pickBuffer.BeginRendering( 0.f, renderContext ) ) |
| 762 | { |
| 763 | return; |
| 764 | } |
| 765 | |
| 766 | auto handle = GetVertexDeclarationHandle( renderContext ); |
| 767 | |
| 768 | shader->ApplyAllStateForPass( 0, 0, renderContext ); |
| 769 | m_pickingEffect->ApplyMaterialDataForPass( 0, 0, renderContext ); |
| 770 | renderContext.m_esm.ApplyVertexDeclaration( handle ); |
| 771 | |
| 772 | if( !m_objectLineOffsets.empty() ) |
| 773 | { |
| 774 | |
| 775 | std::vector<Tr2DebugObjectReference>& lineObjects = readback.m_debugLineObjects; |
| 776 | lineObjects.reserve( m_objectLineOffsets.size() ); |
| 777 | |
| 778 | renderContext.SetTopology( Tr2RenderContextEnum::TOP_LINES ); |
| 779 | |
| 780 | for( size_t i = 0; i < m_objectLineOffsets.size(); ++i ) |
| 781 | { |
| 782 | auto object = m_objectLineOffsets[i].first; |
| 783 | |
| 784 | lineObjects.push_back( object ); |
| 785 | |
| 786 | if( !object ) |
| 787 | { |
| 788 | continue; |
| 789 | } |
| 790 | auto begin = m_objectLineOffsets[i].second; |
| 791 | auto end = i + 1 < m_objectLineOffsets.size() ? m_objectLineOffsets[i + 1].second : m_lines.size(); |
| 792 | renderContext.DrawPrimitiveUP( uint32_t( ( end - begin ) / 2 ), &m_lines[begin], uint32_t( sizeof( Vertex ) ) ); |
| 793 | } |
| 794 | } |
| 795 | |
| 796 | if( !m_objectTriangleOffsets.empty() ) |
| 797 | { |
| 798 | |
| 799 | std::vector<Tr2DebugObjectReference>& triangleObjects = readback.m_debugTriangleObjects; |
| 800 | triangleObjects.reserve( m_objectTriangleOffsets.size() ); |
| 801 | |
| 802 | renderContext.SetTopology( Tr2RenderContextEnum::TOP_TRIANGLES ); |
no test coverage detected