diff --git a/docs/reference/changelog-r2024.md b/docs/reference/changelog-r2024.md index 10f032d6647..54add51c1ef 100644 --- a/docs/reference/changelog-r2024.md +++ b/docs/reference/changelog-r2024.md @@ -20,4 +20,5 @@ Released on December **th, 2023. - Fixed invalid absolute sound file path resulted in crash ([#6593](https://github.com/cyberbotics/webots/pull/6593)) - Fixed Speaker relative sound file path not working with external controller ([#6605](https://github.com/cyberbotics/webots/pull/6605)). - Fixed the bug that when the language is Python, getTargets() cannot correctly obtain the multi-target data detected by the radar ([#6606](https://github.com/cyberbotics/webots/pull/6606)) + - Fixed incomplete loading while minimized under some windowing systems ([#6617](https://github.com/cyberbotics/webots/pull/6617)). - Fixed unitialized sliding friction when using asymmetric rolling friction ([#6618](https://github.com/cyberbotics/webots/pull/6618)). diff --git a/include/wren/scene.h b/include/wren/scene.h index 9788bbb2935..ea0d7fc1d0d 100644 --- a/include/wren/scene.h +++ b/include/wren/scene.h @@ -42,8 +42,9 @@ void wr_scene_apply_pending_updates(WrScene *scene); /* The 'materialName' parameter is optional (can be set to NULL for default), and if set, force the renderables to use the named material */ -void wr_scene_render(WrScene *scene, const char *material_name, bool culling); -void wr_scene_render_to_viewports(WrScene *scene, int count, WrViewport **viewports, const char *material_name, bool culling); +void wr_scene_render(WrScene *scene, const char *material_name, bool culling, bool offScreen); +void wr_scene_render_to_viewports(WrScene *scene, int count, WrViewport **viewports, const char *material_name, bool culling, + bool offScreen); void wr_scene_set_ambient_light(const float *ambient_light); diff --git a/src/webots/gui/WbView3D.cpp b/src/webots/gui/WbView3D.cpp index f7ce3bb2849..b60cc9bd591 100644 --- a/src/webots/gui/WbView3D.cpp +++ b/src/webots/gui/WbView3D.cpp @@ -1111,8 +1111,9 @@ void WbView3D::setWorld(WbSimulationWorld *w) { WbWrenOpenGlContext::doneWren(); - // first rendering without culling to make sure every meshes/textures are actually loaded on the GPU - renderNow(false); + // first rendering is offscreen without culling to make sure every meshes/textures are actually + // loaded on the GPU + renderNow(false, true); } void WbView3D::restoreOptionalRendering(const QStringList &enabledCenterOfMassNodeNames, @@ -1441,7 +1442,7 @@ void WbView3D::resizeWren(int width, int height) { emit resized(); } -void WbView3D::renderNow(bool culling) { +void WbView3D::renderNow(bool culling, bool offScreen) { if (!wr_gl_state_is_initialized()) initialize(); @@ -1461,7 +1462,7 @@ void WbView3D::renderNow(bool culling) { WbWrenOpenGlContext::doneWren(); } else #endif - WbWrenWindow::renderNow(culling); + WbWrenWindow::renderNow(culling, offScreen); mLastRefreshTimer.start(); emit mainRenderingEnded(mPhysicsRefresh); diff --git a/src/webots/gui/WbView3D.hpp b/src/webots/gui/WbView3D.hpp index d81d292a6c8..be3dec0bf64 100644 --- a/src/webots/gui/WbView3D.hpp +++ b/src/webots/gui/WbView3D.hpp @@ -97,7 +97,7 @@ public slots: protected slots: // cppcheck-suppress virtualCallInConstructor - void renderNow(bool culling = true) override; + void renderNow(bool culling = true, bool offScreen = false) override; protected: void initialize() override; diff --git a/src/webots/gui/WbWrenWindow.cpp b/src/webots/gui/WbWrenWindow.cpp index 0d404cd7131..44960f92495 100644 --- a/src/webots/gui/WbWrenWindow.cpp +++ b/src/webots/gui/WbWrenWindow.cpp @@ -200,8 +200,8 @@ void WbWrenWindow::renderLater() { } } -void WbWrenWindow::renderNow(bool culling) { - if (!isExposed() || !wr_gl_state_is_initialized()) +void WbWrenWindow::renderNow(bool culling, bool offScreen) { + if ((!isExposed() && !offScreen) || !wr_gl_state_is_initialized()) return; static int first = true; @@ -225,9 +225,10 @@ void WbWrenWindow::renderNow(bool culling) { WbWrenOpenGlContext::makeWrenCurrent(); - wr_scene_render(wr_scene_get_instance(), NULL, culling); + wr_scene_render(wr_scene_get_instance(), NULL, culling, offScreen); - WbWrenOpenGlContext::instance()->swapBuffers(this); + if (!offScreen) + WbWrenOpenGlContext::instance()->swapBuffers(this); WbWrenOpenGlContext::doneWren(); if (mVideoStreamingServer && mVideoStreamingServer->isNewFrameNeeded() && !first) diff --git a/src/webots/gui/WbWrenWindow.hpp b/src/webots/gui/WbWrenWindow.hpp index 9a49b17efe4..dee3c098876 100644 --- a/src/webots/gui/WbWrenWindow.hpp +++ b/src/webots/gui/WbWrenWindow.hpp @@ -65,7 +65,7 @@ public slots: protected: virtual void initialize(); - virtual void renderNow(bool culling = true); + virtual void renderNow(bool culling = true, bool offScreen = false); virtual void resizeWren(int width, int height); bool event(QEvent *event) override; diff --git a/src/webots/nodes/utils/WbVirtualRealityHeadset.cpp b/src/webots/nodes/utils/WbVirtualRealityHeadset.cpp index 07f7653fce8..9beeeb7bbad 100644 --- a/src/webots/nodes/utils/WbVirtualRealityHeadset.cpp +++ b/src/webots/nodes/utils/WbVirtualRealityHeadset.cpp @@ -406,7 +406,7 @@ void WbVirtualRealityHeadset::updateOrientationAndPosition() { if (mWrenViewports[0] && mSystem) { WbWrenOpenGlContext::makeWrenCurrent(); - wr_scene_render_to_viewports(wr_scene_get_instance(), 2, mWrenViewports, NULL, true); + wr_scene_render_to_viewports(wr_scene_get_instance(), 2, mWrenViewports, NULL, true, false); WbWrenOpenGlContext::doneWren(); vr::VRCompositor()->Submit(vr::Eye_Left, mTextureReferences[LEFT], mTextureBounds); vr::VRCompositor()->Submit(vr::Eye_Right, mTextureReferences[RIGHT], mTextureBounds); diff --git a/src/webots/wren/WbWrenCamera.cpp b/src/webots/wren/WbWrenCamera.cpp index f507904b2d1..eedf0c47c48 100644 --- a/src/webots/wren/WbWrenCamera.cpp +++ b/src/webots/wren/WbWrenCamera.cpp @@ -452,7 +452,7 @@ void WbWrenCamera::render() { else if (mType == 's') materialName = "segmentation"; wr_scene_enable_depth_reset(wr_scene_get_instance(), false); - wr_scene_render_to_viewports(wr_scene_get_instance(), numActiveViewports, mViewportsToRender, materialName, true); + wr_scene_render_to_viewports(wr_scene_get_instance(), numActiveViewports, mViewportsToRender, materialName, true, false); if (!isPlanarProjection()) applySphericalPostProcessingEffect(); diff --git a/src/webots/wren/WbWrenPicker.cpp b/src/webots/wren/WbWrenPicker.cpp index 2b78ab90c75..742051aecc8 100644 --- a/src/webots/wren/WbWrenPicker.cpp +++ b/src/webots/wren/WbWrenPicker.cpp @@ -134,7 +134,7 @@ bool WbWrenPicker::pick(int x, int y) { wr_viewport_enable_skybox(mViewport, false); wr_scene_enable_translucence(scene, false); wr_scene_enable_depth_reset(scene, false); - wr_scene_render_to_viewports(scene, 1, &mViewport, "picking", true); + wr_scene_render_to_viewports(scene, 1, &mViewport, "picking", true, false); wr_scene_enable_depth_reset(scene, true); wr_viewport_enable_skybox(mViewport, true); wr_scene_enable_translucence(scene, true); diff --git a/src/wren/Scene.cpp b/src/wren/Scene.cpp index 90791423099..87258a3e4dc 100644 --- a/src/wren/Scene.cpp +++ b/src/wren/Scene.cpp @@ -224,7 +224,7 @@ namespace wren { debug::printSceneTree(); } - void Scene::render(bool culling) { + void Scene::render(bool culling, bool offScreen) { assert(glstate::isInitialized()); ++mFrameCounter; @@ -233,10 +233,10 @@ namespace wren { // debug::printCacheContents(); // debug::printSceneTree(); - renderToViewports({mMainViewport}, culling); + renderToViewports({mMainViewport}, culling, offScreen); } - void Scene::renderToViewports(const std::vector &viewports, bool culling) { + void Scene::renderToViewports(const std::vector &viewports, bool culling, bool offScreen) { assert(glstate::isInitialized()); DEBUG("Notify frame listeners..."); @@ -282,7 +282,7 @@ namespace wren { } } else { renderToViewport(culling); - if (mCurrentViewport == mMainViewport && mCurrentViewport->frameBuffer()) { + if (!offScreen && mCurrentViewport == mMainViewport && mCurrentViewport->frameBuffer()) { glstate::bindDrawFrameBuffer(0); mCurrentViewport->frameBuffer()->blit(0, true, false, false, 0, 0, 0, 0, 0, 0, mCurrentViewport->width() * mCurrentViewport->pixelRatio(), @@ -909,22 +909,23 @@ void wr_scene_terminate_frame_capture(WrScene *scene) { reinterpret_cast(scene)->terminateFrameCapture(); } -void wr_scene_render(WrScene *scene, const char *material_name, bool culling) { +void wr_scene_render(WrScene *scene, const char *material_name, bool culling, bool offScreen) { if (material_name) wren::Renderable::setUseMaterial(material_name); - reinterpret_cast(scene)->render(culling); + reinterpret_cast(scene)->render(culling, offScreen); wren::Renderable::setUseMaterial(NULL); } -void wr_scene_render_to_viewports(WrScene *scene, int count, WrViewport **viewports, const char *material_name, bool culling) { +void wr_scene_render_to_viewports(WrScene *scene, int count, WrViewport **viewports, const char *material_name, bool culling, + bool offScreen) { if (material_name) wren::Renderable::setUseMaterial(material_name); wren::Viewport **start = reinterpret_cast(viewports); std::vector viewportsVector(start, start + count); - reinterpret_cast(scene)->renderToViewports(viewportsVector, culling); + reinterpret_cast(scene)->renderToViewports(viewportsVector, culling, offScreen); wren::Renderable::setUseMaterial(NULL); } diff --git a/src/wren/Scene.hpp b/src/wren/Scene.hpp index d865cbd9043..9f68654b77e 100644 --- a/src/wren/Scene.hpp +++ b/src/wren/Scene.hpp @@ -90,8 +90,8 @@ namespace wren { int computeNodeCount() const; static void printSceneTree(); - void render(bool culling); - void renderToViewports(const std::vector &viewports, bool culling); + void render(bool culling, bool offScreen = false); + void renderToViewports(const std::vector &viewports, bool culling, bool offScreen = false); void addFrameListener(void (*listener)()) { mListeners.push_back(listener); } void removeFrameListener(void (*listener)()); diff --git a/src/wren/Viewport.cpp b/src/wren/Viewport.cpp index 1d5e25fdeeb..723477ebb10 100644 --- a/src/wren/Viewport.cpp +++ b/src/wren/Viewport.cpp @@ -180,10 +180,6 @@ namespace wren { } } - glstate::bindDrawFrameBuffer(0); - - clear(); - for (size_t i = 0; i < mPostProcessingEffects.size(); ++i) mPostProcessingEffects[i]->apply(); } @@ -202,9 +198,6 @@ namespace wren { mAmbientOcclusionEffect->setResultFrameBuffer(mFrameBuffer); mAmbientOcclusionEffect->firstPass()->setInputTexture(0, mFrameBuffer->outputTexture(0)); } - glstate::bindDrawFrameBuffer(0); - - clear(); mAmbientOcclusionEffect->apply(); } @@ -224,10 +217,6 @@ namespace wren { mAntiAliasingEffect->firstPass()->setInputTexture(0, mFrameBuffer->outputTexture(0)); } - glstate::bindDrawFrameBuffer(0); - - clear(); - mAntiAliasingEffect->apply(); } } diff --git a/src/wren/demo/default.cpp b/src/wren/demo/default.cpp index fad345389c1..1578317ef93 100644 --- a/src/wren/demo/default.cpp +++ b/src/wren/demo/default.cpp @@ -99,7 +99,7 @@ static void create_wren_scene() { // Render function. static void render() { - wr_scene_render(wr_scene_get_instance(), NULL, true); + wr_scene_render(wr_scene_get_instance(), NULL, true, false); glutSwapBuffers(); } diff --git a/src/wren/demo/phong.cpp b/src/wren/demo/phong.cpp index 7ed9807a5c3..f7facb5ce95 100644 --- a/src/wren/demo/phong.cpp +++ b/src/wren/demo/phong.cpp @@ -166,7 +166,7 @@ static void render() { static int i = 0; printf("\33[2K\rrendering iteration %d", i++); fflush(stdout); - wr_scene_render(wr_scene_get_instance(), NULL, true); + wr_scene_render(wr_scene_get_instance(), NULL, true, false); glutSwapBuffers(); }