Prechádzať zdrojové kódy

formatting and documentation

Riccardo Balbo 1 rok pred
rodič
commit
4df92a8b02

+ 13 - 18
jme3-core/src/main/java/com/jme3/environment/LightProbeFactory.java

@@ -45,36 +45,31 @@ import java.util.concurrent.ScheduledThreadPoolExecutor;
 /**
  * Creates LightProbes within a scene, given an EnvironmentCamera.
  * 
- * Since this process can take a long time, you can provide a
- * JobProgressListener that will be notified of the ongoing generation process
- * when calling the makeProbe method.
+ * Since this process can take a long time, you can provide a JobProgressListener that
+ * will be notified of the ongoing generation process when calling the makeProbe method.
  * 
- * The process is as follows: 1. Create an EnvironmentCamera 2. give it a
- * position in the scene 3. call
- * {@link LightProbeFactory#makeProbe(com.jme3.environment.EnvironmentCamera, com.jme3.scene.Spatial)}
- * 4. add the created LightProbe to a node with the
- * {@link Node#addLight(com.jme3.light.Light) } method.
+ * The process is as follows: 
+ * 1. Create an EnvironmentCamera
+ * 2. give it a position in the scene
+ * 3. call {@link LightProbeFactory#makeProbe(com.jme3.environment.EnvironmentCamera, com.jme3.scene.Spatial)}
+ * 4. add the created LightProbe to a node with the {@link Node#addLight(com.jme3.light.Light) } method.
  * 
  * Optionally for step 3 call
  * {@link #makeProbe(com.jme3.environment.EnvironmentCamera, com.jme3.scene.Spatial, com.jme3.environment.generation.JobProgressListener)}
- * with a {@link JobProgressListener} to be notified of the progress of the
- * generation process.
+ * with a {@link JobProgressListener} to be notified of the progress of the generation process.
  * 
- * The generation will be split in several threads for faster generation.
+ * The generation will be split in several threads for faster generation. 
  * 
- * This class is entirely thread safe and can be called from any thread.
+ * This class is entirely thread safe and can be called from any thread. 
  * 
  * Note that in case you are using a {@link JobProgressListener}, all its
- * methods will be called inside an app.enqueue callable. This means that it's
- * completely safe to modify the scenegraph within the Listener method, but also
- * means that the event will be delayed until next update loop.
+ * methods will be called inside an app.enqueue callable.
+ * This means that it's completely safe to modify the scenegraph within the 
+ * Listener method, but also means that the event will be delayed until next update loop.
  * 
- * @deprecated Use LightProbeFactory2 or EnvironmentProbeControl whenever possible.
  * @see EnvironmentCamera
  * @author bouquet
  */
-
-@Deprecated
 public class LightProbeFactory {
 
     /**

+ 17 - 13
jme3-core/src/main/java/com/jme3/environment/baker/EnvBaker.java

@@ -33,7 +33,6 @@
 package com.jme3.environment.baker;
 
 import java.util.function.Function;
-
 import com.jme3.math.Vector3f;
 import com.jme3.scene.Geometry;
 import com.jme3.scene.Spatial;
@@ -47,38 +46,43 @@ import com.jme3.texture.TextureCubeMap;
 public interface EnvBaker {
     /**
      * Bake the environment
-     * @param scene The scene to bake
-     * @param position The position of the camera
-     * @param frustumNear The near frustum
-     * @param frustumFar The far frustum
-     * @param filter A filter to select which geometries to bake
+     * 
+     * @param scene
+     *            The scene to bake
+     * @param position
+     *            The position of the camera
+     * @param frustumNear
+     *            The near frustum
+     * @param frustumFar
+     *            The far frustum
+     * @param filter
+     *            A filter to select which geometries to bake
      */
     public void bakeEnvironment(Spatial scene, Vector3f position, float frustumNear, float frustumFar, Function<Geometry, Boolean> filter);
-    
+
     /**
      * Get the environment map
+     * 
      * @return The environment map
      */
     public TextureCubeMap getEnvMap();
 
     /**
-     * Clean the environment baker
-     * This method should be called when the baker is no longer needed
-     * It will clean up all the resources
+     * Clean the environment baker This method should be called when the baker
+     * is no longer needed It will clean up all the resources
      */
     public void clean();
-    
-
 
     /**
      * Set if textures should be pulled from the GPU
+     * 
      * @param v
      */
     public void setTexturePulling(boolean v);
 
-
     /**
      * Get if textures should be pulled from the GPU
+     * 
      * @return
      */
     public boolean isTexturePulling();

+ 50 - 29
jme3-core/src/main/java/com/jme3/environment/baker/GenericEnvBaker.java

@@ -39,7 +39,6 @@ import java.util.List;
 import java.util.function.Function;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-
 import com.jme3.asset.AssetManager;
 import com.jme3.math.ColorRGBA;
 import com.jme3.math.Quaternion;
@@ -66,6 +65,7 @@ import com.jme3.util.BufferUtils;
  * @author Riccardo Balbo
  */
 public abstract class GenericEnvBaker implements EnvBaker {
+    private static final Logger LOG = Logger.getLogger(GenericEnvBaker.class.getName());
 
     protected static Vector3f[] axisX = new Vector3f[6];
     protected static Vector3f[] axisY = new Vector3f[6];
@@ -103,13 +103,10 @@ public abstract class GenericEnvBaker implements EnvBaker {
     protected final RenderManager renderManager;
     protected final AssetManager assetManager;
     protected final Camera cam;
-    protected  boolean texturePulling=false;
+    protected boolean texturePulling = false;
     protected List<ByteArrayOutputStream> bos = new ArrayList<>();
-    private static final Logger LOG=Logger.getLogger(GenericEnvBaker.class.getName());
-
- 
 
-    public GenericEnvBaker(RenderManager rm, AssetManager am, Format colorFormat, Format depthFormat, int env_size) {
+    protected GenericEnvBaker(RenderManager rm, AssetManager am, Format colorFormat, Format depthFormat, int env_size) {
         this.depthFormat = depthFormat;
 
         renderManager = rm;
@@ -138,17 +135,35 @@ public abstract class GenericEnvBaker implements EnvBaker {
         return env;
     }
 
-    Camera getCam(int id, int w, int h, Vector3f position, float frustumNear, float frustumFar) {
+    /**
+     * Update the internal camera to face the given cubemap face
+     * and return it
+     * 
+     * @param faceId
+     *            the id of the face (0-5)
+     * @param w
+     *            width of the camera
+     * @param h
+     *            height of the camera
+     * @param position
+     *            position of the camera
+     * @param frustumNear
+     *            near frustum
+     * @param frustumFar
+     *            far frustum
+     * @return The updated camera
+     */
+    protected Camera updateAndGetInternalCamera(int faceId, int w, int h, Vector3f position, float frustumNear, float frustumFar) {
         cam.resize(w, h, false);
         cam.setLocation(position);
         cam.setFrustumPerspective(90.0F, 1F, frustumNear, frustumFar);
-        cam.setRotation(new Quaternion().fromAxes(axisX[id], axisY[id], axisZ[id]));
+        cam.setRotation(new Quaternion().fromAxes(axisX[faceId], axisY[faceId], axisZ[faceId]));
         return cam;
     }
 
     @Override
     public void clean() {
-    
+
     }
 
     @Override
@@ -161,15 +176,12 @@ public abstract class GenericEnvBaker implements EnvBaker {
             envbakers[i].addColorTarget(FrameBufferTarget.newTarget(env).face(TextureCubeMap.Face.values()[i]));
         }
 
-       
-
-        if(isTexturePulling())startPulling();
-
+        if (isTexturePulling()) startPulling();
 
         for (int i = 0; i < 6; i++) {
             FrameBuffer envbaker = envbakers[i];
 
-            ViewPort viewPort = new ViewPort("EnvBaker", getCam(i, envbaker.getWidth(), envbaker.getHeight(), position, frustumNear, frustumFar));
+            ViewPort viewPort = new ViewPort("EnvBaker", updateAndGetInternalCamera(i, envbaker.getWidth(), envbaker.getHeight(), position, frustumNear, frustumFar));
             viewPort.setClearFlags(true, true, true);
             viewPort.setBackgroundColor(ColorRGBA.Pink);
 
@@ -187,16 +199,17 @@ public abstract class GenericEnvBaker implements EnvBaker {
             renderManager.setRenderFilter(ofilter);
 
             if (isTexturePulling()) pull(envbaker, env, i);
-            
+
         }
 
         if (isTexturePulling()) endPulling(env);
+
         env.getImage().clearUpdateNeeded();
+
         for (int i = 0; i < 6; i++) {
             envbakers[i].dispose();
         }
     }
-    
 
     /**
      * Starts pulling the data from the framebuffer into the texture
@@ -206,11 +219,15 @@ public abstract class GenericEnvBaker implements EnvBaker {
     }
 
     /**
-     * Pulls the data from the framebuffer into the texture
-     * Nb. mipmaps must be pulled sequentially on the same faceId
-     * @param fb the framebuffer to pull from
-     * @param env the texture to pull into
-     * @param faceId id of face if cubemap or 0 otherwise
+     * Pulls the data from the framebuffer into the texture Nb. mipmaps must be
+     * pulled sequentially on the same faceId
+     * 
+     * @param fb
+     *            the framebuffer to pull from
+     * @param env
+     *            the texture to pull into
+     * @param faceId
+     *            id of face if cubemap or 0 otherwise
      * @return
      */
     protected ByteBuffer pull(FrameBuffer fb, Texture env, int faceId) {
@@ -222,7 +239,10 @@ public abstract class GenericEnvBaker implements EnvBaker {
         renderManager.getRenderer().readFrameBufferWithFormat(fb, face, fb.getColorTarget().getFormat());
         face.rewind();
 
-        while (bos.size() <= faceId) bos.add(null);
+        while (bos.size() <= faceId) {
+            bos.add(null);
+        }
+
         ByteArrayOutputStream bo = bos.get(faceId);
         if (bo == null) bos.set(faceId, bo = new ByteArrayOutputStream());
         try {
@@ -235,26 +255,27 @@ public abstract class GenericEnvBaker implements EnvBaker {
         return face;
     }
 
-
     /**
      * Ends pulling the data into the texture
-     * @param tx the texture to pull into
+     * 
+     * @param tx
+     *            the texture to pull into
      */
     protected void endPulling(Texture tx) {
         for (int i = 0; i < bos.size(); i++) {
             ByteArrayOutputStream bo = bos.get(i);
-            if (bo == null) {
+            if (bo != null) {
+                ByteBuffer faceMip = ByteBuffer.wrap(bo.toByteArray());
+                tx.getImage().setData(i, faceMip);
+            } else {
                 LOG.log(Level.SEVERE, "Missing face {0}. Pulling incomplete!", i);
-                continue;
             }
-            ByteBuffer faceMip = ByteBuffer.wrap(bo.toByteArray());
-            tx.getImage().setData(i, faceMip);
         }
         bos.clear();
         tx.getImage().clearUpdateNeeded();
     }
 
-    protected int limitMips(int nbMipMaps, int baseW, int baseH,RenderManager rm) {
+    protected int limitMips(int nbMipMaps, int baseW, int baseH, RenderManager rm) {
         if (nbMipMaps > 6) nbMipMaps = 6;
         return nbMipMaps;
     }

+ 6 - 4
jme3-core/src/main/java/com/jme3/environment/baker/IBLEnvBaker.java

@@ -30,7 +30,6 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-
 package com.jme3.environment.baker;
 
 import com.jme3.texture.Texture2D;
@@ -44,10 +43,11 @@ import com.jme3.texture.TextureCubeMap;
 public interface IBLEnvBaker extends EnvBaker {
     /**
      * Generate the BRDF texture
+     * 
      * @return The BRDF texture
      */
-    public Texture2D genBRTF() ;
-    
+    public Texture2D genBRTF();
+
     /**
      * Bake the irradiance map
      */
@@ -56,16 +56,18 @@ public interface IBLEnvBaker extends EnvBaker {
     /**
      * Bake the specular IBL map
      */
-    public void bakeSpecularIBL() ;
+    public void bakeSpecularIBL();
 
     /**
      * Get the specular IBL map
+     * 
      * @return The specular IBL map
      */
     public TextureCubeMap getSpecularIBL();
 
     /**
      * Get the irradiance map
+     * 
      * @return The irradiance map
      */
     public TextureCubeMap getIrradiance();

+ 4 - 2
jme3-core/src/main/java/com/jme3/environment/baker/IBLEnvBakerLight.java

@@ -30,7 +30,6 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
- 
 package com.jme3.environment.baker;
 
 import com.jme3.math.Vector3f;
@@ -38,13 +37,16 @@ import com.jme3.texture.TextureCubeMap;
 
 /**
  * An environment baker for IBL, that uses spherical harmonics for irradiance.
+ * 
  * @author Riccardo Balbo
  */
 public interface IBLEnvBakerLight extends EnvBaker {
-    
+
     public void bakeSpecularIBL();
+
     public void bakeSphericalHarmonicsCoefficients();
 
     public TextureCubeMap getSpecularIBL();
+
     public Vector3f[] getSphericalHarmonicsCoefficients();
 }

+ 71 - 73
jme3-core/src/main/java/com/jme3/environment/baker/IBLGLEnvBaker.java

@@ -30,13 +30,11 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-
 package com.jme3.environment.baker;
 
 import java.util.Arrays;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-
 import com.jme3.asset.AssetManager;
 import com.jme3.material.Material;
 import com.jme3.math.FastMath;
@@ -56,65 +54,69 @@ import com.jme3.texture.FrameBuffer.FrameBufferTarget;
 import com.jme3.texture.image.ColorSpace;
 import com.jme3.ui.Picture;
 
-
 /**
  * Fully accelerated env baker for IBL that runs entirely on the GPU
  * 
  * @author Riccardo Balbo
  */
 public class IBLGLEnvBaker extends GenericEnvBaker implements IBLEnvBaker {
-    private final Logger LOGGER=Logger.getLogger(IBLHybridEnvBakerLight.class.getName());
+    private final Logger LOGGER = Logger.getLogger(IBLHybridEnvBakerLight.class.getName());
 
     protected Texture2D brtf;
     protected TextureCubeMap irradiance;
     protected TextureCubeMap specular;
-    public IBLGLEnvBaker(RenderManager rm,AssetManager am,
-                        Format format,
-                        Format depthFormat,
-                        int env_size,int specular_size,
-                        int irradiance_size,
-                        int brtf_size
-    ){
-        super(rm,am,format,depthFormat,env_size);  
-
-        irradiance=new TextureCubeMap(irradiance_size,irradiance_size,format);
+
+    /**
+     * Create a new IBL env baker
+     * @param rm The render manager used to render the env scene
+     * @param am The asset manager used to load the baking shaders
+     * @param format  The format of the color buffers
+     * @param depthFormat The format of the depth buffers
+     * @param env_size The size in pixels of the output environment cube map (eg. 1024)
+     * @param specular_size The size in pixels of the output specular cube map (eg. 1024)
+     * @param irradiance_size The size in pixels of the output irradiance cube map (eg. 512)
+     * @param brtf_size The size in pixels of the output brtf map (eg. 512)
+     */
+    public IBLGLEnvBaker(RenderManager rm, AssetManager am, Format format, Format depthFormat, int env_size, int specular_size, int irradiance_size, int brtf_size) {
+        super(rm, am, format, depthFormat, env_size);
+
+        irradiance = new TextureCubeMap(irradiance_size, irradiance_size, format);
         irradiance.setMagFilter(MagFilter.Bilinear);
         irradiance.setMinFilter(MinFilter.BilinearNoMipMaps);
         irradiance.setWrap(WrapMode.EdgeClamp);
         irradiance.getImage().setColorSpace(ColorSpace.Linear);
 
-        specular=new TextureCubeMap(specular_size,specular_size,format);
+        specular = new TextureCubeMap(specular_size, specular_size, format);
         specular.setMagFilter(MagFilter.Bilinear);
         specular.setMinFilter(MinFilter.Trilinear);
         specular.setWrap(WrapMode.EdgeClamp);
         specular.getImage().setColorSpace(ColorSpace.Linear);
-        
+
         int nbMipMaps = (int) (Math.log(specular_size) / Math.log(2) + 1);
-        nbMipMaps = limitMips(nbMipMaps, specular.getImage().getWidth(), specular.getImage().getHeight(),rm);
-        
-        int[] sizes=new int[nbMipMaps];
-        for(int i=0;i<nbMipMaps;i++){
+        nbMipMaps = limitMips(nbMipMaps, specular.getImage().getWidth(), specular.getImage().getHeight(), rm);
+
+        int[] sizes = new int[nbMipMaps];
+        for (int i = 0; i < nbMipMaps; i++) {
             int size = (int) FastMath.pow(2, nbMipMaps - 1 - i);
-            sizes[i]=size*size*(specular.getImage().getFormat().getBitsPerPixel()/8);
+            sizes[i] = size * size * (specular.getImage().getFormat().getBitsPerPixel() / 8);
         }
         specular.getImage().setMipMapSizes(sizes);
 
-        brtf=new Texture2D(brtf_size,brtf_size,format);
+        brtf = new Texture2D(brtf_size, brtf_size, format);
         brtf.setMagFilter(MagFilter.Bilinear);
         brtf.setMinFilter(MinFilter.BilinearNoMipMaps);
         brtf.setWrap(WrapMode.EdgeClamp);
         brtf.getImage().setColorSpace(ColorSpace.Linear);
     }
 
-
-    public TextureCubeMap getSpecularIBL(){
+    public TextureCubeMap getSpecularIBL() {
         return specular;
     }
-       
+
     public TextureCubeMap getIrradiance() {
         return irradiance;
     }
-    
+
     private void bakeSpecularIBL(int mip, float roughness, Material mat, Geometry screen) throws Exception {
         mat.setFloat("Roughness", roughness);
 
@@ -136,7 +138,7 @@ public class IBLGLEnvBaker extends GenericEnvBaker implements IBLEnvBaker {
             screen.updateLogicalState(0);
             screen.updateGeometricState();
 
-            renderManager.setCamera(getCam(i, specularbaker.getWidth(), specularbaker.getHeight(), Vector3f.ZERO, 1, 1000), false);
+            renderManager.setCamera(updateAndGetInternalCamera(i, specularbaker.getWidth(), specularbaker.getHeight(), Vector3f.ZERO, 1, 1000), false);
             renderManager.getRenderer().setFrameBuffer(specularbaker);
             renderManager.renderGeometry(screen);
 
@@ -150,12 +152,12 @@ public class IBLGLEnvBaker extends GenericEnvBaker implements IBLEnvBaker {
 
     @Override
     public void bakeSpecularIBL() {
-        Box boxm=new Box(1,1,1);
-        Geometry screen=new Geometry("BakeBox",boxm);
-    
-        Material mat=new Material(assetManager,"Common/IBL/IBLKernels.j3md");
-        mat.setBoolean("UseSpecularIBL",true);
-        mat.setTexture("EnvMap",env);
+        Box boxm = new Box(1, 1, 1);
+        Geometry screen = new Geometry("BakeBox", boxm);
+
+        Material mat = new Material(assetManager, "Common/IBL/IBLKernels.j3md");
+        mat.setBoolean("UseSpecularIBL", true);
+        mat.setTexture("EnvMap", env);
         screen.setMaterial(mat);
 
         if (isTexturePulling()) startPulling();
@@ -166,102 +168,99 @@ public class IBLGLEnvBaker extends GenericEnvBaker implements IBLEnvBaker {
                 float roughness = (float) mip / (float) (specular.getImage().getMipMapSizes().length - 1);
                 bakeSpecularIBL(mip, roughness, mat, screen);
             } catch (Exception e) {
-                LOGGER.log(Level.WARNING,"Error while computing mip level " + mip,e);
+                LOGGER.log(Level.WARNING, "Error while computing mip level " + mip, e);
                 break;
             }
         }
-        
+
         if (mip < specular.getImage().getMipMapSizes().length) {
-            
-            int[] sizes = specular.getImage().getMipMapSizes();            
-            sizes=Arrays.copyOf(sizes,mip);
+
+            int[] sizes = specular.getImage().getMipMapSizes();
+            sizes = Arrays.copyOf(sizes, mip);
             specular.getImage().setMipMapSizes(sizes);
             specular.getImage().setMipmapsGenerated(true);
-            if (sizes.length <= 1 ) {
+            if (sizes.length <= 1) {
                 try {
-                    LOGGER.log(Level.WARNING,"Workaround driver BUG: only one mip level available, regenerate it with higher roughness (shiny fix)");
+                    LOGGER.log(Level.WARNING, "Workaround driver BUG: only one mip level available, regenerate it with higher roughness (shiny fix)");
                     bakeSpecularIBL(0, 1f, mat, screen);
                 } catch (Exception e) {
-                    LOGGER.log(Level.FINE,"Error while recomputing mip level 0",e);
+                    LOGGER.log(Level.FINE, "Error while recomputing mip level 0", e);
                 }
             }
         }
-        
+
         if (isTexturePulling()) endPulling(specular);
         specular.getImage().clearUpdateNeeded();
-      
+
     }
 
     @Override
     public Texture2D genBRTF() {
-        
-        Picture screen=new Picture("BakeScreen",true);
+
+        Picture screen = new Picture("BakeScreen", true);
         screen.setWidth(1);
         screen.setHeight(1);
 
-        FrameBuffer brtfbaker=new FrameBuffer(brtf.getImage().getWidth(),brtf.getImage().getHeight(),1);
+        FrameBuffer brtfbaker = new FrameBuffer(brtf.getImage().getWidth(), brtf.getImage().getHeight(), 1);
         brtfbaker.setSrgb(false);
         brtfbaker.addColorTarget(FrameBufferTarget.newTarget(brtf));
 
-        if(isTexturePulling())startPulling();
+        if (isTexturePulling()) startPulling();
 
-        Camera envcam=getCam(0,brtf.getImage().getWidth(),brtf.getImage().getHeight(),Vector3f.ZERO,1,1000);
+        Camera envcam = updateAndGetInternalCamera(0, brtf.getImage().getWidth(), brtf.getImage().getHeight(), Vector3f.ZERO, 1, 1000);
 
-        Material mat=new Material(assetManager,"Common/IBL/IBLKernels.j3md");
-        mat.setBoolean("UseBRDF",true);
+        Material mat = new Material(assetManager, "Common/IBL/IBLKernels.j3md");
+        mat.setBoolean("UseBRDF", true);
         screen.setMaterial(mat);
 
         renderManager.getRenderer().setFrameBuffer(brtfbaker);
-        renderManager.setCamera(envcam,false);
+        renderManager.setCamera(envcam, false);
 
         screen.updateLogicalState(0);
-        screen.updateGeometricState();       
+        screen.updateGeometricState();
         renderManager.renderGeometry(screen);
 
-        if(isTexturePulling()) pull(brtfbaker,brtf,0);
-       
+        if (isTexturePulling()) pull(brtfbaker, brtf, 0);
+
         brtfbaker.dispose();
 
         if (isTexturePulling()) endPulling(brtf);
         brtf.getImage().clearUpdateNeeded();
-     
+
         return brtf;
     }
 
     @Override
     public void bakeIrradiance() {
-     
-        Box boxm=new Box(1,1,1);
-        Geometry screen=new Geometry("BakeBox",boxm);
-    
 
-        FrameBuffer irradiancebaker=new FrameBuffer(irradiance.getImage().getWidth(),irradiance.getImage().getHeight(),1);
+        Box boxm = new Box(1, 1, 1);
+        Geometry screen = new Geometry("BakeBox", boxm);
+
+        FrameBuffer irradiancebaker = new FrameBuffer(irradiance.getImage().getWidth(), irradiance.getImage().getHeight(), 1);
         irradiancebaker.setSrgb(false);
 
-        if(isTexturePulling())startPulling();
-        
-        for(int i=0;i<6;i++) irradiancebaker.addColorTarget(FrameBufferTarget.newTarget(irradiance).face(TextureCubeMap.Face.values()[i]));
+        if (isTexturePulling()) startPulling();
+
+        for (int i = 0; i < 6; i++) irradiancebaker.addColorTarget(FrameBufferTarget.newTarget(irradiance).face(TextureCubeMap.Face.values()[i]));
 
-        Material mat=new Material(assetManager,"Common/IBL/IBLKernels.j3md");
-        mat.setBoolean("UseIrradiance",true);
-        mat.setTexture("EnvMap",env);
+        Material mat = new Material(assetManager, "Common/IBL/IBLKernels.j3md");
+        mat.setBoolean("UseIrradiance", true);
+        mat.setTexture("EnvMap", env);
         screen.setMaterial(mat);
 
-        for(int i=0;i<6;i++){
+        for (int i = 0; i < 6; i++) {
             irradiancebaker.setTargetIndex(i);
 
-            mat.setInt("FaceId",i);
+            mat.setInt("FaceId", i);
 
             screen.updateLogicalState(0);
             screen.updateGeometricState();
 
-            renderManager.setCamera(
-                getCam(i,irradiancebaker.getWidth(),irradiancebaker.getHeight(),Vector3f.ZERO,1,1000)
-            ,false);
+            renderManager.setCamera(updateAndGetInternalCamera(i, irradiancebaker.getWidth(), irradiancebaker.getHeight(), Vector3f.ZERO, 1, 1000), false);
             renderManager.getRenderer().setFrameBuffer(irradiancebaker);
             renderManager.renderGeometry(screen);
 
-            if(isTexturePulling()) pull(irradiancebaker,irradiance,i);
+            if (isTexturePulling()) pull(irradiancebaker, irradiance, i);
         }
 
         irradiancebaker.dispose();
@@ -271,5 +270,4 @@ public class IBLGLEnvBaker extends GenericEnvBaker implements IBLEnvBaker {
 
     }
 
-
 }

+ 30 - 26
jme3-core/src/main/java/com/jme3/environment/baker/IBLGLEnvBakerLight.java

@@ -54,8 +54,8 @@ import com.jme3.texture.image.ImageRaster;
 import com.jme3.util.BufferUtils;
 
 /**
- * Fully accelerated env baker for IBL that bakes the specular map and spherical harmonics
- * on the GPU.
+ * Fully accelerated env baker for IBL that bakes the specular map and spherical
+ * harmonics on the GPU.
  * 
  * This is lighter on VRAM but it is not as parallelized as IBLGLEnvBaker
  * 
@@ -65,12 +65,29 @@ public class IBLGLEnvBakerLight extends IBLHybridEnvBakerLight {
     public final static int NUM_SH_COEFFICIENT = 9;
     private static final Logger LOG = Logger.getLogger(IBLGLEnvBakerLight.class.getName());
 
+    /**
+     * Create a new IBL env baker
+     * 
+     * @param rm
+     *            The render manager used to render the env scene
+     * @param am
+     *            The asset manager used to load the baking shaders
+     * @param format
+     *            The format of the color buffers
+     * @param depthFormat
+     *            The format of the depth buffers
+     * @param env_size
+     *            The size in pixels of the output environment cube map (eg.
+     *            1024)
+     * @param specular_size
+     *            The size in pixels of the output specular cube map (eg. 1024)
+     */
     public IBLGLEnvBakerLight(RenderManager rm, AssetManager am, Format format, Format depthFormat, int env_size, int specular_size) {
         super(rm, am, format, depthFormat, env_size, specular_size);
     }
 
     @Override
-    public boolean isTexturePulling() { 
+    public boolean isTexturePulling() {
         return this.texturePulling;
     }
 
@@ -83,8 +100,7 @@ public class IBLGLEnvBakerLight extends IBLHybridEnvBakerLight {
         mat.setTexture("Texture", env);
         mat.setVector2("Resolution", new Vector2f(env.getImage().getWidth(), env.getImage().getHeight()));
         screen.setMaterial(mat);
-        
-        
+
         float remapMaxValue = 0;
         Format format = Format.RGBA32F;
         if (!renderManager.getRenderer().getCaps().contains(Caps.FloatColorBufferRGBA)) {
@@ -93,29 +109,20 @@ public class IBLGLEnvBakerLight extends IBLHybridEnvBakerLight {
             remapMaxValue = 0.05f;
         }
 
-        
         if (remapMaxValue > 0) {
             mat.setFloat("RemapMaxValue", remapMaxValue);
         } else {
             mat.clearParam("RemapMaxValue");
         }
 
-        Texture2D shCoefTx[] = {
-            new Texture2D(NUM_SH_COEFFICIENT, 1, 1, format),
-            new Texture2D(NUM_SH_COEFFICIENT, 1, 1, format)
-        };
-
+        Texture2D shCoefTx[] = { new Texture2D(NUM_SH_COEFFICIENT, 1, 1, format), new Texture2D(NUM_SH_COEFFICIENT, 1, 1, format) };
 
-        FrameBuffer shbaker[] = {
-            new FrameBuffer(NUM_SH_COEFFICIENT, 1, 1),
-            new FrameBuffer(NUM_SH_COEFFICIENT, 1, 1)
-        };
+        FrameBuffer shbaker[] = { new FrameBuffer(NUM_SH_COEFFICIENT, 1, 1), new FrameBuffer(NUM_SH_COEFFICIENT, 1, 1) };
         shbaker[0].setSrgb(false);
         shbaker[0].addColorTarget(FrameBufferTarget.newTarget(shCoefTx[0]));
 
         shbaker[1].setSrgb(false);
         shbaker[1].addColorTarget(FrameBufferTarget.newTarget(shCoefTx[1]));
-        
 
         int renderOnT = -1;
 
@@ -131,21 +138,18 @@ public class IBLGLEnvBakerLight extends IBLHybridEnvBakerLight {
 
             screen.updateLogicalState(0);
             screen.updateGeometricState();
-            
-            renderManager.setCamera(getCam(0, shbaker[renderOnT].getWidth(), shbaker[renderOnT].getHeight(), Vector3f.ZERO, 1, 1000), false);
+
+            renderManager.setCamera(updateAndGetInternalCamera(0, shbaker[renderOnT].getWidth(), shbaker[renderOnT].getHeight(), Vector3f.ZERO, 1, 1000), false);
             renderManager.getRenderer().setFrameBuffer(shbaker[renderOnT]);
             renderManager.renderGeometry(screen);
         }
 
-            
-        ByteBuffer shCoefRaw = BufferUtils.createByteBuffer(
-            NUM_SH_COEFFICIENT * 1 * ( shbaker[renderOnT].getColorTarget().getFormat().getBitsPerPixel() / 8)
-        );
+        ByteBuffer shCoefRaw = BufferUtils.createByteBuffer(NUM_SH_COEFFICIENT * 1 * (shbaker[renderOnT].getColorTarget().getFormat().getBitsPerPixel() / 8));
         renderManager.getRenderer().readFrameBufferWithFormat(shbaker[renderOnT], shCoefRaw, shbaker[renderOnT].getColorTarget().getFormat());
         shCoefRaw.rewind();
 
         Image img = new Image(format, NUM_SH_COEFFICIENT, 1, shCoefRaw, ColorSpace.Linear);
-        ImageRaster imgr=ImageRaster.create(img);
+        ImageRaster imgr = ImageRaster.create(img);
 
         shCoef = new Vector3f[NUM_SH_COEFFICIENT];
         float weightAccum = 0.0f;
@@ -159,14 +163,14 @@ public class IBLGLEnvBakerLight extends IBLHybridEnvBakerLight {
             }
 
         }
-        
+
         if (remapMaxValue > 0) weightAccum /= remapMaxValue;
 
         for (int i = 0; i < NUM_SH_COEFFICIENT; ++i) {
-            if (remapMaxValue > 0)  shCoef[i].divideLocal(remapMaxValue);
+            if (remapMaxValue > 0) shCoef[i].divideLocal(remapMaxValue);
             shCoef[i].multLocal(4.0f * FastMath.PI / weightAccum);
         }
-        
+
         img.dispose();
 
     }

+ 31 - 17
jme3-core/src/main/java/com/jme3/environment/baker/IBLHybridEnvBakerLight.java

@@ -35,7 +35,6 @@ package com.jme3.environment.baker;
 import java.util.Arrays;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-
 import com.jme3.asset.AssetManager;
 import com.jme3.environment.util.EnvMapUtils;
 import com.jme3.material.Material;
@@ -62,13 +61,28 @@ import com.jme3.texture.image.ColorSpace;
  * @author Riccardo Balbo
  */
 public class IBLHybridEnvBakerLight extends GenericEnvBaker implements IBLEnvBakerLight {
-    private final Logger LOGGER=Logger.getLogger(IBLHybridEnvBakerLight.class.getName());
+    private final Logger LOGGER = Logger.getLogger(IBLHybridEnvBakerLight.class.getName());
     protected TextureCubeMap specular;
     protected Vector3f[] shCoef;
 
-    public IBLHybridEnvBakerLight(RenderManager rm, AssetManager am, Format format, Format depthFormat, int env_size, int specular_size
-
-    ) {
+    /**
+     * Create a new IBL env baker
+     * 
+     * @param rm
+     *            The render manager used to render the env scene
+     * @param am
+     *            The asset manager used to load the baking shaders
+     * @param format
+     *            The format of the color buffers
+     * @param depthFormat
+     *            The format of the depth buffers
+     * @param env_size
+     *            The size in pixels of the output environment cube map (eg.
+     *            1024)
+     * @param specular_size
+     *            The size in pixels of the output specular cube map (eg. 1024)
+     */
+    public IBLHybridEnvBakerLight(RenderManager rm, AssetManager am, Format format, Format depthFormat, int env_size, int specular_size) {
         super(rm, am, format, depthFormat, env_size);
 
         specular = new TextureCubeMap(specular_size, specular_size, format);
@@ -78,7 +92,7 @@ public class IBLHybridEnvBakerLight extends GenericEnvBaker implements IBLEnvBak
         specular.getImage().setColorSpace(ColorSpace.Linear);
 
         int nbMipMaps = (int) (Math.log(specular_size) / Math.log(2) + 1);
-        nbMipMaps = limitMips(nbMipMaps, specular.getImage().getWidth(), specular.getImage().getHeight(),rm);
+        nbMipMaps = limitMips(nbMipMaps, specular.getImage().getWidth(), specular.getImage().getHeight(), rm);
 
         int[] sizes = new int[nbMipMaps];
         for (int i = 0; i < nbMipMaps; i++) {
@@ -89,7 +103,7 @@ public class IBLHybridEnvBakerLight extends GenericEnvBaker implements IBLEnvBak
         specular.getImage().setMipmapsGenerated(true);
 
     }
-    
+
     @Override
     public boolean isTexturePulling() { // always pull textures from gpu
         return true;
@@ -116,7 +130,7 @@ public class IBLHybridEnvBakerLight extends GenericEnvBaker implements IBLEnvBak
             screen.updateLogicalState(0);
             screen.updateGeometricState();
 
-            renderManager.setCamera(getCam(i, specularbaker.getWidth(), specularbaker.getHeight(), Vector3f.ZERO, 1, 1000), false);
+            renderManager.setCamera(updateAndGetInternalCamera(i, specularbaker.getWidth(), specularbaker.getHeight(), Vector3f.ZERO, 1, 1000), false);
             renderManager.getRenderer().setFrameBuffer(specularbaker);
             renderManager.renderGeometry(screen);
 
@@ -146,30 +160,30 @@ public class IBLHybridEnvBakerLight extends GenericEnvBaker implements IBLEnvBak
                 float roughness = (float) mip / (float) (specular.getImage().getMipMapSizes().length - 1);
                 bakeSpecularIBL(mip, roughness, mat, screen);
             } catch (Exception e) {
-                LOGGER.log(Level.WARNING,"Error while computing mip level " + mip,e);
+                LOGGER.log(Level.WARNING, "Error while computing mip level " + mip, e);
                 break;
             }
         }
-        
+
         if (mip < specular.getImage().getMipMapSizes().length) {
-       
-            int[] sizes = specular.getImage().getMipMapSizes();            
-            sizes=Arrays.copyOf(sizes,mip);
+
+            int[] sizes = specular.getImage().getMipMapSizes();
+            sizes = Arrays.copyOf(sizes, mip);
             specular.getImage().setMipMapSizes(sizes);
             specular.getImage().setMipmapsGenerated(true);
             if (sizes.length <= 1) {
                 try {
-                    LOGGER.log(Level.WARNING,"Workaround driver BUG: only one mip level available, regenerate it with higher roughness (shiny fix)");
+                    LOGGER.log(Level.WARNING, "Workaround driver BUG: only one mip level available, regenerate it with higher roughness (shiny fix)");
                     bakeSpecularIBL(0, 1f, mat, screen);
                 } catch (Exception e) {
-                    LOGGER.log(Level.FINE,"Error while recomputing mip level 0",e);
+                    LOGGER.log(Level.FINE, "Error while recomputing mip level 0", e);
                 }
             }
         }
-        
+
         if (isTexturePulling()) endPulling(specular);
         specular.getImage().clearUpdateNeeded();
- 
+
     }
 
     @Override

+ 2 - 2
jme3-examples/src/main/java/jme3test/light/pbr/TestPBRLighting.java

@@ -34,7 +34,7 @@ package jme3test.light.pbr;
 import com.jme3.app.SimpleApplication;
 import com.jme3.environment.EnvironmentCamera;
 import com.jme3.environment.LightProbeFactory;
-import com.jme3.environment.LightProbeFactory2;
+import com.jme3.environment.FastLightProbeFactory;
 import com.jme3.environment.generation.JobProgressAdapter;
 import com.jme3.environment.util.EnvMapUtils;
 import com.jme3.environment.util.LightsDebugState;
@@ -204,7 +204,7 @@ public class TestPBRLighting extends SimpleApplication {
             LightProbe probe;
 
             if (USE_ACCELERATED_BAKING) {
-                probe = LightProbeFactory2.makeProbe(renderManager, assetManager, RESOLUTION, Vector3f.ZERO, 1f, 1000f, rootNode);
+                probe = FastLightProbeFactory.makeProbe(renderManager, assetManager, RESOLUTION, Vector3f.ZERO, 1f, 1000f, rootNode);
             } else {
                 probe = LightProbeFactory.makeProbe(stateManager.getState(EnvironmentCamera.class), rootNode, new JobProgressAdapter<LightProbe>() {
 

+ 32 - 1
jme3-examples/src/main/java/jme3test/light/pbr/TestPBRSimple.java

@@ -1,3 +1,34 @@
+/*
+ * Copyright (c) 2009-2023 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
 package jme3test.light.pbr;
 
 
@@ -49,7 +80,7 @@ public class TestPBRSimple extends SimpleApplication {
         rootNode.addControl(envProbe);
        
         // Tag the sky, only the tagged spatials will be rendered in the env map
-        EnvironmentProbeControl.tag(sky);
+        envProbe.tag(sky);