package jme3test.light.pbr; import com.jme3.app.SimpleApplication; import com.jme3.bounding.BoundingSphere; import com.jme3.environment.EnvironmentCamera; import com.jme3.environment.LightProbeFactory; import com.jme3.environment.generation.JobProgressAdapter; import com.jme3.environment.util.EnvMapUtils; import com.jme3.input.KeyInput; import com.jme3.input.controls.ActionListener; import com.jme3.input.controls.KeyTrigger; import com.jme3.light.LightProbe; import com.jme3.material.Material; import com.jme3.math.ColorRGBA; import com.jme3.math.Quaternion; import com.jme3.math.Vector3f; import com.jme3.scene.Geometry; import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.ui.Picture; import com.jme3.util.MaterialDebugAppState; /** * test * * @author nehon */ public class RefEnv extends SimpleApplication { private Node tex; private Node ref; private Picture refDE; private Picture refM; public static void main(String[] args) { RefEnv app = new RefEnv(); app.start(); } @Override public void simpleInitApp() { cam.setLocation(new Vector3f(-2.3324413f, 2.9567573f, 4.6054406f)); cam.setRotation(new Quaternion(0.06310794f, 0.9321281f, -0.29613864f, 0.1986369f)); Spatial sc = assetManager.loadModel("Scenes/PBR/spheres.j3o"); rootNode.attachChild(sc); rootNode.getChild("Scene").setCullHint(Spatial.CullHint.Always); ref = new Node("reference pictures"); refDE = new Picture("refDE"); refDE.setHeight(cam.getHeight()); refDE.setWidth(cam.getWidth()); refDE.setImage(assetManager,"jme3test/light/pbr/spheresRefDE.png", false); refM = new Picture("refM"); refM.setImage(assetManager,"jme3test/light/pbr/spheresRefM.png", false); refM.setHeight(cam.getHeight()); refM.setWidth(cam.getWidth()); ref.attachChild(refDE); stateManager.attach(new EnvironmentCamera()); inputManager.addMapping("tex", new KeyTrigger(KeyInput.KEY_SPACE)); inputManager.addMapping("switch", new KeyTrigger(KeyInput.KEY_RETURN)); inputManager.addMapping("ref", new KeyTrigger(KeyInput.KEY_R)); inputManager.addListener(new ActionListener() { @Override public void onAction(String name, boolean isPressed, float tpf) { if (name.equals("tex") && isPressed) { if (tex == null) { return; } if (tex.getParent() == null) { guiNode.attachChild(tex); } else { tex.removeFromParent(); } } if (name.equals("switch") && isPressed) { switchMat(rootNode.getChild("Scene")); } if (name.equals("ref") && isPressed) { if (ref.getParent() == null) { guiNode.attachChild(ref); } else { ref.removeFromParent(); } } } }, "tex", "switch", "ref"); } private void switchMat(Spatial s) { if (s instanceof Node) { Node n = (Node) s; for (Spatial children : n.getChildren()) { switchMat(children); } } else if (s instanceof Geometry) { Geometry g = (Geometry) s; Material mat = g.getMaterial(); if (((Float) mat.getParam("Metallic").getValue()) == 1f) { mat.setFloat("Metallic", 0); mat.setColor("BaseColor", ColorRGBA.Black); ref.attachChild(refDE); refM.removeFromParent(); } else { mat.setFloat("Metallic", 1); mat.setColor("BaseColor", ColorRGBA.White); ref.attachChild(refM); refDE.removeFromParent(); } } } private int frame = 0; @Override public void simpleUpdate(float tpf) { frame++; if (frame == 2) { final LightProbe probe = LightProbeFactory.makeProbe(stateManager.getState(EnvironmentCamera.class), rootNode, new JobProgressAdapter<LightProbe>() { @Override public void done(LightProbe result) { System.err.println("Done rendering env maps"); tex = EnvMapUtils.getCubeMapCrossDebugViewWithMipMaps(result.getPrefilteredEnvMap(), assetManager); // guiNode.attachChild(tex); rootNode.getChild("Scene").setCullHint(Spatial.CullHint.Dynamic); } }); ((BoundingSphere) probe.getBounds()).setRadius(100); rootNode.addLight(probe); } } }