aboutsummaryrefslogtreecommitdiff
path: root/engine/src/core-effects/com/jme3/water/ReflectionProcessor.java
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/core-effects/com/jme3/water/ReflectionProcessor.java')
-rw-r--r--engine/src/core-effects/com/jme3/water/ReflectionProcessor.java125
1 files changed, 125 insertions, 0 deletions
diff --git a/engine/src/core-effects/com/jme3/water/ReflectionProcessor.java b/engine/src/core-effects/com/jme3/water/ReflectionProcessor.java
new file mode 100644
index 0000000..9a14df8
--- /dev/null
+++ b/engine/src/core-effects/com/jme3/water/ReflectionProcessor.java
@@ -0,0 +1,125 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.jme3.water;
+
+import com.jme3.math.Plane;
+import com.jme3.post.SceneProcessor;
+import com.jme3.renderer.Camera;
+import com.jme3.renderer.RenderManager;
+import com.jme3.renderer.ViewPort;
+import com.jme3.renderer.queue.RenderQueue;
+import com.jme3.texture.FrameBuffer;
+
+/**
+ * Reflection Processor
+ * Used to render the reflected scene in an off view port
+ */
+public class ReflectionProcessor implements SceneProcessor {
+
+ private RenderManager rm;
+ private ViewPort vp;
+ private Camera reflectionCam;
+ private FrameBuffer reflectionBuffer;
+ private Plane reflectionClipPlane;
+
+ /**
+ * Creates a ReflectionProcessor
+ * @param reflectionCam the cam to use for reflection
+ * @param reflectionBuffer the FrameBuffer to render to
+ * @param reflectionClipPlane the clipping plane
+ */
+ public ReflectionProcessor(Camera reflectionCam, FrameBuffer reflectionBuffer, Plane reflectionClipPlane) {
+ this.reflectionCam = reflectionCam;
+ this.reflectionBuffer = reflectionBuffer;
+ this.reflectionClipPlane = reflectionClipPlane;
+ }
+
+ public void initialize(RenderManager rm, ViewPort vp) {
+ this.rm = rm;
+ this.vp = vp;
+ }
+
+ public void reshape(ViewPort vp, int w, int h) {
+ }
+
+ public boolean isInitialized() {
+ return rm != null;
+ }
+
+ public void preFrame(float tpf) {
+ }
+
+ public void postQueue(RenderQueue rq) {
+ //we need special treatement for the sky because it must not be clipped
+ rm.getRenderer().setFrameBuffer(reflectionBuffer);
+ reflectionCam.setProjectionMatrix(null);
+ rm.setCamera(reflectionCam, false);
+ rm.getRenderer().clearBuffers(true, true, true);
+ //Rendering the sky whithout clipping
+ rm.getRenderer().setDepthRange(1, 1);
+ vp.getQueue().renderQueue(RenderQueue.Bucket.Sky, rm, reflectionCam, true);
+ rm.getRenderer().setDepthRange(0, 1);
+ //setting the clip plane to the cam
+ reflectionCam.setClipPlane(reflectionClipPlane, Plane.Side.Positive);//,1
+ rm.setCamera(reflectionCam, false);
+
+ }
+
+ public void postFrame(FrameBuffer out) {
+ }
+
+ public void cleanup() {
+ }
+
+ /**
+ * Internal use only<br>
+ * returns the frame buffer
+ * @return
+ */
+ public FrameBuffer getReflectionBuffer() {
+ return reflectionBuffer;
+ }
+
+ /**
+ * Internal use only<br>
+ * sets the frame buffer
+ * @param reflectionBuffer
+ */
+ public void setReflectionBuffer(FrameBuffer reflectionBuffer) {
+ this.reflectionBuffer = reflectionBuffer;
+ }
+
+ /**
+ * returns the reflection cam
+ * @return
+ */
+ public Camera getReflectionCam() {
+ return reflectionCam;
+ }
+
+ /**
+ * sets the reflection cam
+ * @param reflectionCam
+ */
+ public void setReflectionCam(Camera reflectionCam) {
+ this.reflectionCam = reflectionCam;
+ }
+
+ /**
+ * returns the reflection clip plane
+ * @return
+ */
+ public Plane getReflectionClipPlane() {
+ return reflectionClipPlane;
+ }
+
+ /**
+ * Sets the reflection clip plane
+ * @param reflectionClipPlane
+ */
+ public void setReflectionClipPlane(Plane reflectionClipPlane) {
+ this.reflectionClipPlane = reflectionClipPlane;
+ }
+}