-
-
Save zzuegg/e38bcbb013506806c3603b422a93cd4b to your computer and use it in GitHub Desktop.
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
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