aboutsummaryrefslogtreecommitdiff
path: root/engine/src/core/com/jme3/renderer/ViewPort.java
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/core/com/jme3/renderer/ViewPort.java')
-rw-r--r--engine/src/core/com/jme3/renderer/ViewPort.java363
1 files changed, 363 insertions, 0 deletions
diff --git a/engine/src/core/com/jme3/renderer/ViewPort.java b/engine/src/core/com/jme3/renderer/ViewPort.java
new file mode 100644
index 0000000..ad9ab2f
--- /dev/null
+++ b/engine/src/core/com/jme3/renderer/ViewPort.java
@@ -0,0 +1,363 @@
+/*
+ * Copyright (c) 2009-2012 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.jme3.renderer;
+
+import com.jme3.math.ColorRGBA;
+import com.jme3.post.SceneProcessor;
+import com.jme3.renderer.queue.RenderQueue;
+import com.jme3.scene.Spatial;
+import com.jme3.texture.FrameBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A <code>ViewPort</code> represents a view inside the display
+ * window or a {@link FrameBuffer} to which scenes will be rendered.
+ * <p>
+ * A viewport has a {@link #ViewPort(java.lang.String, com.jme3.renderer.Camera) camera}
+ * which is used to render a set of {@link #attachScene(com.jme3.scene.Spatial) scenes}.
+ * A view port has a location on the screen as set by the
+ * {@link Camera#setViewPort(float, float, float, float) } method.
+ * By default, a view port does not clear the framebuffer, but it can be
+ * set to {@link #setClearFlags(boolean, boolean, boolean) clear the framebuffer}.
+ * The background color which the color buffer is cleared to can be specified
+ * via the {@link #setBackgroundColor(com.jme3.math.ColorRGBA)} method.
+ * <p>
+ * A ViewPort has a list of {@link SceneProcessor}s which can
+ * control how the ViewPort is rendered by the {@link RenderManager}.
+ *
+ * @author Kirill Vainer
+ *
+ * @see RenderManager
+ * @see SceneProcessor
+ * @see Spatial
+ * @see Camera
+ */
+public class ViewPort {
+
+ protected final String name;
+ protected final Camera cam;
+ protected final RenderQueue queue = new RenderQueue();
+ protected final ArrayList<Spatial> sceneList = new ArrayList<Spatial>();
+ protected final ArrayList<SceneProcessor> processors = new ArrayList<SceneProcessor>();
+ protected FrameBuffer out = null;
+
+ protected final ColorRGBA backColor = new ColorRGBA(0,0,0,0);
+ protected boolean clearDepth = false, clearColor = false, clearStencil = false;
+ private boolean enabled = true;
+
+ /**
+ * Create a new viewport. User code should generally use these methods instead:<br>
+ * <ul>
+ * <li>{@link RenderManager#createPreView(java.lang.String, com.jme3.renderer.Camera) }</li>
+ * <li>{@link RenderManager#createMainView(java.lang.String, com.jme3.renderer.Camera) }</li>
+ * <li>{@link RenderManager#createPostView(java.lang.String, com.jme3.renderer.Camera) }</li>
+ * </ul>
+ *
+ * @param name The name of the viewport. Used for debugging only.
+ * @param cam The camera through which the viewport is rendered. The camera
+ * cannot be swapped to a different one after creating the viewport.
+ */
+ public ViewPort(String name, Camera cam) {
+ this.name = name;
+ this.cam = cam;
+ }
+
+ /**
+ * Returns the name of the viewport as set in the constructor.
+ *
+ * @return the name of the viewport
+ *
+ * @see #ViewPort(java.lang.String, com.jme3.renderer.Camera)
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Get the list of {@link SceneProcessor scene processors} that were
+ * added to this <code>ViewPort</code>
+ *
+ * @return the list of processors attached to this ViewPort
+ *
+ * @see #addProcessor(com.jme3.post.SceneProcessor)
+ */
+ public List<SceneProcessor> getProcessors(){
+ return processors;
+ }
+
+ /**
+ * Adds a {@link SceneProcessor} to this ViewPort.
+ * <p>
+ * SceneProcessors that are added to the ViewPort will be notified
+ * of events as the ViewPort is being rendered by the {@link RenderManager}.
+ *
+ * @param processor The processor to add
+ *
+ * @see SceneProcessor
+ */
+ public void addProcessor(SceneProcessor processor){
+ processors.add(processor);
+ }
+
+ /**
+ * Removes a {@link SceneProcessor} from this ViewPort.
+ * <p>
+ * The processor will no longer receive events occurring to this ViewPort.
+ *
+ * @param processor The processor to remove
+ *
+ * @see SceneProcessor
+ */
+ public void removeProcessor(SceneProcessor processor){
+ processors.remove(processor);
+ processor.cleanup();
+ }
+
+ /**
+ * Check if depth buffer clearing is enabled.
+ *
+ * @return true if depth buffer clearing is enabled.
+ *
+ * @see #setClearDepth(boolean)
+ */
+ public boolean isClearDepth() {
+ return clearDepth;
+ }
+
+ /**
+ * Enable or disable clearing of the depth buffer for this ViewPort.
+ * <p>
+ * By default depth clearing is disabled.
+ *
+ * @param clearDepth Enable/disable depth buffer clearing.
+ */
+ public void setClearDepth(boolean clearDepth) {
+ this.clearDepth = clearDepth;
+ }
+
+ /**
+ * Check if color buffer clearing is enabled.
+ *
+ * @return true if color buffer clearing is enabled.
+ *
+ * @see #setClearColor(boolean)
+ */
+ public boolean isClearColor() {
+ return clearColor;
+ }
+
+ /**
+ * Enable or disable clearing of the color buffer for this ViewPort.
+ * <p>
+ * By default color clearing is disabled.
+ *
+ * @param clearColor Enable/disable color buffer clearing.
+ */
+ public void setClearColor(boolean clearColor) {
+ this.clearColor = clearColor;
+ }
+
+ /**
+ * Check if stencil buffer clearing is enabled.
+ *
+ * @return true if stencil buffer clearing is enabled.
+ *
+ * @see #setClearStencil(boolean)
+ */
+ public boolean isClearStencil() {
+ return clearStencil;
+ }
+
+ /**
+ * Enable or disable clearing of the stencil buffer for this ViewPort.
+ * <p>
+ * By default stencil clearing is disabled.
+ *
+ * @param clearStencil Enable/disable stencil buffer clearing.
+ */
+ public void setClearStencil(boolean clearStencil) {
+ this.clearStencil = clearStencil;
+ }
+
+ /**
+ * Set the clear flags (color, depth, stencil) in one call.
+ *
+ * @param color If color buffer clearing should be enabled.
+ * @param depth If depth buffer clearing should be enabled.
+ * @param stencil If stencil buffer clearing should be enabled.
+ *
+ * @see #setClearColor(boolean)
+ * @see #setClearDepth(boolean)
+ * @see #setClearStencil(boolean)
+ */
+ public void setClearFlags(boolean color, boolean depth, boolean stencil){
+ this.clearColor = color;
+ this.clearDepth = depth;
+ this.clearStencil = stencil;
+ }
+
+ /**
+ * Returns the framebuffer where this ViewPort's scenes are
+ * rendered to.
+ *
+ * @return the framebuffer where this ViewPort's scenes are
+ * rendered to.
+ *
+ * @see #setOutputFrameBuffer(com.jme3.texture.FrameBuffer)
+ */
+ public FrameBuffer getOutputFrameBuffer() {
+ return out;
+ }
+
+ /**
+ * Sets the output framebuffer for the ViewPort.
+ * <p>
+ * The output framebuffer specifies where the scenes attached
+ * to this ViewPort are rendered to. By default this is <code>null</code>
+ * which indicates the scenes are rendered to the display window.
+ *
+ * @param out The framebuffer to render scenes to, or null if to render
+ * to the screen.
+ */
+ public void setOutputFrameBuffer(FrameBuffer out) {
+ this.out = out;
+ }
+
+ /**
+ * Returns the camera which renders the attached scenes.
+ *
+ * @return the camera which renders the attached scenes.
+ *
+ * @see Camera
+ */
+ public Camera getCamera() {
+ return cam;
+ }
+
+ /**
+ * Internal use only.
+ */
+ public RenderQueue getQueue() {
+ return queue;
+ }
+
+ /**
+ * Attaches a new scene to render in this ViewPort.
+ *
+ * @param scene The scene to attach
+ *
+ * @see Spatial
+ */
+ public void attachScene(Spatial scene){
+ sceneList.add(scene);
+ }
+
+ /**
+ * Detaches a scene from rendering.
+ *
+ * @param scene The scene to detach
+ *
+ * @see #attachScene(com.jme3.scene.Spatial)
+ */
+ public void detachScene(Spatial scene){
+ sceneList.remove(scene);
+ }
+
+ /**
+ * Removes all attached scenes.
+ *
+ * @see #attachScene(com.jme3.scene.Spatial)
+ */
+ public void clearScenes() {
+ sceneList.clear();
+ }
+
+ /**
+ * Returns a list of all attached scenes.
+ *
+ * @return a list of all attached scenes.
+ *
+ * @see #attachScene(com.jme3.scene.Spatial)
+ */
+ public List<Spatial> getScenes(){
+ return sceneList;
+ }
+
+ /**
+ * Sets the background color.
+ * <p>
+ * When the ViewPort's color buffer is cleared
+ * (if {@link #setClearColor(boolean) color clearing} is enabled),
+ * this specifies the color to which the color buffer is set to.
+ * By default the background color is black without alpha.
+ *
+ * @param background the background color.
+ */
+ public void setBackgroundColor(ColorRGBA background){
+ backColor.set(background);
+ }
+
+ /**
+ * Returns the background color of this ViewPort
+ *
+ * @return the background color of this ViewPort
+ *
+ * @see #setBackgroundColor(com.jme3.math.ColorRGBA)
+ */
+ public ColorRGBA getBackgroundColor(){
+ return backColor;
+ }
+
+ /**
+ * Enable or disable this ViewPort.
+ * <p>
+ * Disabled ViewPorts are skipped by the {@link RenderManager} when
+ * rendering. By default all ViewPorts are enabled.
+ *
+ * @param enable If the viewport should be disabled or enabled.
+ */
+ public void setEnabled(boolean enable) {
+ this.enabled = enable;
+ }
+
+ /**
+ * Returns true if the viewport is enabled, false otherwise.
+ * @return true if the viewport is enabled, false otherwise.
+ * @see #setEnabled(boolean)
+ */
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+}