| 314 | } |
| 315 | |
| 316 | std::vector<ViewportGL::PickColor> ViewportGL::pickObjectsInRect_( const PickParameters& params, const Box2i& rect ) const |
| 317 | { |
| 318 | MR_TIMER; |
| 319 | Vector2i size; |
| 320 | std::vector<PickColor> resColors; |
| 321 | if ( rect.valid() ) |
| 322 | { |
| 323 | size = rect.size() + Vector2i::diagonal( 1 ); |
| 324 | resColors.resize( size.x * size.y ); |
| 325 | } |
| 326 | |
| 327 | int width = params.baseRenderParams.viewport.z; |
| 328 | int height = params.baseRenderParams.viewport.w; |
| 329 | |
| 330 | pickFBO_.resize( { width,height } ); |
| 331 | |
| 332 | pickFBO_.bind( false ); |
| 333 | |
| 334 | // Clear the buffer |
| 335 | |
| 336 | if ( rect.valid() ) |
| 337 | { |
| 338 | GL_EXEC( glScissor( rect.min.x, height - rect.max.y - 1, size.x, size.y ) ); |
| 339 | GL_EXEC( glEnable( GL_SCISSOR_TEST ) ); |
| 340 | } |
| 341 | |
| 342 | unsigned int cClearValue[4] = { 0xffffffff,0xffffffff,0xffffffff,0xffffffff }; |
| 343 | GL_EXEC( glClearBufferuiv( GL_COLOR, 0, cClearValue ) ); |
| 344 | GL_EXEC( glClear( GL_DEPTH_BUFFER_BIT ) ); |
| 345 | // Save old viewport |
| 346 | |
| 347 | //draw |
| 348 | GL_EXEC( glDisable( GL_BLEND ) ); |
| 349 | GL_EXEC( glEnable( GL_DEPTH_TEST ) ); |
| 350 | |
| 351 | for ( unsigned i = 0; i < params.renderVector.size(); ++i ) |
| 352 | { |
| 353 | auto& objPtr = params.renderVector[i]; |
| 354 | if ( !objPtr ) |
| 355 | continue; |
| 356 | auto& obj = *objPtr; |
| 357 | auto modelTemp = Matrix4f( obj.worldXf( params.baseRenderParams.viewportId ) ); |
| 358 | obj.renderForPicker( { |
| 359 | params.baseRenderParams, |
| 360 | modelTemp, |
| 361 | params.clippingPlane }, i ); |
| 362 | } |
| 363 | pickFBO_.bind( true ); |
| 364 | |
| 365 | if ( rect.valid() ) |
| 366 | { |
| 367 | // read data from gpu |
| 368 | Timer t( "glReadPixels" ); |
| 369 | GL_EXEC( glReadPixels( rect.min.x, height - rect.max.y - 1, size.x, size.y, GL_RGBA_INTEGER, GL_UNSIGNED_INT, resColors.data() ) ); |
| 370 | } |
| 371 | // Clean up |
| 372 | GL_EXEC( glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0 ) ); |
| 373 | GL_EXEC( glBindFramebuffer( GL_READ_FRAMEBUFFER, 0 ) ); |