envCam.setPosition(probe.getPosition()); probe.setReady(false); if (probe.getPrefilteredEnvMap() != null) { probe.getPrefilteredEnvMap().getImage().dispose(); probe.setPrefilteredMap(EnvMapUtils.createPrefilteredEnvMap(envCam.getSize(), envCam.getImageFormat()));
final LightProbe probe = new LightProbe(); probe.setPosition(envCam.getPosition()); probe.setPrefilteredMap(EnvMapUtils.createPrefilteredEnvMap(envCam.getSize(), envCam.getImageFormat())); envCam.snapshot(scene, new JobProgressAdapter<TextureCubeMap>() {
@Override public void simpleUpdate(float tpf) { frame++; if (frame == 2) { final LightProbe probe = LightProbeFactory.makeProbe(stateManager.getState(EnvironmentCamera.class), rootNode, EnvMapUtils.GenerationType.Fast, new JobProgressAdapter<LightProbe>() { @Override public void done(LightProbe result) { System.err.println("Done rendering env maps"); tex = EnvMapUtils.getCubeMapCrossDebugViewWithMipMaps(result.getPrefilteredEnvMap(), assetManager); rootNode.getChild(0).setCullHint(Spatial.CullHint.Dynamic); } }); ((SphereProbeArea) probe.getArea()).setRadius(100); rootNode.addLight(probe); } } }
@Override public void populateProbes(Geometry g, LightList lightList) { if (!lightProbes.isEmpty()) { //The 3 first probes are the closest to the geometry since the //light list is sorted according to the distance to the geom. int addedProbes = 0; for (LightProbe p : lightProbes) { if (p.isReady() && p.isEnabled()) { lightList.add(p); addedProbes ++; } if (addedProbes == MAX_PROBES) { break; } } //clearing the list for next pass. lightProbes.clear(); } }
private int setProbeData(RenderManager rm, int lastTexUnit, Uniform lightProbeData, Uniform shCoeffs, Uniform lightProbePemMap, LightProbe lightProbe) { lightProbeData.setValue(VarType.Matrix4, lightProbe.getUniformMatrix()); //setVector4InArray(lightProbe.getPosition().x, lightProbe.getPosition().y, lightProbe.getPosition().z, 1f / area.getRadius() + lightProbe.getNbMipMaps(), 0); shCoeffs.setValue(VarType.Vector3Array, lightProbe.getShCoeffs()); //assigning new texture indexes int pemUnit = lastTexUnit++; rm.getRenderer().setTexture(pemUnit, lightProbe.getPrefilteredEnvMap()); lightProbePemMap.setValue(VarType.Int, pemUnit); return lastTexUnit; }
@Override public void done(Integer result) { if (globalListener != null) { if (result < 6) { globalListener.step("Prefiltered env map face " + result + " generated"); } else { globalListener.step("Irradiance map generated"); } } jobState.done[index] = true; if (jobState.isDone()) { probe.setNbMipMaps(probe.getPrefilteredEnvMap().getImage().getMipMapSizes().length); probe.setReady(true); if (globalListener != null) { globalListener.done(probe); } jobState.executor.shutdownNow(); } } }
Material m = probeGeom.getMaterial(); probeGeom.setLocalScale(probeScale); if (probe.isReady()) { m.setTexture("CubeMap", probe.getPrefilteredEnvMap()); n.setLocalTranslation(probe.getPosition()); n.getChild(1).setLocalScale(probe.getArea().getRadius()); break; default:
BoundingSphere s = (BoundingSphere)lightProbe.getBounds(); lightProbeData.setVector4InArray(lightProbe.getPosition().x, lightProbe.getPosition().y, lightProbe.getPosition().z, 1f / s.getRadius() + lightProbe.getNbMipMaps(), 0); shCoeffs.setValue(VarType.Vector3Array, lightProbe.getShCoeffs()); rm.getRenderer().setTexture(pemUnit, lightProbe.getPrefilteredEnvMap()); lightProbePemMap.setValue(VarType.Int, pemUnit); } else {
Material m = probeGeom.getMaterial(); probeGeom.setLocalScale(probeScale); if (probe.isReady()) { m.setTexture("CubeMap", probe.getPrefilteredEnvMap()); n.setLocalTranslation(probe.getPosition()); n.getChild(1).setLocalScale(((BoundingSphere) probe.getBounds()).getRadius()); break; default:
@Override public void done(LightProbe result) { System.err.println("Done rendering env maps"); tex = EnvMapUtils.getCubeMapCrossDebugViewWithMipMaps(result.getPrefilteredEnvMap(), assetManager); } });
/** * For debuging porpose only * Will return a Node meant to be added to a GUI presenting the 2 cube maps in a cross pattern with all the mip maps. * * @param manager the asset manager * @return a debug node */ public static Node getDebugGui(AssetManager manager, LightProbe probe) { if (!probe.isReady()) { throw new UnsupportedOperationException("This EnvProbe is not ready yet, try to test isReady()"); } Node debugNode = new Node("debug gui probe"); Node debugPfemCm = EnvMapUtils.getCubeMapCrossDebugViewWithMipMaps(probe.getPrefilteredEnvMap(), manager); debugNode.attachChild(debugPfemCm); debugPfemCm.setLocalTranslation(520, 0, 0); return debugNode; }
@Override public void populateProbes(Geometry g, LightList lightList) { if (!lightProbes.isEmpty()) { //The first probe is actually the closest to the geometry since the //light list is sorted according to the distance to the geom. LightProbe p = lightProbes.get(0); if (p.isReady()) { lightList.add(p); } //clearing the list for next pass. lightProbes.clear(); } }
@Override public void done(Integer result) { if (globalListener != null) { if (result < 6) { globalListener.step("Prefiltered env map face " + result + " generated"); } else { globalListener.step("Irradiance map generated"); } } jobState.done[index] = true; if (jobState.isDone()) { probe.setNbMipMaps(probe.getPrefilteredEnvMap().getImage().getMipMapSizes().length); probe.setReady(true); if (globalListener != null) { globalListener.done(probe); } jobState.executor.shutdownNow(); } } }
@Override public void done(LightProbe result) { System.err.println("Done rendering env maps"); tex = EnvMapUtils.getCubeMapCrossDebugViewWithMipMaps(result.getPrefilteredEnvMap(), assetManager); rootNode.getChild(0).setCullHint(Spatial.CullHint.Dynamic); } });
public void populateProbe(LightList lightList){ if(probe != null && probe.isReady()){ lightList.add(probe); } }
envCam.setPosition(probe.getPosition()); probe.setReady(false); if (probe.getPrefilteredEnvMap() != null) { probe.getPrefilteredEnvMap().getImage().dispose(); probe.setPrefilteredMap(EnvMapUtils.createPrefilteredEnvMap(envCam.getSize(), envCam.getImageFormat()));
final LightProbe probe = new LightProbe(); probe.setPosition(envCam.getPosition()); probe.setPrefilteredMap(EnvMapUtils.createPrefilteredEnvMap(envCam.getSize(), envCam.getImageFormat())); envCam.snapshot(scene, new JobProgressAdapter<TextureCubeMap>() {
/** * Internally called to generate the maps. * This method will spawn 7 thread (one for the Irradiance spherical harmonics generator, and one for each face of the prefiltered env map). * Those threads will be executed in a ScheduledThreadPoolExecutor that will be shutdown when the generation is done. * * @param envMap the raw env map rendered by the env camera * @param probe the LightProbe to generate maps for * @param app the Application * @param listener a progress listener. (can be null if no progress reporting is needed) */ private static void generatePbrMaps(TextureCubeMap envMap, final LightProbe probe, Application app, EnvMapUtils.GenerationType genType, final JobProgressListener<LightProbe> listener) { IrradianceSphericalHarmonicsGenerator irrShGenerator; PrefilteredEnvMapFaceGenerator[] pemGenerators = new PrefilteredEnvMapFaceGenerator[6]; final JobState jobState = new JobState(new ScheduledThreadPoolExecutor(7)); irrShGenerator = new IrradianceSphericalHarmonicsGenerator(app, new JobListener(listener, jobState, probe, 6)); int size = envMap.getImage().getWidth(); irrShGenerator.setGenerationParam(EnvMapUtils.duplicateCubeMap(envMap), probe); jobState.executor.execute(irrShGenerator); for (int i = 0; i < pemGenerators.length; i++) { pemGenerators[i] = new PrefilteredEnvMapFaceGenerator(app, i, new JobListener(listener, jobState, probe, i)); pemGenerators[i].setGenerationParam(EnvMapUtils.duplicateCubeMap(envMap), size, EnvMapUtils.FixSeamsMethod.None, genType, probe.getPrefilteredEnvMap()); jobState.executor.execute(pemGenerators[i]); } }
@Override public void populateProbes(Geometry g, LightList lightList) { if (!lightProbes.isEmpty()) { //The first probe is actually the closest to the geometry since the //light list is sorted according to the distance to the geom. LightProbe p = lightProbes.get(0); if (p.isReady()) { lightList.add(p); } //clearing the list for next pass. lightProbes.clear(); } }
@Override public void simpleUpdate(float tpf) { frame++; if (frame == 2) { modelNode.removeFromParent(); 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); } }); ((SphereProbeArea) probe.getArea()).setRadius(100); rootNode.addLight(probe); //getStateManager().getState(EnvironmentManager.class).addEnvProbe(probe); } if (frame > 10 && modelNode.getParent() == null) { rootNode.attachChild(modelNode); } }