-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
EnvironmentProbeControl, for simpler env baking
- Loading branch information
1 parent
c91b2dd
commit ec01833
Showing
5 changed files
with
156 additions
and
4 deletions.
There are no files selected for viewing
104 changes: 104 additions & 0 deletions
104
jme3-core/src/main/java/com/jme3/environment/EnvironmentProbeControl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
package com.jme3.environment; | ||
|
||
import java.util.function.Function; | ||
import java.util.function.Predicate; | ||
|
||
import com.jme3.asset.AssetManager; | ||
import com.jme3.environment.baker.IBLGLEnvBakerLight; | ||
import com.jme3.light.LightProbe; | ||
import com.jme3.math.Vector3f; | ||
import com.jme3.renderer.RenderManager; | ||
import com.jme3.renderer.ViewPort; | ||
import com.jme3.scene.Geometry; | ||
import com.jme3.scene.Node; | ||
import com.jme3.scene.Spatial; | ||
import com.jme3.scene.control.Control; | ||
import com.jme3.texture.Image.Format; | ||
|
||
/** | ||
* SmartLightProbe | ||
*/ | ||
public class EnvironmentProbeControl extends LightProbe implements Control { | ||
|
||
|
||
|
||
RenderManager renderManager; | ||
AssetManager assetManager; | ||
int envMapSize; | ||
Spatial spatial; | ||
boolean BAKE_NEEDED=true; | ||
Function<Geometry,Boolean> filter=(s)->{ | ||
return s.getUserData("tags.env")!=null; | ||
}; | ||
|
||
public static void tag(Spatial s){ | ||
if(s instanceof Node){ | ||
Node n=(Node)s; | ||
for(Spatial sx:n.getChildren()){ | ||
tag(sx); | ||
} | ||
}else if(s instanceof Geometry){ | ||
s.setUserData("tags.env", true); | ||
} | ||
} | ||
|
||
public EnvironmentProbeControl(RenderManager rm,AssetManager am, int size){ | ||
renderManager=rm; | ||
assetManager=am; | ||
envMapSize=size; | ||
} | ||
|
||
@Override | ||
public Control cloneForSpatial(Spatial spatial) { | ||
return null; | ||
} | ||
|
||
@Override | ||
public void setSpatial(Spatial spatial) { | ||
|
||
spatial.addLight(this); | ||
this.spatial=spatial; | ||
|
||
} | ||
|
||
@Override | ||
public void update(float tpf) { | ||
|
||
} | ||
|
||
@Override | ||
public void render(RenderManager rm, ViewPort vp) { | ||
if(BAKE_NEEDED){ | ||
BAKE_NEEDED=false; | ||
rebakeNow(); | ||
} | ||
} | ||
|
||
public void rebake(){ | ||
BAKE_NEEDED=true; | ||
} | ||
|
||
void rebakeNow() { | ||
System.out.println("BAKE"); | ||
|
||
IBLGLEnvBakerLight baker = new IBLGLEnvBakerLight(renderManager, assetManager, Format.RGB16F, Format.Depth, | ||
envMapSize, envMapSize); | ||
|
||
|
||
baker.bakeEnvironment(spatial, Vector3f.ZERO, 0.001f, 1000f,filter); | ||
baker.bakeSpecularIBL(); | ||
baker.bakeSphericalHarmonicsCoefficients(); | ||
|
||
|
||
// probe.setPosition(Vector3f.ZERO); | ||
setPrefilteredMap(baker.getSpecularIBL()); | ||
setNbMipMaps(getPrefilteredEnvMap().getImage().getMipMapSizes().length); | ||
setShCoeffs(baker.getSphericalHarmonicsCoefficients()); | ||
setPosition(Vector3f.ZERO); | ||
setReady(true); | ||
|
||
baker.clean(); | ||
|
||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
40 changes: 40 additions & 0 deletions
40
jme3-examples/src/main/java/jme3test/light/pbr/TestPBRSimple.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
package jme3test.light.pbr; | ||
|
||
import com.jme3.app.SimpleApplication; | ||
import com.jme3.environment.EnvironmentProbeControl; | ||
import com.jme3.material.Material; | ||
import com.jme3.scene.Geometry; | ||
import com.jme3.scene.Spatial; | ||
import com.jme3.util.SkyFactory; | ||
import com.jme3.util.mikktspace.MikktspaceTangentGenerator; | ||
|
||
/** | ||
* TestPBRSimple | ||
*/ | ||
public class TestPBRSimple extends SimpleApplication{ | ||
|
||
public static void main(String[] args) { | ||
new TestPBRSimple().start(); | ||
} | ||
|
||
@Override | ||
public void simpleInitApp() { | ||
|
||
Geometry model = (Geometry) assetManager.loadModel("Models/Tank/tank.j3o"); | ||
MikktspaceTangentGenerator.generate(model); | ||
|
||
Material pbrMat = assetManager.loadMaterial("Models/Tank/tank.j3m"); | ||
model.setMaterial(pbrMat); | ||
|
||
rootNode.attachChild(model); | ||
|
||
|
||
EnvironmentProbeControl envProbe=new EnvironmentProbeControl(renderManager,assetManager,256); | ||
rootNode.addControl(envProbe); | ||
|
||
Spatial sky = SkyFactory.createSky(assetManager, "Textures/Sky/Path.hdr", SkyFactory.EnvMapType.EquirectMap); | ||
rootNode.attachChild(sky); | ||
EnvironmentProbeControl.tag(sky); | ||
} | ||
|
||
} |