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 d75370c96..66fcce0be 100644 --- a/jme3-core/src/main/java/com/jme3/environment/EnvironmentCamera.java +++ b/jme3-core/src/main/java/com/jme3/environment/EnvironmentCamera.java @@ -31,10 +31,10 @@ */ package com.jme3.environment; -import com.jme3.environment.generation.JobProgressListener; -import com.jme3.environment.util.EnvMapUtils; import com.jme3.app.Application; import com.jme3.app.state.BaseAppState; +import com.jme3.environment.generation.JobProgressListener; +import com.jme3.environment.util.EnvMapUtils; import com.jme3.light.LightProbe; import com.jme3.math.ColorRGBA; import com.jme3.math.Vector3f; @@ -48,6 +48,7 @@ import com.jme3.texture.Texture2D; import com.jme3.texture.TextureCubeMap; import com.jme3.texture.image.ColorSpace; import com.jme3.util.BufferUtils; + import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; @@ -57,7 +58,7 @@ import java.util.concurrent.Callable; * A 360 camera that can capture a cube map of a scene, and then generate the * Prefiltered Environment cube Map and the Irradiance cube Map needed for PBR * indirect lighting - * + * * @see LightProbeFactory * @see LightProbe * @@ -65,11 +66,11 @@ import java.util.concurrent.Callable; */ public class EnvironmentCamera extends BaseAppState { - - private static Vector3f[] axisX = new Vector3f[6]; - private static Vector3f[] axisY = new Vector3f[6]; - private static Vector3f[] axisZ = new Vector3f[6]; - private Image.Format imageFormat = Image.Format.RGB16F; + protected static Vector3f[] axisX = new Vector3f[6]; + protected static Vector3f[] axisY = new Vector3f[6]; + protected static Vector3f[] axisZ = new Vector3f[6]; + + protected Image.Format imageFormat = Image.Format.RGB16F; //Axis for cameras static { @@ -99,13 +100,15 @@ public class EnvironmentCamera extends BaseAppState { axisZ[5] = Vector3f.UNIT_Z.mult(-1f); } - private Image images[]; - ViewPort[] viewports; - FrameBuffer[] framebuffers; - ByteBuffer[] buffers; - private Vector3f position = new Vector3f(); - private ColorRGBA backGroundColor = null; - private int size = 128; + protected Image images[]; + protected ViewPort[] viewports; + protected FrameBuffer[] framebuffers; + protected ByteBuffer[] buffers; + + protected Vector3f position = new Vector3f(); + protected ColorRGBA backGroundColor; + + protected int size = 128; private final List jobs = new ArrayList(); @@ -167,25 +170,28 @@ public class EnvironmentCamera extends BaseAppState { } @Override - public void render(RenderManager renderManager) { - if (!jobs.isEmpty()) { - 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); - } + public void render(final RenderManager renderManager) { + + if (jobs.isEmpty()) { + return; + } - TextureCubeMap map = EnvMapUtils.makeCubeMap(images[0], images[1], images[2], images[3], images[4], images[5], imageFormat); + final SnapshotJob job = jobs.get(0); - job.callback.done(map); - map.getImage().dispose(); - jobs.remove(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); } + + final TextureCubeMap map = EnvMapUtils.makeCubeMap(images[0], images[1], images[2], images[3], images[4], images[5], imageFormat); + + job.callback.done(map); + map.getImage().dispose(); + jobs.remove(0); } public int getSize() { @@ -195,49 +201,55 @@ public class EnvironmentCamera extends BaseAppState { public Vector3f getPosition() { return position; } - + /** * Sets the camera position in world space. * * @param position the position in world space */ - public void setPosition(Vector3f position) { + public void setPosition(final Vector3f position) { this.position.set(position); - if (viewports != null) { - for (ViewPort viewPort : viewports) { - viewPort.getCamera().setLocation(position); - } + + if (viewports == null) { + return; + } + + for (final ViewPort viewPort : viewports) { + viewPort.getCamera().setLocation(position); } } @Override protected void initialize(Application app) { this.backGroundColor = app.getViewPort().getBackgroundColor(); - Camera[] cameras = new Camera[6]; + + final Camera[] cameras = new Camera[6]; + + Texture2D[] textures = new Texture2D[6]; + viewports = new ViewPort[6]; framebuffers = new FrameBuffer[6]; buffers = new ByteBuffer[6]; - Texture2D[] textures = new Texture2D[6]; images = new Image[6]; + for (int i = 0; i < 6; i++) { cameras[i] = createOffCamera(size, position, axisX[i], axisY[i], axisZ[i]); viewports[i] = createOffViewPort("EnvView" + i, cameras[i]); framebuffers[i] = createOffScreenFrameBuffer(size, viewports[i]); textures[i] = new Texture2D(size, size, imageFormat); framebuffers[i].setColorTexture(textures[i]); - } - } @Override protected void cleanup(Application app) { this.backGroundColor = null; - for (FrameBuffer frameBuffer : framebuffers) { + + for (final FrameBuffer frameBuffer : framebuffers) { frameBuffer.dispose(); - } - for (Image image : images) { + + for (final Image image : images) { if( image != null){ image.dispose(); } @@ -271,8 +283,8 @@ public class EnvironmentCamera extends BaseAppState { * @param axisZ tha z axis * @return */ - protected final Camera createOffCamera(int mapSize, Vector3f worldPos, Vector3f axisX, Vector3f axisY, Vector3f axisZ) { - Camera offCamera = new Camera(mapSize, mapSize); + protected Camera createOffCamera(final int mapSize, final Vector3f worldPos, final Vector3f axisX, final Vector3f axisY, final Vector3f axisZ) { + final Camera offCamera = new Camera(mapSize, mapSize); offCamera.setLocation(worldPos); offCamera.setAxes(axisX, axisY, axisZ); offCamera.setFrustumPerspective(90f, 1f, 1, 1000); @@ -287,11 +299,10 @@ public class EnvironmentCamera extends BaseAppState { * @param offCamera * @return */ - protected final ViewPort createOffViewPort(String name, Camera offCamera) { - ViewPort offView = new ViewPort(name, offCamera); + protected ViewPort createOffViewPort(final String name, final Camera offCamera) { + final ViewPort offView = new ViewPort(name, offCamera); offView.setClearFlags(true, true, true); offView.setBackgroundColor(backGroundColor); - return offView; } @@ -302,9 +313,9 @@ public class EnvironmentCamera extends BaseAppState { * @param offView * @return */ - protected final FrameBuffer createOffScreenFrameBuffer(int mapSize, ViewPort offView) { + protected FrameBuffer createOffScreenFrameBuffer(int mapSize, ViewPort offView) { // create offscreen framebuffer - FrameBuffer offBuffer = new FrameBuffer(mapSize, mapSize, 1); + final FrameBuffer offBuffer = new FrameBuffer(mapSize, mapSize, 1); offBuffer.setDepthBuffer(Image.Format.Depth); offView.setOutputFrameBuffer(offBuffer); return offBuffer; @@ -313,7 +324,7 @@ public class EnvironmentCamera extends BaseAppState { /** * An inner class to keep track on a snapshot job. */ - private class SnapshotJob { + protected class SnapshotJob { JobProgressListener callback; Spatial scene; @@ -322,7 +333,5 @@ public class EnvironmentCamera extends BaseAppState { this.callback = callback; this.scene = scene; } - } - }