Skip to content

Instantly share code, notes, and snippets.

@zzuegg
Created November 23, 2022 08:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zzuegg/e38bcbb013506806c3603b422a93cd4b to your computer and use it in GitHub Desktop.
Save zzuegg/e38bcbb013506806c3603b422a93cd4b to your computer and use it in GitHub Desktop.
package tech.diis.illuminas.examples;
import com.jme3.app.SimpleApplication;
import com.jme3.light.SpotLight;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.FastMath;
import com.jme3.math.Vector3f;
import com.jme3.renderer.Camera;
import com.jme3.renderer.queue.GeometryList;
import com.jme3.renderer.queue.OpaqueComparator;
import com.jme3.renderer.queue.RenderQueue;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.scene.shape.Quad;
import com.jme3.shadow.ShadowUtil;
import com.jme3.texture.FrameBuffer;
import com.jme3.texture.Image;
import com.jme3.texture.Texture2D;
public class TestRenderTargetSize extends SimpleApplication {
int targetsize[];
FrameBuffer[] frameBuffers;
Camera[] cameras;
Texture2D[] result;
Geometry[] displayResult;
SpotLight spotLight;
@Override
public void simpleInitApp() {
flyCam.setMoveSpeed(20f);
spotLight = new SpotLight();
spotLight.setSpotOuterAngle(30*FastMath.DEG_TO_RAD);
spotLight.setSpotRange(100f);
rootNode.addLight(spotLight);
targetsize = new int[]{
128,
256,
512,
1024,
2048
};
buildScene();
buildCameras();
renderCameras();
}
@Override
public void simpleUpdate(float tpf) {
super.simpleUpdate(tpf);
spotLight.setPosition(cam.getLocation());
spotLight.setDirection(cam.getDirection());
renderCameras();
}
private void renderCameras() {
GeometryList list = new GeometryList(new OpaqueComparator());
for (int i = 0; i < targetsize.length; i++) {
cameras[i].setFrustumPerspective(spotLight.getSpotOuterAngle() * FastMath.RAD_TO_DEG * 2.0f, 1, 1f, spotLight.getSpotRange());
cameras[i].getRotation().lookAt(spotLight.getDirection(), cam.getUp());
cameras[i].setLocation(spotLight.getPosition());
cameras[i].update();
cameras[i].onFrameChange();
//cameras[i].updateViewProjection();
list.clear();
ShadowUtil.getGeometriesInCamFrustum(rootNode, cameras[i], RenderQueue.ShadowMode.CastAndReceive, list);
renderManager.getRenderer().setFrameBuffer(frameBuffers[i]);
renderManager.getRenderer().clearBuffers(true, true, true);
renderManager.setCamera(cameras[i], false);
viewPort.getQueue().renderShadowQueue(list, renderManager, cameras[i], true);
}
renderManager.setCamera(cam, false);
renderManager.getRenderer().setFrameBuffer(null);
}
private void buildCameras() {
frameBuffers = new FrameBuffer[targetsize.length];
cameras = new Camera[targetsize.length];
result = new Texture2D[targetsize.length];
displayResult = new Geometry[targetsize.length];
Geometry viewGeometry = new Geometry("view", new Quad(1, 1));
Material viewGeometryMaterial = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
viewGeometry.setMaterial(viewGeometryMaterial);
for (int i = 0; i < targetsize.length; i++) {
cameras[i] = new Camera(targetsize[i], targetsize[i]);
frameBuffers[i] = new FrameBuffer(targetsize[i], targetsize[i], 1);
result[i] = new Texture2D(targetsize[i], targetsize[i], Image.Format.RGB8);
frameBuffers[i].addColorTarget(FrameBuffer.FrameBufferTarget.newTarget(result[i]));
frameBuffers[i].setDepthTarget(FrameBuffer.FrameBufferTarget.newTarget(new Texture2D(targetsize[i], targetsize[i], Image.Format.Depth24)));
displayResult[i] = viewGeometry.clone();
displayResult[i].getMaterial().setTexture("ColorMap", result[i]);
displayResult[i].setLocalScale(200);
displayResult[i].setLocalTranslation(i * 205, cam.getHeight() - 205, 0);
guiNode.attachChild(displayResult[i]);
}
}
private void buildScene() {
Material material = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
Geometry geometry = new Geometry("Box", new Box(1, 1, 1));
geometry.setShadowMode(RenderQueue.ShadowMode.CastAndReceive);
geometry.setMaterial(material);
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
Geometry clone = geometry.clone();
clone.setLocalTranslation(i * 3, 0, j * 3);
clone.getMaterial().setColor("Color", ColorRGBA.randomColor());
rootNode.attachChild(clone);
}
}
}
public static void main(String[] args) {
new TestRenderTargetSize().start();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment