Skip to content

Commit

Permalink
Fix incomplete loading while minimized under some windowing systems. (#…
Browse files Browse the repository at this point in the history
…6617)

* Fix incomplete loading under some windowing systems.

* Add changelog entry.

* Apply suggestions from code review

Co-authored-by: Olivier Michel <[email protected]>

* Revert "Apply suggestions from code review"

This reverts commit 7804a09.

* Revert "Fix incomplete loading under some windowing systems."

This reverts commit 0d9dbb2.

* Rework approach to ensure that only offscreen framebuffers are used for the initial render.

---------

Co-authored-by: Olivier Michel <[email protected]>
  • Loading branch information
brettle and omichel authored Aug 14, 2024
1 parent fe2879c commit 0bcfb17
Show file tree
Hide file tree
Showing 14 changed files with 32 additions and 38 deletions.
1 change: 1 addition & 0 deletions docs/reference/changelog-r2024.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)).
5 changes: 3 additions & 2 deletions include/wren/scene.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
9 changes: 5 additions & 4 deletions src/webots/gui/WbView3D.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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();

Expand All @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion src/webots/gui/WbView3D.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
9 changes: 5 additions & 4 deletions src/webots/gui/WbWrenWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion src/webots/gui/WbWrenWindow.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion src/webots/nodes/utils/WbVirtualRealityHeadset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion src/webots/wren/WbWrenCamera.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
2 changes: 1 addition & 1 deletion src/webots/wren/WbWrenPicker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
17 changes: 9 additions & 8 deletions src/wren/Scene.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ namespace wren {
debug::printSceneTree();
}

void Scene::render(bool culling) {
void Scene::render(bool culling, bool offScreen) {
assert(glstate::isInitialized());

++mFrameCounter;
Expand All @@ -233,10 +233,10 @@ namespace wren {
// debug::printCacheContents();
// debug::printSceneTree();

renderToViewports({mMainViewport}, culling);
renderToViewports({mMainViewport}, culling, offScreen);
}

void Scene::renderToViewports(const std::vector<Viewport *> &viewports, bool culling) {
void Scene::renderToViewports(const std::vector<Viewport *> &viewports, bool culling, bool offScreen) {
assert(glstate::isInitialized());

DEBUG("Notify frame listeners...");
Expand Down Expand Up @@ -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(),
Expand Down Expand Up @@ -909,22 +909,23 @@ void wr_scene_terminate_frame_capture(WrScene *scene) {
reinterpret_cast<wren::Scene *>(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<wren::Scene *>(scene)->render(culling);
reinterpret_cast<wren::Scene *>(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<wren::Viewport **>(viewports);
std::vector<wren::Viewport *> viewportsVector(start, start + count);
reinterpret_cast<wren::Scene *>(scene)->renderToViewports(viewportsVector, culling);
reinterpret_cast<wren::Scene *>(scene)->renderToViewports(viewportsVector, culling, offScreen);

wren::Renderable::setUseMaterial(NULL);
}
Expand Down
4 changes: 2 additions & 2 deletions src/wren/Scene.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,8 @@ namespace wren {

int computeNodeCount() const;
static void printSceneTree();
void render(bool culling);
void renderToViewports(const std::vector<Viewport *> &viewports, bool culling);
void render(bool culling, bool offScreen = false);
void renderToViewports(const std::vector<Viewport *> &viewports, bool culling, bool offScreen = false);

void addFrameListener(void (*listener)()) { mListeners.push_back(listener); }
void removeFrameListener(void (*listener)());
Expand Down
11 changes: 0 additions & 11 deletions src/wren/Viewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -180,10 +180,6 @@ namespace wren {
}
}

glstate::bindDrawFrameBuffer(0);

clear();

for (size_t i = 0; i < mPostProcessingEffects.size(); ++i)
mPostProcessingEffects[i]->apply();
}
Expand All @@ -202,9 +198,6 @@ namespace wren {
mAmbientOcclusionEffect->setResultFrameBuffer(mFrameBuffer);
mAmbientOcclusionEffect->firstPass()->setInputTexture(0, mFrameBuffer->outputTexture(0));
}
glstate::bindDrawFrameBuffer(0);

clear();

mAmbientOcclusionEffect->apply();
}
Expand All @@ -224,10 +217,6 @@ namespace wren {
mAntiAliasingEffect->firstPass()->setInputTexture(0, mFrameBuffer->outputTexture(0));
}

glstate::bindDrawFrameBuffer(0);

clear();

mAntiAliasingEffect->apply();
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/wren/demo/default.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand Down
2 changes: 1 addition & 1 deletion src/wren/demo/phong.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand Down

0 comments on commit 0bcfb17

Please sign in to comment.