MCPcopy Create free account
hub / github.com/MeshInspector/MeshLib / pickObjectsInRect_

Method pickObjectsInRect_

source/MRViewer/MRViewportGL.cpp:316–383  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

314}
315
316std::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 ) );

Callers

nothing calls this directly

Calls 8

diagonalFunction · 0.85
worldXfMethod · 0.80
renderForPickerMethod · 0.80
validMethod · 0.45
sizeMethod · 0.45
resizeMethod · 0.45
bindMethod · 0.45
dataMethod · 0.45

Tested by

no test coverage detected