3636import java .util .function .Predicate ;
3737import com .jme3 .asset .AssetManager ;
3838import com .jme3 .environment .baker .IBLGLEnvBakerLight ;
39- import com .jme3 .environment .baker .IBLHybridEnvBakerLight ;
4039import com .jme3 .export .InputCapsule ;
4140import com .jme3 .export .JmeExporter ;
4241import com .jme3 .export .JmeImporter ;
4948import com .jme3 .scene .Node ;
5049import com .jme3 .scene .Spatial ;
5150import com .jme3 .scene .control .Control ;
52- import com .jme3 .texture .Image .Format ;
5351
5452/**
5553 * A control that automatically handles environment bake and rebake including
@@ -87,10 +85,12 @@ public class EnvironmentProbeControl extends LightProbe implements Control {
8785 private float frustumNear = 0.001f , frustumFar = 1000f ;
8886 private String uuid = "none" ;
8987 private boolean enabled = true ;
90-
88+ private IBLGLEnvBakerLight .SphericalHarmonicsMode sphericalHarmonicsMode =
89+ IBLGLEnvBakerLight .SphericalHarmonicsMode .AUTO ;
9190 private Predicate <Geometry > filter = (s ) -> {
9291 return s .getUserData ("tags.env" ) != null || s .getUserData ("tags.env.env" + uuid ) != null ;
9392 };
93+ private transient IBLGLEnvBakerLight baker ;
9494
9595 protected EnvironmentProbeControl () {
9696 super ();
@@ -212,11 +212,47 @@ public boolean isRequiredSavableResults() {
212212 return requiredSavableResults ;
213213 }
214214
215+ /**
216+ * Sets how spherical harmonics coefficients are baked by this control.
217+ *
218+ * @param mode the spherical harmonics bake mode
219+ */
220+ public void setSphericalHarmonicsMode (IBLGLEnvBakerLight .SphericalHarmonicsMode mode ) {
221+ if (mode == null ) {
222+ throw new IllegalArgumentException ("mode cannot be null" );
223+ }
224+ sphericalHarmonicsMode = mode ;
225+ }
226+
227+ /**
228+ * Returns the spherical harmonics bake mode used by this control.
229+ *
230+ * @return the spherical harmonics bake mode
231+ */
232+ public IBLGLEnvBakerLight .SphericalHarmonicsMode getSphericalHarmonicsMode () {
233+ return sphericalHarmonicsMode ;
234+ }
235+
236+ /**
237+ * Enables or disables the spherical harmonics fast path explicitly.
238+ *
239+ * @param enabled true to use the fast path, false to use the quality path
240+ */
241+ public void setSphericalHarmonicsFastPathEnabled (boolean enabled ) {
242+ setSphericalHarmonicsMode (enabled
243+ ? IBLGLEnvBakerLight .SphericalHarmonicsMode .FAST
244+ : IBLGLEnvBakerLight .SphericalHarmonicsMode .QUALITY );
245+ }
246+
215247 @ Override
216248 public void setSpatial (Spatial spatial ) {
217249 if (this .spatial != null && spatial != null && spatial != this .spatial ) {
218250 throw new IllegalStateException ("This control has already been added to a Spatial" );
219251 }
252+ if (spatial == null && baker != null ) {
253+ baker .clean ();
254+ baker = null ;
255+ }
220256 this .spatial = spatial ;
221257 if (spatial != null ) spatial .addLight (this );
222258 }
@@ -231,7 +267,12 @@ public void render(RenderManager rm, ViewPort vp) {
231267 if (!isEnabled ()) return ;
232268 if (bakeNeeded ) {
233269 bakeNeeded = false ;
234- rebakeNow (rm );
270+ try {
271+ rebakeNow (rm );
272+ } finally {
273+ rm .getRenderer ().setFrameBuffer (vp .getOutputFrameBuffer ());
274+ rm .setCamera (vp .getCamera (), false );
275+ }
235276 }
236277 }
237278
@@ -285,11 +326,23 @@ public float getFrustumFar() {
285326 */
286327 public void setAssetManager (AssetManager assetManager ) {
287328 this .assetManager = assetManager ;
329+ if (baker != null ) {
330+ baker .clean ();
331+ baker = null ;
332+ }
333+ }
334+
335+ private IBLGLEnvBakerLight getBaker (RenderManager renderManager ) {
336+ if (baker == null ) {
337+ baker = new IBLGLEnvBakerLight (renderManager , assetManager , null ,
338+ null , envMapSize , envMapSize );
339+ }
340+ return baker ;
288341 }
289342
290343 void rebakeNow (RenderManager renderManager ) {
291- IBLHybridEnvBakerLight baker = new IBLGLEnvBakerLight (renderManager , assetManager , null ,
292- null , envMapSize , envMapSize );
344+ IBLGLEnvBakerLight baker = getBaker (renderManager );
345+ baker . setSphericalHarmonicsMode ( sphericalHarmonicsMode );
293346
294347 baker .setTexturePulling (isRequiredSavableResults ());
295348 baker .bakeEnvironment (spatial , getPosition (), frustumNear , frustumFar , filter );
@@ -304,8 +357,6 @@ void rebakeNow(RenderManager renderManager) {
304357 setShCoeffs (baker .getSphericalHarmonicsCoefficients ());
305358 setPosition (Vector3f .ZERO );
306359 setReady (true );
307-
308- baker .clean ();
309360 }
310361
311362 public void setEnabled (boolean enabled ) {
@@ -332,6 +383,8 @@ public void write(JmeExporter ex) throws IOException {
332383 oc .write (frustumFar , "frustumFar" , 1000f );
333384 oc .write (frustumNear , "frustumNear" , 0.001f );
334385 oc .write (uuid , "envProbeControlUUID" , "none" );
386+ oc .write (sphericalHarmonicsMode , "sphericalHarmonicsMode" ,
387+ IBLGLEnvBakerLight .SphericalHarmonicsMode .AUTO );
335388 }
336389
337390 @ Override
@@ -347,6 +400,9 @@ public void read(JmeImporter im) throws IOException {
347400 frustumFar = ic .readFloat ("frustumFar" , 1000f );
348401 frustumNear = ic .readFloat ("frustumNear" , 0.001f );
349402 uuid = ic .readString ("envProbeControlUUID" , "none" );
403+ sphericalHarmonicsMode = ic .readEnum ("sphericalHarmonicsMode" ,
404+ IBLGLEnvBakerLight .SphericalHarmonicsMode .class ,
405+ IBLGLEnvBakerLight .SphericalHarmonicsMode .AUTO );
350406 }
351407
352408}
0 commit comments