瀏覽代碼

resolve issue 1446 (test whether an EnvironmentCamera is busy) (#1490)

* resolve issue #1446 (test whether an EnvironmentCamera is busy)

* RefEnv: indicate whether the EnvironmentCamera is busy (to test 1446)

* EnvironmentCamera: clearer coding of render() method
Stephen Gold 4 年之前
父節點
當前提交
7ed3d37971

+ 33 - 20
jme3-core/src/main/java/com/jme3/environment/EnvironmentCamera.java

@@ -172,28 +172,30 @@ public class EnvironmentCamera extends BaseAppState {
 
     @Override
     public void render(final RenderManager renderManager) {
+        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]);
+            }
 
-        if (jobs.isEmpty()) {
-            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]);
-        }
-
-        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);
+        }
     }
 
     /**
@@ -276,6 +278,17 @@ public class EnvironmentCamera extends BaseAppState {
         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();

+ 6 - 1
jme3-examples/src/main/java/jme3test/light/pbr/RefEnv.java

@@ -147,8 +147,9 @@ public class RefEnv extends SimpleApplication {
     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<LightProbe>() {
+            final LightProbe probe = LightProbeFactory.makeProbe(eCam, rootNode, EnvMapUtils.GenerationType.Fast, new JobProgressAdapter<LightProbe>() {
 
                 @Override
                 public void done(LightProbe result) {
@@ -161,5 +162,9 @@ public class RefEnv extends SimpleApplication {
             rootNode.addLight(probe);
 
         }
+
+        if (eCam.isBusy()) {
+            System.out.println("EnvironmentCamera busy as of frame " + frame);
+        }
     }
 }