From d3958ef9ed7aec49277c640e5ed38ded3e978424 Mon Sep 17 00:00:00 2001 From: Stephen Gold Date: Wed, 24 Mar 2021 11:25:57 -0700 Subject: [PATCH 1/3] resolve issue #1446 (test whether an EnvironmentCamera is busy) --- .../com/jme3/environment/EnvironmentCamera.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/environment/EnvironmentCamera.java b/jme3-core/src/main/java/com/jme3/environment/EnvironmentCamera.java index 6ff9762bfb..3027707539 100644 --- a/jme3-core/src/main/java/com/jme3/environment/EnvironmentCamera.java +++ b/jme3-core/src/main/java/com/jme3/environment/EnvironmentCamera.java @@ -172,8 +172,7 @@ public Void call() throws Exception { @Override public void render(final RenderManager renderManager) { - - if (jobs.isEmpty()) { + if (!isBusy()) { return; } @@ -276,6 +275,17 @@ public ViewPort[] getViewPorts(){ return viewports; } + /** + * Test whether this EnvironmentCamera is busy. Avoid reconfiguring while + * busy! + * + * @return true if busy, otherwise false + */ + public boolean isBusy() { + boolean result = !jobs.isEmpty(); + return result; + } + @Override protected void initialize(Application app) { this.backGroundColor = app.getViewPort().getBackgroundColor().clone(); From 097090e8e092bb6f337e9b3b5010d8ddebcec906 Mon Sep 17 00:00:00 2001 From: Stephen Gold Date: Wed, 24 Mar 2021 11:27:07 -0700 Subject: [PATCH 2/3] RefEnv: indicate whether the EnvironmentCamera is busy (to test 1446) --- jme3-examples/src/main/java/jme3test/light/pbr/RefEnv.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/jme3-examples/src/main/java/jme3test/light/pbr/RefEnv.java b/jme3-examples/src/main/java/jme3test/light/pbr/RefEnv.java index 9d6d969e66..ff32877ad8 100644 --- a/jme3-examples/src/main/java/jme3test/light/pbr/RefEnv.java +++ b/jme3-examples/src/main/java/jme3test/light/pbr/RefEnv.java @@ -147,8 +147,9 @@ private void switchMat(Spatial s) { public void simpleUpdate(float tpf) { frame++; + EnvironmentCamera eCam = stateManager.getState(EnvironmentCamera.class); if (frame == 2) { - final LightProbe probe = LightProbeFactory.makeProbe(stateManager.getState(EnvironmentCamera.class), rootNode, EnvMapUtils.GenerationType.Fast, new JobProgressAdapter() { + final LightProbe probe = LightProbeFactory.makeProbe(eCam, rootNode, EnvMapUtils.GenerationType.Fast, new JobProgressAdapter() { @Override public void done(LightProbe result) { @@ -161,5 +162,9 @@ public void done(LightProbe result) { rootNode.addLight(probe); } + + if (eCam.isBusy()) { + System.out.println("EnvironmentCamera busy as of frame " + frame); + } } } From 1461bb69f3b4ca18afa743a694c27a617f056684 Mon Sep 17 00:00:00 2001 From: Stephen Gold Date: Thu, 25 Mar 2021 12:27:55 -0700 Subject: [PATCH 3/3] EnvironmentCamera: clearer coding of render() method --- .../jme3/environment/EnvironmentCamera.java | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/environment/EnvironmentCamera.java b/jme3-core/src/main/java/com/jme3/environment/EnvironmentCamera.java index 3027707539..f66c2b49ad 100644 --- a/jme3-core/src/main/java/com/jme3/environment/EnvironmentCamera.java +++ b/jme3-core/src/main/java/com/jme3/environment/EnvironmentCamera.java @@ -172,27 +172,30 @@ public Void call() throws Exception { @Override public void render(final RenderManager renderManager) { - if (!isBusy()) { - return; - } - - final SnapshotJob job = jobs.get(0); - - for (int i = 0; i < 6; i++) { - viewports[i].clearScenes(); - viewports[i].attachScene(job.scene); - renderManager.renderViewPort(viewports[i], 0.16f); - buffers[i] = BufferUtils.createByteBuffer(size * size * imageFormat.getBitsPerPixel() / 8); - renderManager.getRenderer().readFrameBufferWithFormat(framebuffers[i], buffers[i], imageFormat); - images[i] = new Image(imageFormat, size, size, buffers[i], ColorSpace.Linear); - MipMapGenerator.generateMipMaps(images[i]); - } + if (isBusy()) { + final SnapshotJob job = jobs.get(0); + + for (int i = 0; i < 6; i++) { + viewports[i].clearScenes(); + viewports[i].attachScene(job.scene); + renderManager.renderViewPort(viewports[i], 0.16f); + buffers[i] = BufferUtils.createByteBuffer( + size * size * imageFormat.getBitsPerPixel() / 8); + renderManager.getRenderer().readFrameBufferWithFormat( + framebuffers[i], buffers[i], imageFormat); + images[i] = new Image(imageFormat, size, size, buffers[i], + ColorSpace.Linear); + MipMapGenerator.generateMipMaps(images[i]); + } - final TextureCubeMap map = EnvMapUtils.makeCubeMap(images[0], images[1], images[2], images[3], images[4], images[5], imageFormat); + final TextureCubeMap map = EnvMapUtils.makeCubeMap(images[0], + images[1], images[2], images[3], images[4], images[5], + imageFormat); debugEnv = map; - job.callback.done(map); - map.getImage().dispose(); - jobs.remove(0); + job.callback.done(map); + map.getImage().dispose(); + jobs.remove(0); + } } /**