| 2517 | } |
| 2518 | |
| 2519 | Image Viewer::captureSceneScreenShot( const Vector2i& resolution, bool transparentBg /*= false*/ ) |
| 2520 | { |
| 2521 | if ( !glInitialized_ ) |
| 2522 | return {}; |
| 2523 | |
| 2524 | Vector2i newRes; |
| 2525 | newRes.x = resolution.x <= 0 ? framebufferSize.x : resolution.x; |
| 2526 | newRes.y = resolution.y <= 0 ? framebufferSize.y : resolution.y; |
| 2527 | |
| 2528 | // store old sizes |
| 2529 | auto vpBounbds = getViewportsBounds(); |
| 2530 | std::vector<ViewportRectangle> rects; |
| 2531 | std::vector<Viewport::Parameters> viewportParams; |
| 2532 | for ( auto& viewport : viewport_list ) |
| 2533 | { |
| 2534 | auto rect = viewport.getViewportRect(); |
| 2535 | rects.push_back( rect ); |
| 2536 | rect.min.x = float( rect.min.x - vpBounbds.min.x ) / width( vpBounbds ) * newRes.x; |
| 2537 | rect.min.y = float( rect.min.y - vpBounbds.min.y ) / height( vpBounbds ) * newRes.y; |
| 2538 | rect.max.x = float( rect.max.x - vpBounbds.min.x ) / width( vpBounbds ) * newRes.x; |
| 2539 | rect.max.y = float( rect.max.y - vpBounbds.min.y ) / height( vpBounbds ) * newRes.y; |
| 2540 | viewport.setViewportRect( rect ); |
| 2541 | } |
| 2542 | if ( transparentBg ) |
| 2543 | { |
| 2544 | for ( int i = 0; i < viewport_list.size(); ++i ) |
| 2545 | { |
| 2546 | auto& viewport = viewport_list[i]; |
| 2547 | viewportParams.resize( viewport_list.size() ); |
| 2548 | auto viewportParamsNew = viewport.getParameters(); |
| 2549 | viewportParams[i] = viewportParamsNew; |
| 2550 | viewportParamsNew.backgroundColor = Color::transparent(); |
| 2551 | viewportParamsNew.borderColor = Color::transparent(); |
| 2552 | viewport.setParameters( viewportParamsNew ); |
| 2553 | } |
| 2554 | } |
| 2555 | if ( newRes != framebufferSize ) |
| 2556 | { |
| 2557 | if ( alphaSorter_ ) |
| 2558 | alphaSorter_->updateTransparencyTexturesSize( newRes.x, newRes.y ); |
| 2559 | if ( depthPeeler_ ) |
| 2560 | depthPeeler_->reset( newRes ); |
| 2561 | } |
| 2562 | |
| 2563 | std::vector<Color> pixels( newRes.x * newRes.y ); |
| 2564 | |
| 2565 | FramebufferData fd; |
| 2566 | fd.gen( newRes, bool( depthPeeler_ ), -1 ); |
| 2567 | fd.bind(); |
| 2568 | |
| 2569 | setupScene(); |
| 2570 | clearFramebuffers(); |
| 2571 | drawScene( &fd ); |
| 2572 | |
| 2573 | fd.copyTextureBindDef(); |
| 2574 | fd.bindTexture( true, false ); // only bind color |
| 2575 | |
| 2576 | #ifdef __EMSCRIPTEN__ |
no test coverage detected