diff --git a/engine/src/desktop-fx/com/jme3/post/HDRConfig.form b/engine/src/desktop-fx/com/jme3/post/HDRConfig.form
deleted file mode 100644
index 438de32e8..000000000
--- a/engine/src/desktop-fx/com/jme3/post/HDRConfig.form
+++ /dev/null
@@ -1,126 +0,0 @@
-
-
-
diff --git a/engine/src/desktop-fx/com/jme3/post/HDRConfig.java b/engine/src/desktop-fx/com/jme3/post/HDRConfig.java
deleted file mode 100644
index 6d5002f8f..000000000
--- a/engine/src/desktop-fx/com/jme3/post/HDRConfig.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.post;
-
-public class HDRConfig extends javax.swing.JFrame {
-
- private float gamma, a, white;
- private int lod;
- private HDRRenderer hdrRender;
-
- public HDRConfig(HDRRenderer hdrRender) {
- initComponents();
- this.hdrRender = hdrRender;
- sldWhiteStateChanged(null);
- sldGammaStateChanged(null);
- sldLODStateChanged(null);
- jComboBox1ActionPerformed(null);
- }
-
- public float getA() {
- return a;
- }
-
- public float getGamma() {
- return gamma;
- }
-
- public int getLod() {
- return lod;
- }
-
- public float getWhite() {
- return white;
- }
-
- private void updateHdr(){
- hdrRender.setWhiteLevel(getWhite());
- hdrRender.setThrottle(getLod());
- hdrRender.setExposure(getA());
- }
-
- /** This method is called from within the constructor to
- * initialize the form.
- * WARNING: Do NOT modify this code. The content of this method is
- * always regenerated by the Form Editor.
- */
- @SuppressWarnings("unchecked")
- // //GEN-BEGIN:initComponents
- private void initComponents() {
-
- pnlBright = new javax.swing.JPanel();
- lblWhite = new javax.swing.JLabel();
- sldWhite = new javax.swing.JSlider();
- pnlGamma = new javax.swing.JPanel();
- lblGamma = new javax.swing.JLabel();
- sldGamma = new javax.swing.JSlider();
- pnlA = new javax.swing.JPanel();
- lblA = new javax.swing.JLabel();
- jComboBox1 = new javax.swing.JComboBox();
- pnlLOD = new javax.swing.JPanel();
- lblLOD = new javax.swing.JLabel();
- sldLOD = new javax.swing.JSlider();
-
- setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
- setTitle("HDR Configuration");
- getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(), javax.swing.BoxLayout.Y_AXIS));
-
- lblWhite.setText("Maximum Brightness: ");
- pnlBright.add(lblWhite);
-
- sldWhite.setMaximum(1000);
- sldWhite.setValue(100);
- sldWhite.setPreferredSize(new java.awt.Dimension(100, 23));
- sldWhite.addChangeListener(new javax.swing.event.ChangeListener() {
- public void stateChanged(javax.swing.event.ChangeEvent evt) {
- sldWhiteStateChanged(evt);
- }
- });
- pnlBright.add(sldWhite);
-
- getContentPane().add(pnlBright);
-
- lblGamma.setText("Output Gamma: ");
- pnlGamma.add(lblGamma);
-
- sldGamma.setMaximum(500);
- sldGamma.setMinimum(1);
- sldGamma.setValue(100);
- sldGamma.setPreferredSize(new java.awt.Dimension(100, 23));
- sldGamma.addChangeListener(new javax.swing.event.ChangeListener() {
- public void stateChanged(javax.swing.event.ChangeEvent evt) {
- sldGammaStateChanged(evt);
- }
- });
- pnlGamma.add(sldGamma);
-
- getContentPane().add(pnlGamma);
-
- lblA.setText("Exposure: ");
- pnlA.add(lblA);
-
- jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Dark", "Dim", "Normal", "Light" }));
- jComboBox1.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- jComboBox1ActionPerformed(evt);
- }
- });
- pnlA.add(jComboBox1);
-
- getContentPane().add(pnlA);
-
- lblLOD.setText("Leve of detail: ");
- pnlLOD.add(lblLOD);
-
- sldLOD.setMaximum(15);
- sldLOD.setMinimum(1);
- sldLOD.setValue(1);
- sldLOD.setPreferredSize(new java.awt.Dimension(100, 23));
- sldLOD.addChangeListener(new javax.swing.event.ChangeListener() {
- public void stateChanged(javax.swing.event.ChangeEvent evt) {
- sldLODStateChanged(evt);
- }
- });
- pnlLOD.add(sldLOD);
-
- getContentPane().add(pnlLOD);
-
- pack();
- }// //GEN-END:initComponents
-
- private void sldWhiteStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_sldWhiteStateChanged
- white = sldWhite.getValue() / 100f;
- updateHdr();
- }//GEN-LAST:event_sldWhiteStateChanged
-
- private void sldGammaStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_sldGammaStateChanged
- gamma = sldGamma.getValue() / 100f;
- updateHdr();
- }//GEN-LAST:event_sldGammaStateChanged
-
- private void sldLODStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_sldLODStateChanged
- lod = sldLOD.getValue();
- updateHdr();
- }//GEN-LAST:event_sldLODStateChanged
-
- private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jComboBox1ActionPerformed
- switch (jComboBox1.getSelectedIndex()){
- case 0: a = 0.09f; break;
- case 1: a = 0.18f; break;
- case 2: a = 0.36f; break;
- case 3: a = 0.72f; break;
- }
- updateHdr();
- }//GEN-LAST:event_jComboBox1ActionPerformed
-
- // Variables declaration - do not modify//GEN-BEGIN:variables
- private javax.swing.JComboBox jComboBox1;
- private javax.swing.JLabel lblA;
- private javax.swing.JLabel lblGamma;
- private javax.swing.JLabel lblLOD;
- private javax.swing.JLabel lblWhite;
- private javax.swing.JPanel pnlA;
- private javax.swing.JPanel pnlBright;
- private javax.swing.JPanel pnlGamma;
- private javax.swing.JPanel pnlLOD;
- private javax.swing.JSlider sldGamma;
- private javax.swing.JSlider sldLOD;
- private javax.swing.JSlider sldWhite;
- // End of variables declaration//GEN-END:variables
-
-}
diff --git a/engine/src/desktop-fx/com/jme3/post/HDRRenderer.java b/engine/src/desktop-fx/com/jme3/post/HDRRenderer.java
deleted file mode 100644
index bac8334ab..000000000
--- a/engine/src/desktop-fx/com/jme3/post/HDRRenderer.java
+++ /dev/null
@@ -1,419 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.post;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.material.Material;
-import com.jme3.math.Vector2f;
-import com.jme3.renderer.*;
-import com.jme3.renderer.queue.RenderQueue;
-import com.jme3.texture.FrameBuffer;
-import com.jme3.texture.Image;
-import com.jme3.texture.Image.Format;
-import com.jme3.texture.Texture;
-import com.jme3.texture.Texture.MagFilter;
-import com.jme3.texture.Texture.MinFilter;
-import com.jme3.texture.Texture2D;
-import com.jme3.ui.Picture;
-import java.util.Collection;
-import java.util.logging.Logger;
-
-public class HDRRenderer implements SceneProcessor {
-
- private static final int LUMMODE_NONE = 0x1,
- LUMMODE_ENCODE_LUM = 0x2,
- LUMMODE_DECODE_LUM = 0x3;
-
- private Renderer renderer;
- private RenderManager renderManager;
- private ViewPort viewPort;
- private static final Logger logger = Logger.getLogger(HDRRenderer.class.getName());
-
- private Camera fbCam = new Camera(1, 1);
-
- private FrameBuffer msFB;
-
- private FrameBuffer mainSceneFB;
- private Texture2D mainScene;
- private FrameBuffer scene64FB;
- private Texture2D scene64;
- private FrameBuffer scene8FB;
- private Texture2D scene8;
- private FrameBuffer scene1FB[] = new FrameBuffer[2];
- private Texture2D scene1[] = new Texture2D[2];
-
- private Material hdr64;
- private Material hdr8;
- private Material hdr1;
- private Material tone;
-
- private Picture fsQuad;
- private float time = 0;
- private int curSrc = -1;
- private int oppSrc = -1;
- private float blendFactor = 0;
-
- private int numSamples = 0;
- private float exposure = 0.18f;
- private float whiteLevel = 100f;
- private float throttle = -1;
- private int maxIterations = -1;
- private Image.Format bufFormat = Format.RGB16F;
-
- private MinFilter fbMinFilter = MinFilter.BilinearNoMipMaps;
- private MagFilter fbMagFilter = MagFilter.Bilinear;
- private AssetManager manager;
-
- private boolean enabled = true;
-
- public HDRRenderer(AssetManager manager, Renderer renderer){
- this.manager = manager;
- this.renderer = renderer;
-
- Collection caps = renderer.getCaps();
- if (caps.contains(Caps.PackedFloatColorBuffer))
- bufFormat = Format.RGB111110F;
- else if (caps.contains(Caps.FloatColorBuffer))
- bufFormat = Format.RGB16F;
- else{
- enabled = false;
- return;
- }
- }
-
- public boolean isEnabled() {
- return enabled;
- }
-
- public void setSamples(int samples){
- this.numSamples = samples;
- }
-
- public void setExposure(float exp){
- this.exposure = exp;
- }
-
- public void setWhiteLevel(float whiteLevel){
- this.whiteLevel = whiteLevel;
- }
-
- public void setMaxIterations(int maxIterations){
- this.maxIterations = maxIterations;
-
- // regenerate shaders if needed
- if (hdr64 != null)
- createLumShaders();
- }
-
- public void setThrottle(float throttle){
- this.throttle = throttle;
- }
-
- public void setUseFastFilter(boolean fastFilter){
- if (fastFilter){
- fbMagFilter = MagFilter.Nearest;
- fbMinFilter = MinFilter.NearestNoMipMaps;
- }else{
- fbMagFilter = MagFilter.Bilinear;
- fbMinFilter = MinFilter.BilinearNoMipMaps;
- }
- }
-
- public Picture createDisplayQuad(/*int mode, Texture tex*/){
- if (scene64 == null)
- return null;
-
- Material mat = new Material(manager, "Common/MatDefs/Hdr/LogLum.j3md");
-// if (mode == LUMMODE_ENCODE_LUM)
-// mat.setBoolean("EncodeLum", true);
-// else if (mode == LUMMODE_DECODE_LUM)
- mat.setBoolean("DecodeLum", true);
- mat.setTexture("Texture", scene64);
-// mat.setTexture("Texture", tex);
-
- Picture dispQuad = new Picture("Luminance Display");
- dispQuad.setMaterial(mat);
- return dispQuad;
- }
-
- private Material createLumShader(int srcW, int srcH, int bufW, int bufH, int mode,
- int iters, Texture tex){
- Material mat = new Material(manager, "Common/MatDefs/Hdr/LogLum.j3md");
-
- Vector2f blockSize = new Vector2f(1f / bufW, 1f / bufH);
- Vector2f pixelSize = new Vector2f(1f / srcW, 1f / srcH);
- Vector2f blocks = new Vector2f();
- float numPixels = Float.POSITIVE_INFINITY;
- if (iters != -1){
- do {
- pixelSize.multLocal(2);
- blocks.set(blockSize.x / pixelSize.x,
- blockSize.y / pixelSize.y);
- numPixels = blocks.x * blocks.y;
- } while (numPixels > iters);
- }else{
- blocks.set(blockSize.x / pixelSize.x,
- blockSize.y / pixelSize.y);
- numPixels = blocks.x * blocks.y;
- }
- System.out.println(numPixels);
-
- mat.setBoolean("Blocks", true);
- if (mode == LUMMODE_ENCODE_LUM)
- mat.setBoolean("EncodeLum", true);
- else if (mode == LUMMODE_DECODE_LUM)
- mat.setBoolean("DecodeLum", true);
-
- mat.setTexture("Texture", tex);
- mat.setVector2("BlockSize", blockSize);
- mat.setVector2("PixelSize", pixelSize);
- mat.setFloat("NumPixels", numPixels);
-
- return mat;
- }
-
- private void createLumShaders(){
- int w = mainSceneFB.getWidth();
- int h = mainSceneFB.getHeight();
- hdr64 = createLumShader(w, h, 64, 64, LUMMODE_ENCODE_LUM, maxIterations, mainScene);
- hdr8 = createLumShader(64, 64, 8, 8, LUMMODE_NONE, maxIterations, scene64);
- hdr1 = createLumShader(8, 8, 1, 1, LUMMODE_NONE, maxIterations, scene8);
- }
-
- private int opposite(int i){
- return i == 1 ? 0 : 1;
- }
-
- private void renderProcessing(Renderer r, FrameBuffer dst, Material mat){
- if (dst == null){
- fsQuad.setWidth(mainSceneFB.getWidth());
- fsQuad.setHeight(mainSceneFB.getHeight());
- fbCam.resize(mainSceneFB.getWidth(), mainSceneFB.getHeight(), true);
- }else{
- fsQuad.setWidth(dst.getWidth());
- fsQuad.setHeight(dst.getHeight());
- fbCam.resize(dst.getWidth(), dst.getHeight(), true);
- }
- fsQuad.setMaterial(mat);
- fsQuad.updateGeometricState();
- renderManager.setCamera(fbCam, true);
-
- r.setFrameBuffer(dst);
- r.clearBuffers(true, true, true);
- renderManager.renderGeometry(fsQuad);
- }
-
- private void renderToneMap(Renderer r, FrameBuffer out){
- tone.setFloat("A", exposure);
- tone.setFloat("White", whiteLevel);
- tone.setTexture("Lum", scene1[oppSrc]);
- tone.setTexture("Lum2", scene1[curSrc]);
- tone.setFloat("BlendFactor", blendFactor);
- renderProcessing(r, out, tone);
- }
-
- private void updateAverageLuminance(Renderer r){
- renderProcessing(r, scene64FB, hdr64);
- renderProcessing(r, scene8FB, hdr8);
- renderProcessing(r, scene1FB[curSrc], hdr1);
- }
-
- public boolean isInitialized(){
- return viewPort != null;
- }
-
- public void reshape(ViewPort vp, int w, int h){
- if (mainSceneFB != null){
- renderer.deleteFrameBuffer(mainSceneFB);
- }
-
- mainSceneFB = new FrameBuffer(w, h, 1);
- mainScene = new Texture2D(w, h, bufFormat);
- mainSceneFB.setDepthBuffer(Format.Depth);
- mainSceneFB.setColorTexture(mainScene);
- mainScene.setMagFilter(fbMagFilter);
- mainScene.setMinFilter(fbMinFilter);
-
- if (msFB != null){
- renderer.deleteFrameBuffer(msFB);
- }
-
- tone.setTexture("Texture", mainScene);
-
- Collection caps = renderer.getCaps();
- if (numSamples > 1 && caps.contains(Caps.FrameBufferMultisample)){
- msFB = new FrameBuffer(w, h, numSamples);
- msFB.setDepthBuffer(Format.Depth);
- msFB.setColorBuffer(bufFormat);
- vp.setOutputFrameBuffer(msFB);
- }else{
- if (numSamples > 1)
- logger.warning("FBO multisampling not supported on this GPU, request ignored.");
-
- vp.setOutputFrameBuffer(mainSceneFB);
- }
-
- createLumShaders();
- }
-
- public void initialize(RenderManager rm, ViewPort vp){
- if (!enabled)
- return;
-
- renderer = rm.getRenderer();
- renderManager = rm;
- viewPort = vp;
-
- // loadInitial()
- fsQuad = new Picture("HDR Fullscreen Quad");
-
- Format lumFmt = Format.RGB8;
- scene64FB = new FrameBuffer(64, 64, 1);
- scene64 = new Texture2D(64, 64, lumFmt);
- scene64FB.setColorTexture(scene64);
- scene64.setMagFilter(fbMagFilter);
- scene64.setMinFilter(fbMinFilter);
-
- scene8FB = new FrameBuffer(8, 8, 1);
- scene8 = new Texture2D(8, 8, lumFmt);
- scene8FB.setColorTexture(scene8);
- scene8.setMagFilter(fbMagFilter);
- scene8.setMinFilter(fbMinFilter);
-
- scene1FB[0] = new FrameBuffer(1, 1, 1);
- scene1[0] = new Texture2D(1, 1, lumFmt);
- scene1FB[0].setColorTexture(scene1[0]);
-
- scene1FB[1] = new FrameBuffer(1, 1, 1);
- scene1[1] = new Texture2D(1, 1, lumFmt);
- scene1FB[1].setColorTexture(scene1[1]);
-
- // prepare tonemap shader
- tone = new Material(manager, "Common/MatDefs/Hdr/ToneMap.j3md");
- tone.setFloat("A", 0.18f);
- tone.setFloat("White", 100);
-
- // load();
- int w = vp.getCamera().getWidth();
- int h = vp.getCamera().getHeight();
- reshape(vp, w, h);
-
-
- }
-
- public void preFrame(float tpf) {
- if (!enabled)
- return;
-
- time += tpf;
- blendFactor = (time / throttle);
- }
-
- public void postQueue(RenderQueue rq) {
- }
-
- public void postFrame(FrameBuffer out) {
- if (!enabled)
- return;
-
- if (msFB != null){
- // first render to multisampled FB
-// renderer.setFrameBuffer(msFB);
-// renderer.clearBuffers(true,true,true);
-//
-// renderManager.renderViewPortRaw(viewPort);
-
- // render back to non-multisampled FB
- renderer.copyFrameBuffer(msFB, mainSceneFB);
- }else{
-// renderer.setFrameBuffer(mainSceneFB);
-// renderer.clearBuffers(true,true,false);
-//
-// renderManager.renderViewPortRaw(viewPort);
- }
-
- // should we update avg lum?
- if (throttle == -1){
- // update every frame
- curSrc = 0;
- oppSrc = 0;
- blendFactor = 0;
- time = 0;
- updateAverageLuminance(renderer);
- }else{
- if (curSrc == -1){
- curSrc = 0;
- oppSrc = 0;
-
- // initial update
- updateAverageLuminance(renderer);
-
- blendFactor = 0;
- time = 0;
- }else if (time > throttle){
-
- // time to switch
- oppSrc = curSrc;
- curSrc = opposite(curSrc);
-
- updateAverageLuminance(renderer);
-
- blendFactor = 0;
- time = 0;
- }
- }
-
- // since out == mainSceneFB, tonemap into the main screen instead
- //renderToneMap(renderer, out);
- renderToneMap(renderer, null);
-
- renderManager.setCamera(viewPort.getCamera(), false);
- }
-
- public void cleanup() {
- if (!enabled)
- return;
-
- if (msFB != null)
- renderer.deleteFrameBuffer(msFB);
- if (mainSceneFB != null)
- renderer.deleteFrameBuffer(mainSceneFB);
- if (scene64FB != null){
- renderer.deleteFrameBuffer(scene64FB);
- renderer.deleteFrameBuffer(scene8FB);
- renderer.deleteFrameBuffer(scene1FB[0]);
- renderer.deleteFrameBuffer(scene1FB[1]);
- }
- }
-
-}
diff --git a/engine/src/desktop-fx/com/jme3/post/filters/BloomFilter.java b/engine/src/desktop-fx/com/jme3/post/filters/BloomFilter.java
deleted file mode 100644
index 770e7f448..000000000
--- a/engine/src/desktop-fx/com/jme3/post/filters/BloomFilter.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.post.filters;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.material.Material;
-import com.jme3.math.ColorRGBA;
-import com.jme3.post.Filter;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.ViewPort;
-import com.jme3.texture.Image.Format;
-import java.io.IOException;
-import java.util.ArrayList;
-
-/**
- * BloomFilter is used to make objects in the scene have a glow effect.
- * There are 2 mode : Scene and Objects.
- * Scene mode extracts the bright parts of the scene to make them glow
- * Object mode make objects glow according to their material's glowMap or their GlowColor
- * @see advanced:bloom_and_glow for more details
- *
- * @author Rémy Bouquet aka Nehon
- */
-public class BloomFilter extends Filter {
-
- /**
- * GlowMode specifies if the glow will be applied to the whole scene,or to objects that have aglow color or a glow map
- */
- public enum GlowMode {
-
- /**
- * Apply bloom filter to bright areas in the scene.
- */
- Scene,
- /**
- * Apply bloom only to objects that have a glow map or a glow color.
- */
- Objects,
- /**
- * Apply bloom to both bright parts of the scene and objects with glow map.
- */
- SceneAndObjects;
- }
-
- private GlowMode glowMode = GlowMode.Scene;
- //Bloom parameters
- private float blurScale = 1.5f;
- private float exposurePower = 5.0f;
- private float exposureCutOff = 0.0f;
- private float bloomIntensity = 2.0f;
- private float downSamplingFactor = 1;
- private Pass preGlowPass;
- private Pass extractPass;
- private Pass horizontalBlur = new Pass();
- private Pass verticalalBlur = new Pass();
- private Material extractMat;
- private Material vBlurMat;
- private Material hBlurMat;
- private int screenWidth;
- private int screenHeight;
-
- /**
- * Creates a Bloom filter
- */
- public BloomFilter() {
- super("BloomFilter");
- }
-
- /**
- * Creates the bloom filter with the specific glow mode
- * @param glowMode
- */
- public BloomFilter(GlowMode glowMode) {
- this();
- this.glowMode = glowMode;
- }
-
- @Override
- protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) {
- screenWidth = (int) Math.max(1, (w / downSamplingFactor));
- screenHeight = (int) Math.max(1, (h / downSamplingFactor));
- // System.out.println(screenWidth + " " + screenHeight);
- if (glowMode != GlowMode.Scene) {
- preGlowPass = new Pass();
- preGlowPass.init(renderManager.getRenderer(), screenWidth, screenHeight, Format.RGBA8, Format.Depth);
- }
-
- postRenderPasses = new ArrayList();
- //configuring extractPass
- extractMat = new Material(manager, "Common/MatDefs/Post/BloomExtract.j3md");
- extractPass = new Pass() {
-
- @Override
- public boolean requiresSceneAsTexture() {
- return true;
- }
-
- @Override
- public void beforeRender() {
- extractMat.setFloat("ExposurePow", exposurePower);
- extractMat.setFloat("ExposureCutoff", exposureCutOff);
- if (glowMode != GlowMode.Scene) {
- extractMat.setTexture("GlowMap", preGlowPass.getRenderedTexture());
- }
- extractMat.setBoolean("Extract", glowMode != GlowMode.Objects);
- }
- };
-
- extractPass.init(renderManager.getRenderer(), screenWidth, screenHeight, Format.RGBA8, Format.Depth, 1, extractMat);
- postRenderPasses.add(extractPass);
-
- //configuring horizontal blur pass
- hBlurMat = new Material(manager, "Common/MatDefs/Blur/HGaussianBlur.j3md");
- horizontalBlur = new Pass() {
-
- @Override
- public void beforeRender() {
- hBlurMat.setTexture("Texture", extractPass.getRenderedTexture());
- hBlurMat.setFloat("Size", screenWidth);
- hBlurMat.setFloat("Scale", blurScale);
- }
- };
-
- horizontalBlur.init(renderManager.getRenderer(), screenWidth, screenHeight, Format.RGBA8, Format.Depth, 1, hBlurMat);
- postRenderPasses.add(horizontalBlur);
-
- //configuring vertical blur pass
- vBlurMat = new Material(manager, "Common/MatDefs/Blur/VGaussianBlur.j3md");
- verticalalBlur = new Pass() {
-
- @Override
- public void beforeRender() {
- vBlurMat.setTexture("Texture", horizontalBlur.getRenderedTexture());
- vBlurMat.setFloat("Size", screenHeight);
- vBlurMat.setFloat("Scale", blurScale);
- }
- };
-
- verticalalBlur.init(renderManager.getRenderer(), screenWidth, screenHeight, Format.RGBA8, Format.Depth, 1, vBlurMat);
- postRenderPasses.add(verticalalBlur);
-
-
- //final material
- material = new Material(manager, "Common/MatDefs/Post/BloomFinal.j3md");
- material.setTexture("BloomTex", verticalalBlur.getRenderedTexture());
- }
-
-
- @Override
- protected Material getMaterial() {
- material.setFloat("BloomIntensity", bloomIntensity);
- return material;
- }
-
- @Override
- protected void postQueue(RenderManager renderManager, ViewPort viewPort) {
- if (glowMode != GlowMode.Scene) {
- renderManager.getRenderer().setBackgroundColor(ColorRGBA.BlackNoAlpha);
- renderManager.getRenderer().setFrameBuffer(preGlowPass.getRenderFrameBuffer());
- renderManager.getRenderer().clearBuffers(true, true, true);
- renderManager.setForcedTechnique("Glow");
- renderManager.renderViewPortQueues(viewPort, false);
- renderManager.setForcedTechnique(null);
- renderManager.getRenderer().setFrameBuffer(viewPort.getOutputFrameBuffer());
- }
- }
-
- /**
- * returns the bloom intensity
- * @return
- */
- public float getBloomIntensity() {
- return bloomIntensity;
- }
-
- /**
- * intensity of the bloom effect default is 2.0
- * @param bloomIntensity
- */
- public void setBloomIntensity(float bloomIntensity) {
- this.bloomIntensity = bloomIntensity;
- }
-
- /**
- * returns the blur scale
- * @return
- */
- public float getBlurScale() {
- return blurScale;
- }
-
- /**
- * sets The spread of the bloom default is 1.5f
- * @param blurScale
- */
- public void setBlurScale(float blurScale) {
- this.blurScale = blurScale;
- }
-
- /**
- * returns the exposure cutoff
- * for more details see {@link setExposureCutOff(float exposureCutOff)}
- * @return
- */
- public float getExposureCutOff() {
- return exposureCutOff;
- }
-
- /**
- * Define the color threshold on which the bloom will be applied (0.0 to 1.0)
- * @param exposureCutOff
- */
- public void setExposureCutOff(float exposureCutOff) {
- this.exposureCutOff = exposureCutOff;
- }
-
- /**
- * returns the exposure power
- * form more details see {@link setExposurePower(float exposurePower)}
- * @return
- */
- public float getExposurePower() {
- return exposurePower;
- }
-
- /**
- * defines how many time the bloom extracted color will be multiplied by itself. default id 5.0
- * a high value will reduce rough edges in the bloom and somhow the range of the bloom area *
- * @param exposurePower
- */
- public void setExposurePower(float exposurePower) {
- this.exposurePower = exposurePower;
- }
-
- /**
- * returns the downSampling factor
- * form more details see {@link setDownSamplingFactor(float downSamplingFactor)}
- * @return
- */
- public float getDownSamplingFactor() {
- return downSamplingFactor;
- }
-
- /**
- * Sets the downSampling factor : the size of the computed texture will be divided by this factor. default is 1 for no downsampling
- * A 2 value is a good way of widening the blur
- * @param downSamplingFactor
- */
- public void setDownSamplingFactor(float downSamplingFactor) {
- this.downSamplingFactor = downSamplingFactor;
- }
-
- @Override
- public void write(JmeExporter ex) throws IOException {
- super.write(ex);
- OutputCapsule oc = ex.getCapsule(this);
- oc.write(glowMode, "glowMode", GlowMode.Scene);
- oc.write(blurScale, "blurScale", 1.5f);
- oc.write(exposurePower, "exposurePower", 5.0f);
- oc.write(exposureCutOff, "exposureCutOff", 0.0f);
- oc.write(bloomIntensity, "bloomIntensity", 2.0f);
- oc.write(downSamplingFactor, "downSamplingFactor", 1);
- }
-
- @Override
- public void read(JmeImporter im) throws IOException {
- super.read(im);
- InputCapsule ic = im.getCapsule(this);
- glowMode = ic.readEnum("glowMode", GlowMode.class, GlowMode.Scene);
- blurScale = ic.readFloat("blurScale", 1.5f);
- exposurePower = ic.readFloat("exposurePower", 5.0f);
- exposureCutOff = ic.readFloat("exposureCutOff", 0.0f);
- bloomIntensity = ic.readFloat("bloomIntensity", 2.0f);
- downSamplingFactor = ic.readFloat("downSamplingFactor", 1);
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/post/filters/CartoonEdgeFilter.java b/engine/src/desktop-fx/com/jme3/post/filters/CartoonEdgeFilter.java
deleted file mode 100644
index 3e9998ba7..000000000
--- a/engine/src/desktop-fx/com/jme3/post/filters/CartoonEdgeFilter.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.post.filters;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.material.Material;
-import com.jme3.math.ColorRGBA;
-import com.jme3.post.Filter;
-import com.jme3.post.Filter.Pass;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.Renderer;
-import com.jme3.renderer.ViewPort;
-import com.jme3.texture.Image.Format;
-
-/**
- * Applies a cartoon-style edge detection filter to all objects in the scene.
- *
- * @author Kirill Vainer
- */
-public class CartoonEdgeFilter extends Filter {
-
- private Pass normalPass;
- private float edgeWidth = 1.0f;
- private float edgeIntensity = 1.0f;
- private float normalThreshold = 0.5f;
- private float depthThreshold = 0.1f;
- private float normalSensitivity = 1.0f;
- private float depthSensitivity = 10.0f;
- private ColorRGBA edgeColor = new ColorRGBA(0, 0, 0, 1);
-
- /**
- * Creates a CartoonEdgeFilter
- */
- public CartoonEdgeFilter() {
- super("CartoonEdgeFilter");
- }
-
- @Override
- protected boolean isRequiresDepthTexture() {
- return true;
- }
-
- @Override
- protected void postQueue(RenderManager renderManager, ViewPort viewPort) {
- Renderer r = renderManager.getRenderer();
- r.setFrameBuffer(normalPass.getRenderFrameBuffer());
- renderManager.getRenderer().clearBuffers(true, true, true);
- renderManager.setForcedTechnique("PreNormalPass");
- renderManager.renderViewPortQueues(viewPort, false);
- renderManager.setForcedTechnique(null);
- renderManager.getRenderer().setFrameBuffer(viewPort.getOutputFrameBuffer());
- }
-
- @Override
- protected Material getMaterial() {
- material.setTexture("NormalsTexture", normalPass.getRenderedTexture());
- return material;
- }
-
- @Override
- protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) {
- normalPass = new Pass();
- normalPass.init(renderManager.getRenderer(), w, h, Format.RGBA8, Format.Depth);
- material = new Material(manager, "Common/MatDefs/Post/CartoonEdge.j3md");
- material.setFloat("EdgeWidth", edgeWidth);
- material.setFloat("EdgeIntensity", edgeIntensity);
- material.setFloat("NormalThreshold", normalThreshold);
- material.setFloat("DepthThreshold", depthThreshold);
- material.setFloat("NormalSensitivity", normalSensitivity);
- material.setFloat("DepthSensitivity", depthSensitivity);
- material.setColor("EdgeColor", edgeColor);
- }
-
- /**
- * Return the depth sensitivity
- * for more details see {@link setDepthSensitivity(float depthSensitivity)}
- * @return
- */
- public float getDepthSensitivity() {
- return depthSensitivity;
- }
-
- /**
- * sets the depth sensitivity
- * defines how much depth will influence edges, default is 10
- * @param depthSensitivity
- */
- public void setDepthSensitivity(float depthSensitivity) {
- this.depthSensitivity = depthSensitivity;
- if (material != null) {
- material.setFloat("DepthSensitivity", depthSensitivity);
- }
- }
-
- /**
- * returns the depth threshold
- * for more details see {@link setDepthThreshold(float depthThreshold)}
- * @return
- */
- public float getDepthThreshold() {
- return depthThreshold;
- }
-
- /**
- * sets the depth threshold
- * Defines at what threshold of difference of depth an edge is outlined default is 0.1f
- * @param depthThreshold
- */
- public void setDepthThreshold(float depthThreshold) {
- this.depthThreshold = depthThreshold;
- if (material != null) {
- material.setFloat("DepthThreshold", depthThreshold);
- }
- }
-
- /**
- * returns the edge intensity
- * for more details see {@link setEdgeIntensity(float edgeIntensity) }
- * @return
- */
- public float getEdgeIntensity() {
- return edgeIntensity;
- }
-
- /**
- * sets the edge intensity
- * Defineshow visilble will be the outlined edges
- * @param edgeIntensity
- */
- public void setEdgeIntensity(float edgeIntensity) {
- this.edgeIntensity = edgeIntensity;
- if (material != null) {
- material.setFloat("EdgeIntensity", edgeIntensity);
- }
- }
-
- /**
- * returns the width of the edges
- * @return
- */
- public float getEdgeWidth() {
- return edgeWidth;
- }
-
- /**
- * sets the witdh of the edge in pixels default is 1
- * @param edgeWidth
- */
- public void setEdgeWidth(float edgeWidth) {
- this.edgeWidth = edgeWidth;
- if (material != null) {
- material.setFloat("EdgeWidth", edgeWidth);
- }
-
- }
-
- /**
- * returns the normals sensitivity
- * form more details see {@link setNormalSensitivity(float normalSensitivity)}
- * @return
- */
- public float getNormalSensitivity() {
- return normalSensitivity;
- }
-
- /**
- * sets the normals sensitivity default is 1
- * @param normalSensitivity
- */
- public void setNormalSensitivity(float normalSensitivity) {
- this.normalSensitivity = normalSensitivity;
- if (material != null) {
- material.setFloat("NormalSensitivity", normalSensitivity);
- }
- }
-
- /**
- * returns the normal threshold
- * for more details see {@link setNormalThreshold(float normalThreshold)}
- *
- * @return
- */
- public float getNormalThreshold() {
- return normalThreshold;
- }
-
- /**
- * sets the normal threshold default is 0.5
- * @param normalThreshold
- */
- public void setNormalThreshold(float normalThreshold) {
- this.normalThreshold = normalThreshold;
- if (material != null) {
- material.setFloat("NormalThreshold", normalThreshold);
- }
- }
-
- /**
- * returns the edge color
- * @return
- */
- public ColorRGBA getEdgeColor() {
- return edgeColor;
- }
-
- /**
- * Sets the edge color, default is black
- * @param edgeColor
- */
- public void setEdgeColor(ColorRGBA edgeColor) {
- this.edgeColor = edgeColor;
- if (material != null) {
- material.setColor("EdgeColor", edgeColor);
- }
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/post/filters/ColorOverlayFilter.java b/engine/src/desktop-fx/com/jme3/post/filters/ColorOverlayFilter.java
deleted file mode 100644
index a7f30f884..000000000
--- a/engine/src/desktop-fx/com/jme3/post/filters/ColorOverlayFilter.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.post.filters;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.material.Material;
-import com.jme3.math.ColorRGBA;
-import com.jme3.post.Filter;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.ViewPort;
-import java.io.IOException;
-
-/**
- * This filter simply multiply the whole scene by a color
- * @author Rémy Bouquet aka Nehon
- */
-public class ColorOverlayFilter extends Filter {
-
- private ColorRGBA color = ColorRGBA.White;
-
- /**
- * creates a colorOverlayFilter with a white coor (transparent)
- */
- public ColorOverlayFilter() {
- super("Color Overlay");
- }
-
- /**
- * creates a colorOverlayFilter with the given color
- * @param color
- */
- public ColorOverlayFilter(ColorRGBA color) {
- this();
- this.color = color;
- }
-
- @Override
- protected Material getMaterial() {
-
- material.setColor("Color", color);
- return material;
- }
-
- /**
- * returns the color
- * @return color
- */
- public ColorRGBA getColor() {
- return color;
- }
-
- /**
- * sets the color
- * @param color
- */
- public void setColor(ColorRGBA color) {
- this.color = color;
- }
-
- @Override
- protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) {
- material = new Material(manager, "Common/MatDefs/Post/Overlay.j3md");
- }
-
- @Override
- public void write(JmeExporter ex) throws IOException {
- super.write(ex);
- OutputCapsule oc = ex.getCapsule(this);
- oc.write(color, "color", ColorRGBA.White);
- }
-
- @Override
- public void read(JmeImporter im) throws IOException {
- super.read(im);
- InputCapsule ic = im.getCapsule(this);
- color = (ColorRGBA) ic.readSavable("color", ColorRGBA.White);
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/post/filters/CrossHatchFilter.java b/engine/src/desktop-fx/com/jme3/post/filters/CrossHatchFilter.java
deleted file mode 100644
index 52c204896..000000000
--- a/engine/src/desktop-fx/com/jme3/post/filters/CrossHatchFilter.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.post.filters;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.material.Material;
-import com.jme3.math.ColorRGBA;
-import com.jme3.post.Filter;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.ViewPort;
-
-/**
- * A Post Processing filter that makes the screen look like it was drawn as
- * diagonal lines with a pen.
- * Try combining this with a cartoon edge filter to obtain manga style visuals.
- *
- * Based on an article from Geeks3D:
- * http://www.geeks3d.com/20110219/shader-library-crosshatching-glsl-filter/
- *
- * @author: Roy Straver a.k.a. Baal Garnaal
- */
-public class CrossHatchFilter extends Filter {
-
- private ColorRGBA lineColor = ColorRGBA.Black.clone();
- private ColorRGBA paperColor = ColorRGBA.White.clone();
- private float colorInfluenceLine = 0.8f;
- private float colorInfluencePaper = 0.1f;
- private float fillValue = 0.9f;
- private float luminance1 = 0.9f;
- private float luminance2 = 0.7f;
- private float luminance3 = 0.5f;
- private float luminance4 = 0.3f;
- private float luminance5 = 0.0f;
- private float lineThickness = 1.0f;
- private float lineDistance = 4.0f;
-
- /**
- * Creates a crossHatch filter
- */
- public CrossHatchFilter() {
- super("CrossHatchFilter");
- }
-
- /**
- * Creates a crossHatch filter
- * @param lineColor the colors of the lines
- * @param paperColor the paper color
- */
- public CrossHatchFilter(ColorRGBA lineColor, ColorRGBA paperColor) {
- this();
- this.lineColor = lineColor;
- this.paperColor = paperColor;
- }
-
- @Override
- protected boolean isRequiresDepthTexture() {
- return false;
- }
-
- @Override
- protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) {
- material = new Material(manager, "Common/MatDefs/Post/CrossHatch.j3md");
- material.setColor("LineColor", lineColor);
- material.setColor("PaperColor", paperColor);
-
- material.setFloat("ColorInfluenceLine", colorInfluenceLine);
- material.setFloat("ColorInfluencePaper", colorInfluencePaper);
-
- material.setFloat("FillValue", fillValue);
-
- material.setFloat("Luminance1", luminance1);
- material.setFloat("Luminance2", luminance2);
- material.setFloat("Luminance3", luminance3);
- material.setFloat("Luminance4", luminance4);
- material.setFloat("Luminance5", luminance5);
-
- material.setFloat("LineThickness", lineThickness);
- material.setFloat("LineDistance", lineDistance);
- }
-
- @Override
- protected Material getMaterial() {
- return material;
- }
-
- /**
- * Sets color used to draw lines
- * @param lineColor
- */
- public void setLineColor(ColorRGBA lineColor) {
- this.lineColor = lineColor;
- if (material != null) {
- material.setColor("LineColor", lineColor);
- }
- }
-
- /**
- * Sets color used as background
- * @param paperColor
- */
- public void setPaperColor(ColorRGBA paperColor) {
- this.paperColor = paperColor;
- if (material != null) {
- material.setColor("PaperColor", paperColor);
- }
- }
-
- /**
- * Sets color influence of original image on lines drawn
- * @param colorInfluenceLine
- */
- public void setColorInfluenceLine(float colorInfluenceLine) {
- this.colorInfluenceLine = colorInfluenceLine;
- if (material != null) {
- material.setFloat("ColorInfluenceLine", colorInfluenceLine);
- }
- }
-
- /**
- * Sets color influence of original image on non-line areas
- * @param colorInfluencePaper
- */
- public void setColorInfluencePaper(float colorInfluencePaper) {
- this.colorInfluencePaper = colorInfluencePaper;
- if (material != null) {
- material.setFloat("ColorInfluencePaper", colorInfluencePaper);
- }
- }
-
- /**
- * Sets line/paper color ratio for areas with values < luminance5,
- * really dark areas get no lines but a filled blob instead
- * @param fillValue
- */
- public void setFillValue(float fillValue) {
- this.fillValue = fillValue;
- if (material != null) {
- material.setFloat("FillValue", fillValue);
- }
- }
-
- /**
- *
- * Sets minimum luminance levels for lines drawn
- * @param luminance1 Top-left to down right 1
- * @param luminance2 Top-right to bottom left 1
- * @param luminance3 Top-left to down right 2
- * @param luminance4 Top-right to bottom left 2
- * @param luminance5 Blobs
- */
- public void setLuminanceLevels(float luminance1, float luminance2, float luminance3, float luminance4, float luminance5) {
- this.luminance1 = luminance1;
- this.luminance2 = luminance2;
- this.luminance3 = luminance3;
- this.luminance4 = luminance4;
- this.luminance5 = luminance5;
-
- if (material != null) {
- material.setFloat("Luminance1", luminance1);
- material.setFloat("Luminance2", luminance2);
- material.setFloat("Luminance3", luminance3);
- material.setFloat("Luminance4", luminance4);
- material.setFloat("Luminance5", luminance5);
- }
- }
-
- /**
- * Sets the thickness of lines drawn
- * @param lineThickness
- */
- public void setLineThickness(float lineThickness) {
- this.lineThickness = lineThickness;
- if (material != null) {
- material.setFloat("LineThickness", lineThickness);
- }
- }
-
- /**
- * Sets minimum distance between lines drawn
- * Primary lines are drawn at 2*lineDistance
- * Secondary lines are drawn at lineDistance
- * @param lineDistance
- */
- public void setLineDistance(float lineDistance) {
- this.lineDistance = lineDistance;
- if (material != null) {
- material.setFloat("LineDistance", lineDistance);
- }
- }
-
- /**
- * Returns line color
- * @return
- */
- public ColorRGBA getLineColor() {
- return lineColor;
- }
-
- /**
- * Returns paper background color
- * @return
- */
- public ColorRGBA getPaperColor() {
- return paperColor;
- }
-
- /**
- * Returns current influence of image colors on lines
- */
- public float getColorInfluenceLine() {
- return colorInfluenceLine;
- }
-
- /**
- * Returns current influence of image colors on paper background
- */
- public float getColorInfluencePaper() {
- return colorInfluencePaper;
- }
-
- /**
- * Returns line/paper color ratio for blobs
- */
- public float getFillValue() {
- return fillValue;
- }
-
- /**
- * Returns the thickness of the lines drawn
- */
- public float getLineThickness() {
- return lineThickness;
- }
-
- /**
- * Returns minimum distance between lines
- */
- public float getLineDistance() {
- return lineDistance;
- }
-
- /**
- * Returns treshold for lines 1
- */
- public float getLuminance1() {
- return luminance1;
- }
-
- /**
- * Returns treshold for lines 2
- */
- public float getLuminance2() {
- return luminance2;
- }
-
- /**
- * Returns treshold for lines 3
- */
- public float getLuminance3() {
- return luminance3;
- }
-
- /**
- * Returns treshold for lines 4
- */
- public float getLuminance4() {
- return luminance4;
- }
-
- /**
- * Returns treshold for blobs
- */
- public float getLuminance5() {
- return luminance5;
- }
-}
\ No newline at end of file
diff --git a/engine/src/desktop-fx/com/jme3/post/filters/DepthOfFieldFilter.java b/engine/src/desktop-fx/com/jme3/post/filters/DepthOfFieldFilter.java
deleted file mode 100644
index 55591c988..000000000
--- a/engine/src/desktop-fx/com/jme3/post/filters/DepthOfFieldFilter.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.post.filters;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.material.Material;
-import com.jme3.post.Filter;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.ViewPort;
-
-/**
- * A post-processing filter that performs a depth range
- * blur using a scaled convolution filter.
- *
- * @version $Revision: 779 $
- * @author Paul Speed
- */
-public class DepthOfFieldFilter extends Filter {
-
- private float focusDistance = 50f;
- private float focusRange = 10f;
- private float blurScale = 1f;
- // These values are set internally based on the
- // viewport size.
- private float xScale;
- private float yScale;
-
- /**
- * Creates a DepthOfField filter
- */
- public DepthOfFieldFilter() {
- super("Depth Of Field");
- }
-
- @Override
- protected boolean isRequiresDepthTexture() {
- return true;
- }
-
- @Override
- protected Material getMaterial() {
-
- return material;
- }
-
- @Override
- protected void initFilter(AssetManager assets, RenderManager renderManager,
- ViewPort vp, int w, int h) {
- material = new Material(assets, "Common/MatDefs/Post/DepthOfField.j3md");
- material.setFloat("FocusDistance", focusDistance);
- material.setFloat("FocusRange", focusRange);
-
-
- xScale = 1.0f / w;
- yScale = 1.0f / h;
-
- material.setFloat("XScale", blurScale * xScale);
- material.setFloat("YScale", blurScale * yScale);
- }
-
- /**
- * Sets the distance at which objects are purely in focus.
- */
- public void setFocusDistance(float f) {
-
- this.focusDistance = f;
- if (material != null) {
- material.setFloat("FocusDistance", focusDistance);
- }
-
- }
-
- /**
- * returns the focus distance
- * @return
- */
- public float getFocusDistance() {
- return focusDistance;
- }
-
- /**
- * Sets the range to either side of focusDistance where the
- * objects go gradually out of focus. Less than focusDistance - focusRange
- * and greater than focusDistance + focusRange, objects are maximally "blurred".
- */
- public void setFocusRange(float f) {
- this.focusRange = f;
- if (material != null) {
- material.setFloat("FocusRange", focusRange);
- }
-
- }
-
- /**
- * returns the focus range
- * @return
- */
- public float getFocusRange() {
- return focusRange;
- }
-
- /**
- * Sets the blur amount by scaling the convolution filter up or
- * down. A value of 1 (the default) performs a sparse 5x5 evenly
- * distribubted convolution at pixel level accuracy. Higher values skip
- * more pixels, and so on until you are no longer blurring the image
- * but simply hashing it.
- *
- * The sparse convolution is as follows:
- *%MINIFYHTMLc3d0cd9fab65de6875a381fd3f83e1b338%*
- * Where 'x' is the texel being modified. Setting blur scale higher
- * than 1 spaces the samples out.
- */
- public void setBlurScale(float f) {
- this.blurScale = f;
- if (material != null) {
- material.setFloat("XScale", blurScale * xScale);
- material.setFloat("YScale", blurScale * yScale);
- }
- }
-
- /**
- * returns the blur scale
- * @return
- */
- public float getBlurScale() {
- return blurScale;
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/post/filters/FXAAFilter.java b/engine/src/desktop-fx/com/jme3/post/filters/FXAAFilter.java
deleted file mode 100644
index 8ba3c16bb..000000000
--- a/engine/src/desktop-fx/com/jme3/post/filters/FXAAFilter.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package com.jme3.post.filters;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.material.Material;
-import com.jme3.post.Filter;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.ViewPort;
-
-/**
- * http://www.geeks3d.com/20110405/fxaa-fast-approximate-anti-aliasing-demo-glsl-opengl-test-radeon-geforce/3/
- * http://developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf
- *
- * @author Phate666 (adapted to jme3)
- *
- */
-public class FXAAFilter extends Filter {
-
- private float subPixelShift = 1.0f / 4.0f;
- private float vxOffset = 0.0f;
- private float spanMax = 8.0f;
- private float reduceMul = 1.0f / 8.0f;
-
- public FXAAFilter() {
- super("FXAAFilter");
- }
-
- @Override
- protected void initFilter(AssetManager manager,
- RenderManager renderManager, ViewPort vp, int w, int h) {
- material = new Material(manager, "Common/MatDefs/Post/FXAA.j3md");
- material.setFloat("SubPixelShift", subPixelShift);
- material.setFloat("VxOffset", vxOffset);
- material.setFloat("SpanMax", spanMax);
- material.setFloat("ReduceMul", reduceMul);
- }
-
- @Override
- protected Material getMaterial() {
- return material;
- }
-
- public void setSpanMax(float spanMax) {
- this.spanMax = spanMax;
- if (material != null) {
- material.setFloat("SpanMax", this.spanMax);
- }
- }
-
- /**
- * set to 0.0f for higher quality
- *
- * @param subPixelShift
- */
- public void setSubPixelShift(float subPixelShift) {
- this.subPixelShift = subPixelShift;
- if (material != null) {
- material.setFloat("SubPixelShif", this.subPixelShift);
- }
- }
-
- /**
- * set to 0.0f for higher quality
- *
- * @param reduceMul
- */
- public void setReduceMul(float reduceMul) {
- this.reduceMul = reduceMul;
- if (material != null) {
- material.setFloat("ReduceMul", this.reduceMul);
- }
- }
-
- public void setVxOffset(float vxOffset) {
- this.vxOffset = vxOffset;
- if (material != null) {
- material.setFloat("VxOffset", this.vxOffset);
- }
- }
-
- public float getReduceMul() {
- return reduceMul;
- }
-
- public float getSpanMax() {
- return spanMax;
- }
-
- public float getSubPixelShift() {
- return subPixelShift;
- }
-
- public float getVxOffset() {
- return vxOffset;
- }
-}
\ No newline at end of file
diff --git a/engine/src/desktop-fx/com/jme3/post/filters/FadeFilter.java b/engine/src/desktop-fx/com/jme3/post/filters/FadeFilter.java
deleted file mode 100644
index 902bc8901..000000000
--- a/engine/src/desktop-fx/com/jme3/post/filters/FadeFilter.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.post.filters;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.material.Material;
-import com.jme3.post.Filter;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.ViewPort;
-import java.io.IOException;
-
-/**
- *
- * Fade Filter allows you to make an animated fade effect on a scene.
- * @author Rémy Bouquet aka Nehon
- * implemented from boxjar implementation
- * @see http://jmonkeyengine.org/groups/graphics/forum/topic/newbie-question-general-fade-inout-effect/#post-105559
- */
-public class FadeFilter extends Filter {
-
- private float value = 1;
- private boolean playing = false;
- private float direction = 1;
- private float duration = 1;
-
- /**
- * Creates a FadeFilter
- */
- public FadeFilter() {
- super("Fade In/Out");
- }
-
- /**
- * Creates a FadeFilter with the given duration
- * @param duration
- */
- public FadeFilter(float duration) {
- this();
- this.duration = duration;
- }
-
- @Override
- protected Material getMaterial() {
- material.setFloat("Value", value);
- return material;
- }
-
- @Override
- protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) {
- material = new Material(manager, "Common/MatDefs/Post/Fade.j3md");
- }
-
- @Override
- protected void preFrame(float tpf) {
- if (playing) {
- value += tpf * direction / duration;
-
- if (direction > 0 && value > 1) {
- value = 1;
- playing = false;
- setEnabled(false);
- }
- if (direction < 0 && value < 0) {
- value = 0;
- playing = false;
- setEnabled(false);
- }
- }
- }
-
- /**
- * returns the duration of the effect
- * @return
- */
- public float getDuration() {
- return duration;
- }
-
- /**
- * Sets the duration of the filter default is 1 second
- * @param duration
- */
- public void setDuration(float duration) {
- this.duration = duration;
- }
-
- /**
- * fades the scene in (black to scene)
- */
- public void fadeIn() {
- setEnabled(true);
- direction = 1;
- playing = true;
- }
-
- /**
- * fades the scene out (scene to black)
- */
- public void fadeOut() {
- setEnabled(true);
- direction = -1;
- playing = true;
-
- }
-
- @Override
- public void write(JmeExporter ex) throws IOException {
- super.write(ex);
- OutputCapsule oc = ex.getCapsule(this);
- oc.write(duration, "duration", 1);
- }
-
- @Override
- public void read(JmeImporter im) throws IOException {
- super.read(im);
- InputCapsule ic = im.getCapsule(this);
- duration = ic.readFloat("duration", 1);
- }
-
- /**
- * return the current value of the fading
- * can be used to chack if fade is complete (eg value=1)
- * @return
- */
- public float getValue() {
- return value;
- }
-
- /**
- * sets the fade value
- * can be used to force complete black or compete scene
- * @param value
- */
- public void setValue(float value) {
- this.value = value;
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/post/filters/FogFilter.java b/engine/src/desktop-fx/com/jme3/post/filters/FogFilter.java
deleted file mode 100644
index ff617970a..000000000
--- a/engine/src/desktop-fx/com/jme3/post/filters/FogFilter.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.post.filters;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.material.Material;
-import com.jme3.math.ColorRGBA;
-import com.jme3.post.Filter;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.ViewPort;
-import java.io.IOException;
-
-/**
- * A filter to render a fog effect
- * @author Rémy Bouquet aka Nehon
- */
-public class FogFilter extends Filter {
-
- private ColorRGBA fogColor = ColorRGBA.White.clone();
- private float fogDensity = 0.7f;
- private float fogDistance = 1000;
-
- /**
- * Creates a FogFilter
- */
- public FogFilter() {
- super("FogFilter");
- }
-
- /**
- * Create a fog filter
- * @param fogColor the color of the fog (default is white)
- * @param fogDensity the density of the fog (default is 0.7)
- * @param fogDistance the distance of the fog (default is 1000)
- */
- public FogFilter(ColorRGBA fogColor, float fogDensity, float fogDistance) {
- this();
- this.fogColor = fogColor;
- this.fogDensity = fogDensity;
- this.fogDistance = fogDistance;
- }
-
- @Override
- protected boolean isRequiresDepthTexture() {
- return true;
- }
-
- @Override
- protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) {
- material = new Material(manager, "Common/MatDefs/Post/Fog.j3md");
- material.setColor("FogColor", fogColor);
- material.setFloat("FogDensity", fogDensity);
- material.setFloat("FogDistance", fogDistance);
- }
-
- @Override
- protected Material getMaterial() {
-
- return material;
- }
-
-
- /**
- * returns the fog color
- * @return
- */
- public ColorRGBA getFogColor() {
- return fogColor;
- }
-
- /**
- * Sets the color of the fog
- * @param fogColor
- */
- public void setFogColor(ColorRGBA fogColor) {
- if (material != null) {
- material.setColor("FogColor", fogColor);
- }
- this.fogColor = fogColor;
- }
-
- /**
- * returns the fog density
- * @return
- */
- public float getFogDensity() {
- return fogDensity;
- }
-
- /**
- * Sets the density of the fog, a high value gives a thick fog
- * @param fogColor
- */
- public void setFogDensity(float fogDensity) {
- if (material != null) {
- material.setFloat("FogDensity", fogDensity);
- }
- this.fogDensity = fogDensity;
- }
-
- /**
- * returns the fog distance
- * @return
- */
- public float getFogDistance() {
- return fogDistance;
- }
-
- /**
- * the distance of the fog. the higer the value the distant the fog looks
- * @param fogDistance
- */
- public void setFogDistance(float fogDistance) {
- if (material != null) {
- material.setFloat("FogDistance", fogDistance);
- }
- this.fogDistance = fogDistance;
- }
-
- @Override
- public void write(JmeExporter ex) throws IOException {
- super.write(ex);
- OutputCapsule oc = ex.getCapsule(this);
- oc.write(fogColor, "fogColor", ColorRGBA.White.clone());
- oc.write(fogDensity, "fogDensity", 0.7f);
- oc.write(fogDistance, "fogDistance", 1000);
- }
-
- @Override
- public void read(JmeImporter im) throws IOException {
- super.read(im);
- InputCapsule ic = im.getCapsule(this);
- fogColor = (ColorRGBA) ic.readSavable("fogColor", ColorRGBA.White.clone());
- fogDensity = ic.readFloat("fogDensity", 0.7f);
- fogDistance = ic.readFloat("fogDistance", 1000);
- }
-
-
-}
diff --git a/engine/src/desktop-fx/com/jme3/post/filters/GammaCorrectionFilter.java b/engine/src/desktop-fx/com/jme3/post/filters/GammaCorrectionFilter.java
deleted file mode 100644
index 9e283ca13..000000000
--- a/engine/src/desktop-fx/com/jme3/post/filters/GammaCorrectionFilter.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.jme3.post.filters;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.material.Material;
-import com.jme3.post.Filter;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.ViewPort;
-
-/**
- *
- * @author Phate666
- * @version 1.0 initial version
- * @version 1.1 added luma
- */
-public class GammaCorrectionFilter extends Filter
-{
- private float gamma = 2.0f;
- private boolean computeLuma = false;
-
- public GammaCorrectionFilter()
- {
- super("GammaCorrectionFilter");
- }
-
- public GammaCorrectionFilter(float gamma)
- {
- this();
- this.setGamma(gamma);
- }
-
- @Override
- protected Material getMaterial()
- {
- return material;
- }
-
- @Override
- protected void initFilter(AssetManager manager,
- RenderManager renderManager, ViewPort vp, int w, int h)
- {
- material = new Material(manager,
- "Common/MatDefs/Post/GammaCorrection.j3md");
- material.setFloat("gamma", gamma);
- material.setBoolean("computeLuma", computeLuma);
- }
-
- public float getGamma()
- {
- return gamma;
- }
-
- /**
- * set to 0.0 to disable gamma correction
- * @param gamma
- */
- public void setGamma(float gamma)
- {
- if (material != null)
- {
- material.setFloat("gamma", gamma);
- }
- this.gamma = gamma;
- }
-
- public boolean isComputeLuma()
- {
- return computeLuma;
- }
-
- public void setComputeLuma(boolean computeLuma)
- {
- if (material != null)
- {
- material.setBoolean("computeLuma", computeLuma);
- }
- this.computeLuma = computeLuma;
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/post/filters/LightScatteringFilter.java b/engine/src/desktop-fx/com/jme3/post/filters/LightScatteringFilter.java
deleted file mode 100644
index 953f10a66..000000000
--- a/engine/src/desktop-fx/com/jme3/post/filters/LightScatteringFilter.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.post.filters;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.material.Material;
-import com.jme3.math.Vector3f;
-import com.jme3.post.Filter;
-import com.jme3.renderer.Camera;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.ViewPort;
-import java.io.IOException;
-
-/**
- * LightScattering filters creates rays comming from a light sources
- * This is often reffered as god rays.
- *
- * @author Rémy Bouquet aka Nehon
- */
-public class LightScatteringFilter extends Filter {
-
- private Vector3f lightPosition;
- private Vector3f screenLightPos = new Vector3f();
- private int nbSamples = 50;
- private float blurStart = 0.02f;
- private float blurWidth = 0.9f;
- private float lightDensity = 1.4f;
- private boolean adaptative = true;
- Vector3f viewLightPos = new Vector3f();
- private boolean display = true;
- private float innerLightDensity;
-
- /**
- * creates a lightScaterring filter
- */
- public LightScatteringFilter() {
- super("Light Scattering");
- }
-
- /**
- * Creates a lightScatteringFilter
- * @param lightPosition
- */
- public LightScatteringFilter(Vector3f lightPosition) {
- this();
- this.lightPosition = lightPosition;
- }
-
- @Override
- protected boolean isRequiresDepthTexture() {
- return true;
- }
-
- @Override
- protected Material getMaterial() {
- material.setVector3("LightPosition", screenLightPos);
- material.setInt("NbSamples", nbSamples);
- material.setFloat("BlurStart", blurStart);
- material.setFloat("BlurWidth", blurWidth);
- material.setFloat("LightDensity", innerLightDensity);
- material.setBoolean("Display", display);
- return material;
- }
-
- @Override
- protected void postQueue(RenderManager renderManager, ViewPort viewPort) {
- getClipCoordinates(lightPosition, screenLightPos, viewPort.getCamera());
- // screenLightPos.x = screenLightPos.x / viewPort.getCamera().getWidth();
- // screenLightPos.y = screenLightPos.y / viewPort.getCamera().getHeight();
-
- viewPort.getCamera().getViewMatrix().mult(lightPosition, viewLightPos);
- //System.err.println("viewLightPos "+viewLightPos);
- display = screenLightPos.x < 1.6f && screenLightPos.x > -0.6f && screenLightPos.y < 1.6f && screenLightPos.y > -0.6f && viewLightPos.z < 0;
-//System.err.println("camdir "+viewPort.getCamera().getDirection());
-//System.err.println("lightPos "+lightPosition);
-//System.err.println("screenLightPos "+screenLightPos);
- if (adaptative) {
- innerLightDensity = Math.max(lightDensity - Math.max(screenLightPos.x, screenLightPos.y), 0.0f);
- } else {
- innerLightDensity = lightDensity;
- }
- }
-
- private Vector3f getClipCoordinates(Vector3f worldPosition, Vector3f store, Camera cam) {
-
- float w = cam.getViewProjectionMatrix().multProj(worldPosition, store);
- store.divideLocal(w);
-
- store.x = ((store.x + 1f) * (cam.getViewPortRight() - cam.getViewPortLeft()) / 2f + cam.getViewPortLeft());
- store.y = ((store.y + 1f) * (cam.getViewPortTop() - cam.getViewPortBottom()) / 2f + cam.getViewPortBottom());
- store.z = (store.z + 1f) / 2f;
-
- return store;
- }
-
- @Override
- protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) {
- material = new Material(manager, "Common/MatDefs/Post/LightScattering.j3md");
- }
-
- /**
- * returns the blur start of the scattering
- * see {@link setBlurStart(float blurStart)}
- * @return
- */
- public float getBlurStart() {
- return blurStart;
- }
-
- /**
- * sets the blur start
- * at which distance from the light source the effect starts default is 0.02
- * @param blurStart
- */
- public void setBlurStart(float blurStart) {
- this.blurStart = blurStart;
- }
-
- /**
- * returns the blur width
- * see {@link setBlurWidth(float blurWidth)}
- * @return
- */
- public float getBlurWidth() {
- return blurWidth;
- }
-
- /**
- * sets the blur width default is 0.9
- * @param blurWidth
- */
- public void setBlurWidth(float blurWidth) {
- this.blurWidth = blurWidth;
- }
-
- /**
- * retiurns the light density
- * see {@link setLightDensity(float lightDensity)}
- *
- * @return
- */
- public float getLightDensity() {
- return lightDensity;
- }
-
- /**
- * sets how much the effect is visible over the rendered scene default is 1.4
- * @param lightDensity
- */
- public void setLightDensity(float lightDensity) {
- this.lightDensity = lightDensity;
- }
-
- /**
- * returns the light position
- * @return
- */
- public Vector3f getLightPosition() {
- return lightPosition;
- }
-
- /**
- * sets the light position
- * @param lightPosition
- */
- public void setLightPosition(Vector3f lightPosition) {
- this.lightPosition = lightPosition;
- }
-
- /**
- * returns the nmber of samples for the radial blur
- * @return
- */
- public int getNbSamples() {
- return nbSamples;
- }
-
- /**
- * sets the number of samples for the radial blur default is 50
- * the higher the value the higher the quality, but the slower the performances.
- * @param nbSamples
- */
- public void setNbSamples(int nbSamples) {
- this.nbSamples = nbSamples;
- }
-
- @Override
- public void write(JmeExporter ex) throws IOException {
- super.write(ex);
- OutputCapsule oc = ex.getCapsule(this);
- oc.write(lightPosition, "lightPosition", Vector3f.ZERO);
- oc.write(nbSamples, "nbSamples", 50);
- oc.write(blurStart, "blurStart", 0.02f);
- oc.write(blurWidth, "blurWidth", 0.9f);
- oc.write(lightDensity, "lightDensity", 1.4f);
- oc.write(adaptative, "adaptative", true);
- }
-
- @Override
- public void read(JmeImporter im) throws IOException {
- super.read(im);
- InputCapsule ic = im.getCapsule(this);
- lightPosition = (Vector3f) ic.readSavable("lightPosition", Vector3f.ZERO);
- nbSamples = ic.readInt("nbSamples", 50);
- blurStart = ic.readFloat("blurStart", 0.02f);
- blurWidth = ic.readFloat("blurWidth", 0.9f);
- lightDensity = ic.readFloat("lightDensity", 1.4f);
- adaptative = ic.readBoolean("adaptative", true);
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/post/filters/PosterizationFilter.java b/engine/src/desktop-fx/com/jme3/post/filters/PosterizationFilter.java
deleted file mode 100644
index c980edaee..000000000
--- a/engine/src/desktop-fx/com/jme3/post/filters/PosterizationFilter.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.post.filters;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.material.Material;
-import com.jme3.post.Filter;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.ViewPort;
-
-/**
- * A Post Processing filter to change colors appear with sharp edges as if the
- * available amount of colors available was not enough to draw the true image.
- * Possibly useful in cartoon styled games. Use the strength variable to lessen
- * influence of this filter on the total result. Values from 0.2 to 0.7 appear
- * to give nice results.
- *
- * Based on an article from Geeks3D:
- * http://www.geeks3d.com/20091027/shader-library-posterization-post-processing-effect-glsl/
- *
- * @author: Roy Straver a.k.a. Baal Garnaal
- */
-public class PosterizationFilter extends Filter {
-
- private int numColors = 8;
- private float gamma = 0.6f;
- private float strength = 1.0f;
-
- /**
- * Creates a posterization Filter
- */
- public PosterizationFilter() {
- super("PosterizationFilter");
- }
-
- /**
- * Creates a posterization Filter with the given number of colors
- * @param numColors
- */
- public PosterizationFilter(int numColors) {
- this();
- this.numColors = numColors;
- }
-
- /**
- * Creates a posterization Filter with the given number of colors and gamma
- * @param numColors
- * @param gamma
- */
- public PosterizationFilter(int numColors, float gamma) {
- this(numColors);
- this.gamma = gamma;
- }
-
- @Override
- protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) {
- material = new Material(manager, "Common/MatDefs/Post/Posterization.j3md");
- material.setInt("NumColors", numColors);
- material.setFloat("Gamma", gamma);
- material.setFloat("Strength", strength);
- }
-
- @Override
- protected Material getMaterial() {
- return material;
- }
-
- /**
- * Sets number of color levels used to draw the screen
- */
- public void setNumColors(int numColors) {
- this.numColors = numColors;
- if (material != null) {
- material.setInt("NumColors", numColors);
- }
- }
-
- /**
- * Sets gamma level used to enhange visual quality
- */
- public void setGamma(float gamma) {
- this.gamma = gamma;
- if (material != null) {
- material.setFloat("Gamma", gamma);
- }
- }
-
- /**
- * Sets urrent strength value, i.e. influence on final image
- */
- public void setStrength(float strength) {
- this.strength = strength;
- if (material != null) {
- material.setFloat("Strength", strength);
- }
- }
-
- /**
- * Returns number of color levels used
- */
- public int getNumColors() {
- return numColors;
- }
-
- /**
- * Returns current gamma value
- */
- public float getGamma() {
- return gamma;
- }
-
- /**
- * Returns current strength value, i.e. influence on final image
- */
- public float getStrength() {
- return strength;
- }
-}
\ No newline at end of file
diff --git a/engine/src/desktop-fx/com/jme3/post/filters/RadialBlurFilter.java b/engine/src/desktop-fx/com/jme3/post/filters/RadialBlurFilter.java
deleted file mode 100644
index db0b4ed5f..000000000
--- a/engine/src/desktop-fx/com/jme3/post/filters/RadialBlurFilter.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.post.filters;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.material.Material;
-import com.jme3.post.Filter;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.ViewPort;
-import com.jme3.shader.VarType;
-import java.io.IOException;
-
-/**
- * Radially blurs the scene from the center of it
- * @author Rémy Bouquet aka Nehon
- */
-public class RadialBlurFilter extends Filter {
-
- private float sampleDist = 1.0f;
- private float sampleStrength = 2.2f;
- private float[] samples = {-0.08f, -0.05f, -0.03f, -0.02f, -0.01f, 0.01f, 0.02f, 0.03f, 0.05f, 0.08f};
-
- /**
- * Creates a RadialBlurFilter
- */
- public RadialBlurFilter() {
- super("Radial blur");
- }
-
- /**
- * Creates a RadialBlurFilter
- * @param sampleDist the distance between samples
- * @param sampleStrength the strenght of each sample
- */
- public RadialBlurFilter(float sampleDist, float sampleStrength) {
- this();
- this.sampleDist = sampleDist;
- this.sampleStrength = sampleStrength;
- }
-
- @Override
- protected Material getMaterial() {
-
- material.setFloat("SampleDist", sampleDist);
- material.setFloat("SampleStrength", sampleStrength);
- material.setParam("Samples", VarType.FloatArray, samples);
-
- return material;
- }
-
- /**
- * return the sample distance
- * @return
- */
- public float getSampleDistance() {
- return sampleDist;
- }
-
- /**
- * sets the samples distances default is 1
- * @param sampleDist
- */
- public void setSampleDistance(float sampleDist) {
- this.sampleDist = sampleDist;
- }
-
- /**
- *
- * @return
- * @deprecated use {@link getSampleDistance()}
- */
- @Deprecated
- public float getSampleDist() {
- return sampleDist;
- }
-
- /**
- *
- * @param sampleDist
- * @deprecated use {@link setSampleDistance(float sampleDist)}
- */
- @Deprecated
- public void setSampleDist(float sampleDist) {
- this.sampleDist = sampleDist;
- }
-
- /**
- * Returns the sample Strength
- * @return
- */
- public float getSampleStrength() {
- return sampleStrength;
- }
-
- /**
- * sets the sample streanght default is 2.2
- * @param sampleStrength
- */
- public void setSampleStrength(float sampleStrength) {
- this.sampleStrength = sampleStrength;
- }
-
- @Override
- protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) {
- material = new Material(manager, "Common/MatDefs/Blur/RadialBlur.j3md");
- }
-
- @Override
- public void write(JmeExporter ex) throws IOException {
- super.write(ex);
- OutputCapsule oc = ex.getCapsule(this);
- oc.write(sampleDist, "sampleDist", 1.0f);
- oc.write(sampleStrength, "sampleStrength", 2.2f);
- }
-
- @Override
- public void read(JmeImporter im) throws IOException {
- super.read(im);
- InputCapsule ic = im.getCapsule(this);
- sampleDist = ic.readFloat("sampleDist", 1.0f);
- sampleStrength = ic.readFloat("sampleStrength", 2.2f);
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/post/filters/TranslucentBucketFilter.java b/engine/src/desktop-fx/com/jme3/post/filters/TranslucentBucketFilter.java
deleted file mode 100644
index 47be41382..000000000
--- a/engine/src/desktop-fx/com/jme3/post/filters/TranslucentBucketFilter.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package com.jme3.post.filters;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.material.Material;
-import com.jme3.math.ColorRGBA;
-import com.jme3.post.Filter;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.Renderer;
-import com.jme3.renderer.ViewPort;
-import com.jme3.renderer.queue.RenderQueue;
-import com.jme3.texture.FrameBuffer;
-import com.jme3.texture.Texture2D;
-
-/**
- * A filter to handle translucent objects when rendering a scene with filters that uses depth like WaterFilter and SSAOFilter
- * just create a TranslucentBucketFilter and add it to the Filter list of a FilterPostPorcessor
- * @author Nehon
- */
-public final class TranslucentBucketFilter extends Filter {
-
- private RenderManager renderManager;
-
- @Override
- protected void initFilter(AssetManager manager, RenderManager rm, ViewPort vp, int w, int h) {
- this.renderManager = rm;
- material = new Material(manager, "Common/MatDefs/Post/Overlay.j3md");
- material.setColor("Color", ColorRGBA.White);
- Texture2D tex = processor.getFilterTexture();
- material.setTexture("Texture", tex);
- if (tex.getImage().getMultiSamples() > 1) {
- material.setInt("NumSamples", tex.getImage().getMultiSamples());
- } else {
- material.clearParam("NumSamples");
- }
- renderManager.setHandleTranslucentBucket(false);
- }
-
- /**
- * Override this method and return false if your Filter does not need the scene texture
- * @return
- */
- @Override
- protected boolean isRequiresSceneTexture() {
- return false;
- }
-
- @Override
- protected void postFrame(RenderManager renderManager, ViewPort viewPort, FrameBuffer prevFilterBuffer, FrameBuffer sceneBuffer) {
- renderManager.setCamera(viewPort.getCamera(), false);
- if (prevFilterBuffer != sceneBuffer) {
- renderManager.getRenderer().copyFrameBuffer(prevFilterBuffer, sceneBuffer, false);
- }
- renderManager.getRenderer().setFrameBuffer(sceneBuffer);
- viewPort.getQueue().renderQueue(RenderQueue.Bucket.Translucent, renderManager, viewPort.getCamera());
- }
-
- @Override
- protected void cleanUpFilter(Renderer r) {
- if (renderManager != null) {
- renderManager.setHandleTranslucentBucket(true);
- }
- }
-
- @Override
- protected Material getMaterial() {
- return material;
- }
-
- @Override
- public void setEnabled(boolean enabled) {
- super.setEnabled(enabled);
- if (renderManager != null) {
- renderManager.setHandleTranslucentBucket(!enabled);
- }
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/post/ssao/SSAOFilter.java b/engine/src/desktop-fx/com/jme3/post/ssao/SSAOFilter.java
deleted file mode 100644
index 4336ede4a..000000000
--- a/engine/src/desktop-fx/com/jme3/post/ssao/SSAOFilter.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.post.ssao;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.material.Material;
-import com.jme3.math.Vector2f;
-import com.jme3.math.Vector3f;
-import com.jme3.post.Filter;
-import com.jme3.post.Filter.Pass;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.Renderer;
-import com.jme3.renderer.ViewPort;
-import com.jme3.shader.VarType;
-import com.jme3.texture.Image.Format;
-import com.jme3.texture.Texture;
-import java.io.IOException;
-import java.util.ArrayList;
-
-/**
- * SSAO stands for screen space ambient occlusion
- * It's a technique that fake ambient lighting by computing shadows that near by objects would casts on each others
- * under the effect of an ambient light
- * more info on this in this blog post http://jmonkeyengine.org/2010/08/16/screen-space-ambient-occlusion-for-jmonkeyengine-3-0/
- *
- * @author Rémy Bouquet aka Nehon
- */
-public class SSAOFilter extends Filter {
-
- private Pass normalPass;
- private Vector3f frustumCorner;
- private Vector2f frustumNearFar;
- private Vector2f[] samples = {new Vector2f(1.0f, 0.0f), new Vector2f(-1.0f, 0.0f), new Vector2f(0.0f, 1.0f), new Vector2f(0.0f, -1.0f)};
- private float sampleRadius = 5.1f;
- private float intensity = 1.5f;
- private float scale = 0.2f;
- private float bias = 0.1f;
- private boolean useOnlyAo = false;
- private boolean useAo = true;
- private Material ssaoMat;
- private Pass ssaoPass;
-// private Material downSampleMat;
-// private Pass downSamplePass;
- private float downSampleFactor = 1f;
-
- /**
- * Create a Screen Space Ambient Occlusion Filter
- */
- public SSAOFilter() {
- super("SSAOFilter");
- }
-
- /**
- * Create a Screen Space Ambient Occlusion Filter
- * @param sampleRadius The radius of the area where random samples will be picked. default 5.1f
- * @param intensity intensity of the resulting AO. default 1.2f
- * @param scale distance between occluders and occludee. default 0.2f
- * @param bias the width of the occlusion cone considered by the occludee. default 0.1f
- */
- public SSAOFilter(float sampleRadius, float intensity, float scale, float bias) {
- this();
- this.sampleRadius = sampleRadius;
- this.intensity = intensity;
- this.scale = scale;
- this.bias = bias;
- }
-
- @Override
- protected boolean isRequiresDepthTexture() {
- return true;
- }
-
- @Override
- protected void postQueue(RenderManager renderManager, ViewPort viewPort) {
- Renderer r = renderManager.getRenderer();
- r.setFrameBuffer(normalPass.getRenderFrameBuffer());
- renderManager.getRenderer().clearBuffers(true, true, true);
- renderManager.setForcedTechnique("PreNormalPass");
- renderManager.renderViewPortQueues(viewPort, false);
- renderManager.setForcedTechnique(null);
- renderManager.getRenderer().setFrameBuffer(viewPort.getOutputFrameBuffer());
- }
-
- @Override
- protected Material getMaterial() {
- return material;
- }
-
- @Override
- protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) {
- int screenWidth = w;
- int screenHeight = h;
- postRenderPasses = new ArrayList();
-
- normalPass = new Pass();
- normalPass.init(renderManager.getRenderer(), (int) (screenWidth / downSampleFactor), (int) (screenHeight / downSampleFactor), Format.RGBA8, Format.Depth);
-
-
- frustumNearFar = new Vector2f();
-
- float farY = (vp.getCamera().getFrustumTop() / vp.getCamera().getFrustumNear()) * vp.getCamera().getFrustumFar();
- float farX = farY * ((float) screenWidth / (float) screenHeight);
- frustumCorner = new Vector3f(farX, farY, vp.getCamera().getFrustumFar());
- frustumNearFar.x = vp.getCamera().getFrustumNear();
- frustumNearFar.y = vp.getCamera().getFrustumFar();
-
-
-
-
-
- //ssao Pass
- ssaoMat = new Material(manager, "Common/MatDefs/SSAO/ssao.j3md");
- ssaoMat.setTexture("Normals", normalPass.getRenderedTexture());
- Texture random = manager.loadTexture("Common/MatDefs/SSAO/Textures/random.png");
- random.setWrap(Texture.WrapMode.Repeat);
- ssaoMat.setTexture("RandomMap", random);
-
- ssaoPass = new Pass() {
-
- @Override
- public boolean requiresDepthAsTexture() {
- return true;
- }
- };
-
- ssaoPass.init(renderManager.getRenderer(), (int) (screenWidth / downSampleFactor), (int) (screenHeight / downSampleFactor), Format.RGBA8, Format.Depth, 1, ssaoMat);
- ssaoPass.getRenderedTexture().setMinFilter(Texture.MinFilter.Trilinear);
- ssaoPass.getRenderedTexture().setMagFilter(Texture.MagFilter.Bilinear);
- postRenderPasses.add(ssaoPass);
- material = new Material(manager, "Common/MatDefs/SSAO/ssaoBlur.j3md");
- material.setTexture("SSAOMap", ssaoPass.getRenderedTexture());
-
- ssaoMat.setVector3("FrustumCorner", frustumCorner);
- ssaoMat.setFloat("SampleRadius", sampleRadius);
- ssaoMat.setFloat("Intensity", intensity);
- ssaoMat.setFloat("Scale", scale);
- ssaoMat.setFloat("Bias", bias);
- material.setBoolean("UseAo", useAo);
- material.setBoolean("UseOnlyAo", useOnlyAo);
- ssaoMat.setVector2("FrustumNearFar", frustumNearFar);
- material.setVector2("FrustumNearFar", frustumNearFar);
- ssaoMat.setParam("Samples", VarType.Vector2Array, samples);
-
- float xScale = 1.0f / w;
- float yScale = 1.0f / h;
-
- float blurScale = 2f;
- material.setFloat("XScale", blurScale * xScale);
- material.setFloat("YScale", blurScale * yScale);
-
- }
-
- /**
- * Return the bias
- * see {@link setBias(float bias)}
- * @return
- */
- public float getBias() {
- return bias;
- }
-
- /**
- * Sets the the width of the occlusion cone considered by the occludee default is 0.1f
- * @param bias
- */
- public void setBias(float bias) {
- this.bias = bias;
- if (ssaoMat != null) {
- ssaoMat.setFloat("Bias", bias);
- }
- }
-
- /**
- * returns the ambient occlusion intensity
- * @return
- */
- public float getIntensity() {
- return intensity;
- }
-
- /**
- * Sets the Ambient occlusion intensity default is 1.2f
- * @param intensity
- */
- public void setIntensity(float intensity) {
- this.intensity = intensity;
- if (ssaoMat != null) {
- ssaoMat.setFloat("Intensity", intensity);
- }
-
- }
-
- /**
- * returns the sample radius
- * see {link setSampleRadius(float sampleRadius)}
- * @return
- */
- public float getSampleRadius() {
- return sampleRadius;
- }
-
- /**
- * Sets the radius of the area where random samples will be picked dafault 5.1f
- * @param sampleRadius
- */
- public void setSampleRadius(float sampleRadius) {
- this.sampleRadius = sampleRadius;
- if (ssaoMat != null) {
- ssaoMat.setFloat("SampleRadius", sampleRadius);
- }
-
- }
-
- /**
- * returns the scale
- * see {@link setScale(float scale)}
- * @return
- */
- public float getScale() {
- return scale;
- }
-
- /**
- *
- * Returns the distance between occluders and occludee. default 0.2f
- * @param scale
- */
- public void setScale(float scale) {
- this.scale = scale;
- if (ssaoMat != null) {
- ssaoMat.setFloat("Scale", scale);
- }
- }
-
- /**
- * debugging only , will be removed
- * @return
- */
- public boolean isUseAo() {
- return useAo;
- }
-
- /**
- * debugging only , will be removed
- * @return
- */
- public void setUseAo(boolean useAo) {
- this.useAo = useAo;
- if (material != null) {
- material.setBoolean("UseAo", useAo);
- }
-
- }
-
- /**
- * debugging only , will be removed
- * @return
- */
- public boolean isUseOnlyAo() {
- return useOnlyAo;
- }
-
- /**
- * debugging only , will be removed
- * @return
- */
- public void setUseOnlyAo(boolean useOnlyAo) {
- this.useOnlyAo = useOnlyAo;
- if (material != null) {
- material.setBoolean("UseOnlyAo", useOnlyAo);
- }
- }
-
- @Override
- public void write(JmeExporter ex) throws IOException {
- super.write(ex);
- OutputCapsule oc = ex.getCapsule(this);
- oc.write(sampleRadius, "sampleRadius", 5.1f);
- oc.write(intensity, "intensity", 1.5f);
- oc.write(scale, "scale", 0.2f);
- oc.write(bias, "bias", 0.1f);
- }
-
- @Override
- public void read(JmeImporter im) throws IOException {
- super.read(im);
- InputCapsule ic = im.getCapsule(this);
- sampleRadius = ic.readFloat("sampleRadius", 5.1f);
- intensity = ic.readFloat("intensity", 1.5f);
- scale = ic.readFloat("scale", 0.2f);
- bias = ic.readFloat("bias", 0.1f);
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/shadow/BasicShadowRenderer.java b/engine/src/desktop-fx/com/jme3/shadow/BasicShadowRenderer.java
deleted file mode 100644
index 3fd01c93f..000000000
--- a/engine/src/desktop-fx/com/jme3/shadow/BasicShadowRenderer.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.shadow;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.material.Material;
-import com.jme3.math.Vector3f;
-import com.jme3.post.SceneProcessor;
-import com.jme3.renderer.Camera;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.Renderer;
-import com.jme3.renderer.ViewPort;
-import com.jme3.renderer.queue.GeometryList;
-import com.jme3.renderer.queue.RenderQueue;
-import com.jme3.renderer.queue.RenderQueue.ShadowMode;
-import com.jme3.texture.FrameBuffer;
-import com.jme3.texture.Image.Format;
-import com.jme3.texture.Texture2D;
-import com.jme3.ui.Picture;
-
-/**
- * BasicShadowRenderer uses standard shadow mapping with one map
- * it's useful to render shadows in a small scene, but edges might look a bit jagged.
- *
- * @author Kirill Vainer
- */
-public class BasicShadowRenderer implements SceneProcessor {
-
- private RenderManager renderManager;
- private ViewPort viewPort;
- private FrameBuffer shadowFB;
- private Texture2D shadowMap;
- private Camera shadowCam;
- private Material preshadowMat;
- private Material postshadowMat;
- private Picture dispPic = new Picture("Picture");
- private boolean noOccluders = false;
- private Vector3f[] points = new Vector3f[8];
- private Vector3f direction = new Vector3f();
-
- /**
- * Creates a BasicShadowRenderer
- * @param manager the asset manager
- * @param size the size of the shadow map (the map is square)
- */
- public BasicShadowRenderer(AssetManager manager, int size) {
- shadowFB = new FrameBuffer(size, size, 1);
- shadowMap = new Texture2D(size, size, Format.Depth);
- shadowFB.setDepthTexture(shadowMap);
- shadowCam = new Camera(size, size);
-
- preshadowMat = new Material(manager, "Common/MatDefs/Shadow/PreShadow.j3md");
- postshadowMat = new Material(manager, "Common/MatDefs/Shadow/PostShadow.j3md");
- postshadowMat.setTexture("ShadowMap", shadowMap);
-
- dispPic.setTexture(manager, shadowMap, false);
-
- for (int i = 0; i < points.length; i++) {
- points[i] = new Vector3f();
- }
- }
-
- public void initialize(RenderManager rm, ViewPort vp) {
- renderManager = rm;
- viewPort = vp;
-
- reshape(vp, vp.getCamera().getWidth(), vp.getCamera().getHeight());
- }
-
- public boolean isInitialized() {
- return viewPort != null;
- }
-
- /**
- * returns the light direction used for this processor
- * @return
- */
- public Vector3f getDirection() {
- return direction;
- }
-
- /**
- * sets the light direction to use to computs shadows
- * @param direction
- */
- public void setDirection(Vector3f direction) {
- this.direction.set(direction).normalizeLocal();
- }
-
- /**
- * debug only
- * @return
- */
- public Vector3f[] getPoints() {
- return points;
- }
-
- /**
- * debug only
- * returns the shadow camera
- * @return
- */
- public Camera getShadowCamera() {
- return shadowCam;
- }
-
- public void postQueue(RenderQueue rq) {
- GeometryList occluders = rq.getShadowQueueContent(ShadowMode.Cast);
- if (occluders.size() == 0) {
- noOccluders = true;
- return;
- } else {
- noOccluders = false;
- }
-
- GeometryList receivers = rq.getShadowQueueContent(ShadowMode.Receive);
-
- // update frustum points based on current camera
- Camera viewCam = viewPort.getCamera();
- ShadowUtil.updateFrustumPoints(viewCam,
- viewCam.getFrustumNear(),
- viewCam.getFrustumFar(),
- 1.0f,
- points);
-
- Vector3f frustaCenter = new Vector3f();
- for (Vector3f point : points) {
- frustaCenter.addLocal(point);
- }
- frustaCenter.multLocal(1f / 8f);
-
- // update light direction
- shadowCam.setProjectionMatrix(null);
- shadowCam.setParallelProjection(true);
-// shadowCam.setFrustumPerspective(45, 1, 1, 20);
-
- shadowCam.lookAtDirection(direction, Vector3f.UNIT_Y);
- shadowCam.update();
- shadowCam.setLocation(frustaCenter);
- shadowCam.update();
- shadowCam.updateViewProjection();
-
- // render shadow casters to shadow map
- ShadowUtil.updateShadowCamera(occluders, receivers, shadowCam, points);
-
- Renderer r = renderManager.getRenderer();
- renderManager.setCamera(shadowCam, false);
- renderManager.setForcedMaterial(preshadowMat);
-
- r.setFrameBuffer(shadowFB);
- r.clearBuffers(false, true, false);
- viewPort.getQueue().renderShadowQueue(ShadowMode.Cast, renderManager, shadowCam, true);
- r.setFrameBuffer(viewPort.getOutputFrameBuffer());
-
- renderManager.setForcedMaterial(null);
- renderManager.setCamera(viewCam, false);
- }
-
- /**
- * debug only
- * @return
- */
- public Picture getDisplayPicture() {
- return dispPic;
- }
-
- public void postFrame(FrameBuffer out) {
- if (!noOccluders) {
- postshadowMat.setMatrix4("LightViewProjectionMatrix", shadowCam.getViewProjectionMatrix());
- renderManager.setForcedMaterial(postshadowMat);
- viewPort.getQueue().renderShadowQueue(ShadowMode.Receive, renderManager, viewPort.getCamera(), true);
- renderManager.setForcedMaterial(null);
- }
- }
-
- public void preFrame(float tpf) {
- }
-
- public void cleanup() {
- }
-
- public void reshape(ViewPort vp, int w, int h) {
- dispPic.setPosition(w / 20f, h / 20f);
- dispPic.setWidth(w / 5f);
- dispPic.setHeight(h / 5f);
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/shadow/PssmShadowRenderer.java b/engine/src/desktop-fx/com/jme3/shadow/PssmShadowRenderer.java
deleted file mode 100644
index fb9924033..000000000
--- a/engine/src/desktop-fx/com/jme3/shadow/PssmShadowRenderer.java
+++ /dev/null
@@ -1,539 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.shadow;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.material.Material;
-import com.jme3.math.ColorRGBA;
-import com.jme3.math.Matrix4f;
-import com.jme3.math.Vector3f;
-import com.jme3.post.SceneProcessor;
-import com.jme3.renderer.Camera;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.Renderer;
-import com.jme3.renderer.ViewPort;
-import com.jme3.renderer.queue.GeometryList;
-import com.jme3.renderer.queue.OpaqueComparator;
-import com.jme3.renderer.queue.RenderQueue;
-import com.jme3.renderer.queue.RenderQueue.ShadowMode;
-import com.jme3.scene.Geometry;
-import com.jme3.scene.Spatial;
-import com.jme3.scene.debug.WireFrustum;
-import com.jme3.texture.FrameBuffer;
-import com.jme3.texture.Image.Format;
-import com.jme3.texture.Texture.MagFilter;
-import com.jme3.texture.Texture.MinFilter;
-import com.jme3.texture.Texture.ShadowCompareMode;
-import com.jme3.texture.Texture2D;
-import com.jme3.ui.Picture;
-
-/**
- * PssmShadow renderer use Parrallel Split Shadow Mapping technique (pssm)
- * It splits the view frustum in several parts and compute a shadow map for each
- * one.
splits are distributed so that the closer they are from the camera,
- * the smaller they are to maximize the resolution used of the shadow map.
- * This result in a better quality shadow than standard shadow mapping.
for
- * more informations on this read this
- * http://http.developer.nvidia.com/GPUGems3/gpugems3_ch10.html
- *
- * @author Rémy Bouquet aka Nehon
- */
-public class PssmShadowRenderer implements SceneProcessor {
-
- /**
- * FilterMode
specifies how shadows are filtered
- */
- public enum FilterMode {
-
- /**
- * Shadows are not filtered. Nearest sample is used, causing in blocky
- * shadows.
- */
- Nearest,
- /**
- * Bilinear filtering is used. Has the potential of being hardware
- * accelerated on some GPUs
- */
- Bilinear,
- /**
- * Dither-based sampling is used, very cheap but can look bad
- * at low resolutions.
- */
- Dither,
- /**
- * 4x4 percentage-closer filtering is used. Shadows will be smoother
- * at the cost of performance
- */
- PCF4,
- /**
- * 8x8 percentage-closer filtering is used. Shadows will be smoother
- * at the cost of performance
- */
- PCF8
- }
-
- /**
- * Specifies the shadow comparison mode
- */
- public enum CompareMode {
-
- /**
- * Shadow depth comparisons are done by using shader code
- */
- Software,
- /**
- * Shadow depth comparisons are done by using the GPU's dedicated
- * shadowing pipeline.
- */
- Hardware;
- }
- private int nbSplits = 3;
- private float lambda = 0.65f;
- private float shadowIntensity = 0.7f;
- private float zFarOverride = 0;
- private RenderManager renderManager;
- private ViewPort viewPort;
- private FrameBuffer[] shadowFB;
- private Texture2D[] shadowMaps;
- private Texture2D dummyTex;
- private Camera shadowCam;
- private Material preshadowMat;
- private Material postshadowMat;
- private GeometryList splitOccluders = new GeometryList(new OpaqueComparator());
- private Matrix4f[] lightViewProjectionsMatrices;
- private ColorRGBA splits;
- private float[] splitsArray;
- private boolean noOccluders = false;
- private Vector3f direction = new Vector3f();
- private AssetManager assetManager;
- private boolean debug = false;
- private float edgesThickness = 1.0f;
- private FilterMode filterMode;
- private CompareMode compareMode;
- private Picture[] dispPic;
- private Vector3f[] points = new Vector3f[8];
- private boolean flushQueues = true;
-
- /**
- * Create a PSSM Shadow Renderer
- * More info on the technique at http://http.developer.nvidia.com/GPUGems3/gpugems3_ch10.html
- * @param manager the application asset manager
- * @param size the size of the rendered shadowmaps (512,1024,2048, etc...)
- * @param nbSplits the number of shadow maps rendered (the more shadow maps the more quality, the less fps).
- */
- public PssmShadowRenderer(AssetManager manager, int size, int nbSplits) {
- assetManager = manager;
- nbSplits = Math.max(Math.min(nbSplits, 4), 1);
- this.nbSplits = nbSplits;
-
- shadowFB = new FrameBuffer[nbSplits];
- shadowMaps = new Texture2D[nbSplits];
- dispPic = new Picture[nbSplits];
- lightViewProjectionsMatrices = new Matrix4f[nbSplits];
- splits = new ColorRGBA();
- splitsArray = new float[nbSplits + 1];
-
- //DO NOT COMMENT THIS (it prevent the OSX incomplete read buffer crash)
- dummyTex = new Texture2D(size, size, Format.RGBA8);
-
- preshadowMat = new Material(manager, "Common/MatDefs/Shadow/PreShadow.j3md");
- postshadowMat = new Material(manager, "Common/MatDefs/Shadow/PostShadowPSSM.j3md");
-
- for (int i = 0; i < nbSplits; i++) {
- lightViewProjectionsMatrices[i] = new Matrix4f();
- shadowFB[i] = new FrameBuffer(size, size, 1);
- shadowMaps[i] = new Texture2D(size, size, Format.Depth);
-
- shadowFB[i].setDepthTexture(shadowMaps[i]);
-
- //DO NOT COMMENT THIS (it prevent the OSX incomplete read buffer crash)
- shadowFB[i].setColorTexture(dummyTex);
-
- postshadowMat.setTexture("ShadowMap" + i, shadowMaps[i]);
-
- //quads for debuging purpose
- dispPic[i] = new Picture("Picture" + i);
- dispPic[i].setTexture(manager, shadowMaps[i], false);
- }
-
- setCompareMode(CompareMode.Hardware);
- setFilterMode(FilterMode.Bilinear);
- setShadowIntensity(0.7f);
-
- shadowCam = new Camera(size, size);
- shadowCam.setParallelProjection(true);
-
- for (int i = 0; i < points.length; i++) {
- points[i] = new Vector3f();
- }
- }
-
- /**
- * Sets the filtering mode for shadow edges see {@link FilterMode} for more info
- * @param filterMode
- */
- public void setFilterMode(FilterMode filterMode) {
- if (filterMode == null) {
- throw new NullPointerException();
- }
-
- if (this.filterMode == filterMode) {
- return;
- }
-
- this.filterMode = filterMode;
- postshadowMat.setInt("FilterMode", filterMode.ordinal());
- postshadowMat.setFloat("PCFEdge", edgesThickness);
- if (compareMode == CompareMode.Hardware) {
- for (Texture2D shadowMap : shadowMaps) {
- if (filterMode == FilterMode.Bilinear) {
- shadowMap.setMagFilter(MagFilter.Bilinear);
- shadowMap.setMinFilter(MinFilter.BilinearNoMipMaps);
- } else {
- shadowMap.setMagFilter(MagFilter.Nearest);
- shadowMap.setMinFilter(MinFilter.NearestNoMipMaps);
- }
- }
- }
- }
-
- /**
- * sets the shadow compare mode see {@link CompareMode} for more info
- * @param compareMode
- */
- public void setCompareMode(CompareMode compareMode) {
- if (compareMode == null) {
- throw new NullPointerException();
- }
-
- if (this.compareMode == compareMode) {
- return;
- }
-
- this.compareMode = compareMode;
- for (Texture2D shadowMap : shadowMaps) {
- if (compareMode == CompareMode.Hardware) {
- shadowMap.setShadowCompareMode(ShadowCompareMode.LessOrEqual);
- if (filterMode == FilterMode.Bilinear) {
- shadowMap.setMagFilter(MagFilter.Bilinear);
- shadowMap.setMinFilter(MinFilter.BilinearNoMipMaps);
- } else {
- shadowMap.setMagFilter(MagFilter.Nearest);
- shadowMap.setMinFilter(MinFilter.NearestNoMipMaps);
- }
- } else {
- shadowMap.setShadowCompareMode(ShadowCompareMode.Off);
- shadowMap.setMagFilter(MagFilter.Nearest);
- shadowMap.setMinFilter(MinFilter.NearestNoMipMaps);
- }
- }
- postshadowMat.setBoolean("HardwareShadows", compareMode == CompareMode.Hardware);
- }
-
- //debug function that create a displayable frustrum
- private Geometry createFrustum(Vector3f[] pts, int i) {
- WireFrustum frustum = new WireFrustum(pts);
- Geometry frustumMdl = new Geometry("f", frustum);
- frustumMdl.setCullHint(Spatial.CullHint.Never);
- frustumMdl.setShadowMode(ShadowMode.Off);
- Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
- mat.getAdditionalRenderState().setWireframe(true);
- frustumMdl.setMaterial(mat);
- switch (i) {
- case 0:
- frustumMdl.getMaterial().setColor("Color", ColorRGBA.Pink);
- break;
- case 1:
- frustumMdl.getMaterial().setColor("Color", ColorRGBA.Red);
- break;
- case 2:
- frustumMdl.getMaterial().setColor("Color", ColorRGBA.Green);
- break;
- case 3:
- frustumMdl.getMaterial().setColor("Color", ColorRGBA.Blue);
- break;
- default:
- frustumMdl.getMaterial().setColor("Color", ColorRGBA.White);
- break;
- }
-
- frustumMdl.updateGeometricState();
- return frustumMdl;
- }
-
- public void initialize(RenderManager rm, ViewPort vp) {
- renderManager = rm;
- viewPort = vp;
- }
-
- public boolean isInitialized() {
- return viewPort != null;
- }
-
- /**
- * returns the light direction used by the processor
- * @return
- */
- public Vector3f getDirection() {
- return direction;
- }
-
- /**
- * Sets the light direction to use to compute shadows
- * @param direction
- */
- public void setDirection(Vector3f direction) {
- this.direction.set(direction).normalizeLocal();
- }
-
- @SuppressWarnings("fallthrough")
- public void postQueue(RenderQueue rq) {
- GeometryList occluders = rq.getShadowQueueContent(ShadowMode.Cast);
- if (occluders.size() == 0) {
- return;
- }
-
- GeometryList receivers = rq.getShadowQueueContent(ShadowMode.Receive);
- if (receivers.size() == 0) {
- return;
- }
-
- Camera viewCam = viewPort.getCamera();
-
- float zFar = zFarOverride;
- if (zFar == 0) {
- zFar = viewCam.getFrustumFar();
- }
-
- //We prevent computing the frustum points and splits with zeroed or negative near clip value
- float frustumNear = Math.max(viewCam.getFrustumNear(), 0.001f);
- ShadowUtil.updateFrustumPoints(viewCam, frustumNear, zFar, 1.0f, points);
-
- //shadowCam.setDirection(direction);
- shadowCam.getRotation().lookAt(direction, shadowCam.getUp());
- shadowCam.update();
- shadowCam.updateViewProjection();
-
- PssmShadowUtil.updateFrustumSplits(splitsArray, frustumNear, zFar, lambda);
-
-
- switch (splitsArray.length) {
- case 5:
- splits.a = splitsArray[4];
- case 4:
- splits.b = splitsArray[3];
- case 3:
- splits.g = splitsArray[2];
- case 2:
- case 1:
- splits.r = splitsArray[1];
- break;
- }
-
- Renderer r = renderManager.getRenderer();
- renderManager.setForcedMaterial(preshadowMat);
- renderManager.setForcedTechnique("PreShadow");
-
- for (int i = 0; i < nbSplits; i++) {
-
- // update frustum points based on current camera and split
- ShadowUtil.updateFrustumPoints(viewCam, splitsArray[i], splitsArray[i + 1], 1.0f, points);
-
- //Updating shadow cam with curent split frustra
- ShadowUtil.updateShadowCamera(occluders, receivers, shadowCam, points, splitOccluders);
-
- //saving light view projection matrix for this split
- lightViewProjectionsMatrices[i] = shadowCam.getViewProjectionMatrix().clone();
- renderManager.setCamera(shadowCam, false);
-
- r.setFrameBuffer(shadowFB[i]);
- r.clearBuffers(false, true, false);
-
- // render shadow casters to shadow map
- viewPort.getQueue().renderShadowQueue(splitOccluders, renderManager, shadowCam, true);
- }
- if (flushQueues) {
- occluders.clear();
- }
- //restore setting for future rendering
- r.setFrameBuffer(viewPort.getOutputFrameBuffer());
- renderManager.setForcedMaterial(null);
- renderManager.setForcedTechnique(null);
- renderManager.setCamera(viewCam, false);
-
- }
-
- //debug only : displays depth shadow maps
- private void displayShadowMap(Renderer r) {
- Camera cam = viewPort.getCamera();
- renderManager.setCamera(cam, true);
- int h = cam.getHeight();
- for (int i = 0; i < dispPic.length; i++) {
- dispPic[i].setPosition(64 * (i + 1) + 128 * i, h / 20f);
- dispPic[i].setWidth(128);
- dispPic[i].setHeight(128);
- dispPic[i].updateGeometricState();
- renderManager.renderGeometry(dispPic[i]);
- }
- renderManager.setCamera(cam, false);
- }
-
- /**For dubuging purpose
- * Allow to "snapshot" the current frustrum to the scene
- */
- public void displayDebug() {
- debug = true;
- }
-
- public void postFrame(FrameBuffer out) {
- Camera cam = viewPort.getCamera();
- if (!noOccluders) {
- postshadowMat.setColor("Splits", splits);
- for (int i = 0; i < nbSplits; i++) {
- postshadowMat.setMatrix4("LightViewProjectionMatrix" + i, lightViewProjectionsMatrices[i]);
- }
- renderManager.setForcedMaterial(postshadowMat);
-
- viewPort.getQueue().renderShadowQueue(ShadowMode.Receive, renderManager, cam, flushQueues);
-
- renderManager.setForcedMaterial(null);
- renderManager.setCamera(cam, false);
-
- }
- if (debug) {
- displayShadowMap(renderManager.getRenderer());
- }
- }
-
- public void preFrame(float tpf) {
- }
-
- public void cleanup() {
- }
-
- public void reshape(ViewPort vp, int w, int h) {
- }
-
- /**
- * returns the labda parameter
- * see {@link setLambda(float lambda)}
- * @return lambda
- */
- public float getLambda() {
- return lambda;
- }
-
- /*
- * Adjust the repartition of the different shadow maps in the shadow extend
- * usualy goes from 0.0 to 1.0
- * a low value give a more linear repartition resulting in a constant quality in the shadow over the extends, but near shadows could look very jagged
- * a high value give a more logarithmic repartition resulting in a high quality for near shadows, but the quality quickly decrease over the extend.
- * the default value is set to 0.65f (theoric optimal value).
- * @param lambda the lambda value.
- */
- public void setLambda(float lambda) {
- this.lambda = lambda;
- }
-
- /**
- * How far the shadows are rendered in the view
- * see {@link setShadowZExtend(float zFar)}
- * @return shadowZExtend
- */
- public float getShadowZExtend() {
- return zFarOverride;
- }
-
- /**
- * Set the distance from the eye where the shadows will be rendered
- * default value is dynamicaly computed to the shadow casters/receivers union bound zFar, capped to view frustum far value.
- * @param zFar the zFar values that override the computed one
- */
- public void setShadowZExtend(float zFar) {
- this.zFarOverride = zFar;
- }
-
- /**
- * returns the shdaow intensity
- * see {@link setShadowIntensity(float shadowIntensity)}
- * @return shadowIntensity
- */
- public float getShadowIntensity() {
- return shadowIntensity;
- }
-
- /**
- * Set the shadowIntensity, the value should be between 0 and 1,
- * a 0 value gives a bright and invisilble shadow,
- * a 1 value gives a pitch black shadow,
- * default is 0.7
- * @param shadowIntensity the darkness of the shadow
- */
- public void setShadowIntensity(float shadowIntensity) {
- this.shadowIntensity = shadowIntensity;
- postshadowMat.setFloat("ShadowIntensity", shadowIntensity);
- }
-
- /**
- * returns the edges thickness
- * see {@link setEdgesThickness(int edgesThickness)}
- * @return edgesThickness
- */
- public int getEdgesThickness() {
- return (int) (edgesThickness * 10);
- }
-
- /**
- * Sets the shadow edges thickness. default is 1, setting it to lower values can help to reduce the jagged effect of the shadow edges
- * @param edgesThickness
- */
- public void setEdgesThickness(int edgesThickness) {
- this.edgesThickness = Math.max(1, Math.min(edgesThickness, 10));
- this.edgesThickness *= 0.1f;
- postshadowMat.setFloat("PCFEdge", edgesThickness);
- }
-
- /**
- * returns true if the PssmRenderer flushed the shadow queues
- * @return flushQueues
- */
- public boolean isFlushQueues() {
- return flushQueues;
- }
-
- /**
- * Set this to false if you want to use several PssmRederers to have multiple shadows cast by multiple light sources.
- * Make sure the last PssmRenderer in the stack DO flush the queues, but not the others
- * @param flushQueues
- */
- public void setFlushQueues(boolean flushQueues) {
- this.flushQueues = flushQueues;
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/shadow/PssmShadowUtil.java b/engine/src/desktop-fx/com/jme3/shadow/PssmShadowUtil.java
deleted file mode 100644
index 263362565..000000000
--- a/engine/src/desktop-fx/com/jme3/shadow/PssmShadowUtil.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.shadow;
-
-import com.jme3.bounding.BoundingBox;
-import com.jme3.math.FastMath;
-import com.jme3.math.Matrix4f;
-import com.jme3.renderer.Camera;
-import com.jme3.renderer.queue.GeometryList;
-import static java.lang.Math.max;
-import static java.lang.Math.min;
-
-/**
- * Includes various useful shadow mapping functions.
- *
- * @see
- *
- * for more info.
- */
-public final class PssmShadowUtil {
-
- /**
- * Updates the frustum splits stores in splits
using PSSM.
- */
- public static void updateFrustumSplits(float[] splits, float near, float far, float lambda) {
- for (int i = 0; i < splits.length; i++) {
- float IDM = i / (float) splits.length;
- float log = near * FastMath.pow((far / near), IDM);
- float uniform = near + (far - near) * IDM;
- splits[i] = log * lambda + uniform * (1.0f - lambda);
- }
-
- // This is used to improve the correctness of the calculations. Our main near- and farplane
- // of the camera always stay the same, no matter what happens.
- splits[0] = near;
- splits[splits.length - 1] = far;
- }
-
- /**
- * Compute the Zfar in the model vieuw to adjust the Zfar distance for the splits calculation
- */
- public static float computeZFar(GeometryList occ, GeometryList recv, Camera cam) {
- Matrix4f mat = cam.getViewMatrix();
- BoundingBox bbOcc = ShadowUtil.computeUnionBound(occ, mat);
- BoundingBox bbRecv = ShadowUtil.computeUnionBound(recv, mat);
-
- return min(max(bbOcc.getZExtent() - bbOcc.getCenter().z, bbRecv.getZExtent() - bbRecv.getCenter().z), cam.getFrustumFar());
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/shadow/ShadowCamera.java b/engine/src/desktop-fx/com/jme3/shadow/ShadowCamera.java
deleted file mode 100644
index 920e4564d..000000000
--- a/engine/src/desktop-fx/com/jme3/shadow/ShadowCamera.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.shadow;
-
-import com.jme3.light.DirectionalLight;
-import com.jme3.light.Light;
-import com.jme3.light.PointLight;
-import com.jme3.math.Vector3f;
-import com.jme3.renderer.Camera;
-
-/**
- * Creates a camera according to a light
- * Handy to compute projection matrix of a light
- * @author Kirill Vainer
- */
-public class ShadowCamera {
-
- private Vector3f[] points = new Vector3f[8];
- private Light target;
-
- public ShadowCamera(Light target) {
- this.target = target;
- for (int i = 0; i < points.length; i++) {
- points[i] = new Vector3f();
- }
- }
-
- /**
- * Updates the camera view direction and position based on the light
- */
- public void updateLightCamera(Camera lightCam) {
- if (target.getType() == Light.Type.Directional) {
- DirectionalLight dl = (DirectionalLight) target;
- lightCam.setParallelProjection(true);
- lightCam.setLocation(Vector3f.ZERO);
- lightCam.lookAtDirection(dl.getDirection(), Vector3f.UNIT_Y);
- lightCam.setFrustum(-1, 1, -1, 1, 1, -1);
- } else {
- PointLight pl = (PointLight) target;
- lightCam.setParallelProjection(false);
- lightCam.setLocation(pl.getPosition());
- // direction will have to be calculated automatically
- lightCam.setFrustumPerspective(45, 1, 1, 300);
- }
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/shadow/ShadowUtil.java b/engine/src/desktop-fx/com/jme3/shadow/ShadowUtil.java
deleted file mode 100644
index c488f5e89..000000000
--- a/engine/src/desktop-fx/com/jme3/shadow/ShadowUtil.java
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.shadow;
-
-import com.jme3.bounding.BoundingBox;
-import com.jme3.bounding.BoundingVolume;
-import com.jme3.math.Matrix4f;
-import com.jme3.math.Transform;
-import com.jme3.math.Vector2f;
-import com.jme3.math.Vector3f;
-import com.jme3.renderer.Camera;
-import com.jme3.renderer.queue.GeometryList;
-import com.jme3.scene.Geometry;
-import static java.lang.Math.max;
-import static java.lang.Math.min;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Includes various useful shadow mapping functions.
- *
- * @see
- *
- * for more info.
- */
-public class ShadowUtil {
-
- /**
- * Updates a points arrays with the frustum corners of the provided camera.
- * @param viewCam
- * @param points
- */
- public static void updateFrustumPoints2(Camera viewCam, Vector3f[] points) {
- int w = viewCam.getWidth();
- int h = viewCam.getHeight();
- float n = viewCam.getFrustumNear();
- float f = viewCam.getFrustumFar();
-
- points[0].set(viewCam.getWorldCoordinates(new Vector2f(0, 0), n));
- points[1].set(viewCam.getWorldCoordinates(new Vector2f(0, h), n));
- points[2].set(viewCam.getWorldCoordinates(new Vector2f(w, h), n));
- points[3].set(viewCam.getWorldCoordinates(new Vector2f(w, 0), n));
-
- points[4].set(viewCam.getWorldCoordinates(new Vector2f(0, 0), f));
- points[5].set(viewCam.getWorldCoordinates(new Vector2f(0, h), f));
- points[6].set(viewCam.getWorldCoordinates(new Vector2f(w, h), f));
- points[7].set(viewCam.getWorldCoordinates(new Vector2f(w, 0), f));
- }
-
- /**
- * Updates the points array to contain the frustum corners of the given
- * camera. The nearOverride and farOverride variables can be used
- * to override the camera's near/far values with own values.
- *
- * TODO: Reduce creation of new vectors
- *
- * @param viewCam
- * @param nearOverride
- * @param farOverride
- */
- public static void updateFrustumPoints(Camera viewCam,
- float nearOverride,
- float farOverride,
- float scale,
- Vector3f[] points) {
-
- Vector3f pos = viewCam.getLocation();
- Vector3f dir = viewCam.getDirection();
- Vector3f up = viewCam.getUp();
-
- float depthHeightRatio = viewCam.getFrustumTop() / viewCam.getFrustumNear();
- float near = nearOverride;
- float far = farOverride;
- float ftop = viewCam.getFrustumTop();
- float fright = viewCam.getFrustumRight();
- float ratio = fright / ftop;
-
- float near_height;
- float near_width;
- float far_height;
- float far_width;
-
- if (viewCam.isParallelProjection()) {
- near_height = ftop;
- near_width = near_height * ratio;
- far_height = ftop;
- far_width = far_height * ratio;
- } else {
- near_height = depthHeightRatio * near;
- near_width = near_height * ratio;
- far_height = depthHeightRatio * far;
- far_width = far_height * ratio;
- }
-
- Vector3f right = dir.cross(up).normalizeLocal();
-
- Vector3f temp = new Vector3f();
- temp.set(dir).multLocal(far).addLocal(pos);
- Vector3f farCenter = temp.clone();
- temp.set(dir).multLocal(near).addLocal(pos);
- Vector3f nearCenter = temp.clone();
-
- Vector3f nearUp = temp.set(up).multLocal(near_height).clone();
- Vector3f farUp = temp.set(up).multLocal(far_height).clone();
- Vector3f nearRight = temp.set(right).multLocal(near_width).clone();
- Vector3f farRight = temp.set(right).multLocal(far_width).clone();
-
- points[0].set(nearCenter).subtractLocal(nearUp).subtractLocal(nearRight);
- points[1].set(nearCenter).addLocal(nearUp).subtractLocal(nearRight);
- points[2].set(nearCenter).addLocal(nearUp).addLocal(nearRight);
- points[3].set(nearCenter).subtractLocal(nearUp).addLocal(nearRight);
-
- points[4].set(farCenter).subtractLocal(farUp).subtractLocal(farRight);
- points[5].set(farCenter).addLocal(farUp).subtractLocal(farRight);
- points[6].set(farCenter).addLocal(farUp).addLocal(farRight);
- points[7].set(farCenter).subtractLocal(farUp).addLocal(farRight);
-
- if (scale != 1.0f) {
- // find center of frustum
- Vector3f center = new Vector3f();
- for (int i = 0; i < 8; i++) {
- center.addLocal(points[i]);
- }
- center.divideLocal(8f);
-
- Vector3f cDir = new Vector3f();
- for (int i = 0; i < 8; i++) {
- cDir.set(points[i]).subtractLocal(center);
- cDir.multLocal(scale - 1.0f);
- points[i].addLocal(cDir);
- }
- }
- }
-
- /**
- * Compute bounds of a geomList
- * @param list
- * @param transform
- * @return
- */
- public static BoundingBox computeUnionBound(GeometryList list, Transform transform) {
- BoundingBox bbox = new BoundingBox();
- for (int i = 0; i < list.size(); i++) {
- BoundingVolume vol = list.get(i).getWorldBound();
- BoundingVolume newVol = vol.transform(transform);
- //Nehon : prevent NaN and infinity values to screw the final bounding box
- if (!Float.isNaN(newVol.getCenter().x) && !Float.isInfinite(newVol.getCenter().x)) {
- bbox.mergeLocal(newVol);
- }
- }
- return bbox;
- }
-
- /**
- * Compute bounds of a geomList
- * @param list
- * @param mat
- * @return
- */
- public static BoundingBox computeUnionBound(GeometryList list, Matrix4f mat) {
- BoundingBox bbox = new BoundingBox();
- BoundingVolume store = null;
- for (int i = 0; i < list.size(); i++) {
- BoundingVolume vol = list.get(i).getWorldBound();
- store = vol.clone().transform(mat, null);
- //Nehon : prevent NaN and infinity values to screw the final bounding box
- if (!Float.isNaN(store.getCenter().x) && !Float.isInfinite(store.getCenter().x)) {
- bbox.mergeLocal(store);
- }
- }
- return bbox;
- }
-
- /**
- * Computes the bounds of multiple bounding volumes
- * @param bv
- * @return
- */
- public static BoundingBox computeUnionBound(List bv) {
- BoundingBox bbox = new BoundingBox();
- for (int i = 0; i < bv.size(); i++) {
- BoundingVolume vol = bv.get(i);
- bbox.mergeLocal(vol);
- }
- return bbox;
- }
-
- /**
- * Compute bounds from an array of points
- * @param pts
- * @param transform
- * @return
- */
- public static BoundingBox computeBoundForPoints(Vector3f[] pts, Transform transform) {
- Vector3f min = new Vector3f(Vector3f.POSITIVE_INFINITY);
- Vector3f max = new Vector3f(Vector3f.NEGATIVE_INFINITY);
- Vector3f temp = new Vector3f();
- for (int i = 0; i < pts.length; i++) {
- transform.transformVector(pts[i], temp);
-
- min.minLocal(temp);
- max.maxLocal(temp);
- }
- Vector3f center = min.add(max).multLocal(0.5f);
- Vector3f extent = max.subtract(min).multLocal(0.5f);
- return new BoundingBox(center, extent.x, extent.y, extent.z);
- }
-
- /**
- * Compute bounds from an array of points
- * @param pts
- * @param mat
- * @return
- */
- public static BoundingBox computeBoundForPoints(Vector3f[] pts, Matrix4f mat) {
- Vector3f min = new Vector3f(Vector3f.POSITIVE_INFINITY);
- Vector3f max = new Vector3f(Vector3f.NEGATIVE_INFINITY);
- Vector3f temp = new Vector3f();
-
- for (int i = 0; i < pts.length; i++) {
- float w = mat.multProj(pts[i], temp);
-
- temp.x /= w;
- temp.y /= w;
- // Why was this commented out?
- temp.z /= w;
-
- min.minLocal(temp);
- max.maxLocal(temp);
- }
-
- Vector3f center = min.add(max).multLocal(0.5f);
- Vector3f extent = max.subtract(min).multLocal(0.5f);
- //Nehon 08/18/2010 : Added an offset to the extend to avoid banding artifacts when the frustum are aligned
- return new BoundingBox(center, extent.x + 2.0f, extent.y + 2.0f, extent.z + 2.5f);
- }
-
- /**
- * Updates the shadow camera to properly contain the given
- * points (which contain the eye camera frustum corners)
- *
- * @param occluders
- * @param lightCam
- * @param points
- */
- public static void updateShadowCamera(Camera shadowCam, Vector3f[] points) {
- boolean ortho = shadowCam.isParallelProjection();
- shadowCam.setProjectionMatrix(null);
-
- if (ortho) {
- shadowCam.setFrustum(-1, 1, -1, 1, 1, -1);
- } else {
- shadowCam.setFrustumPerspective(45, 1, 1, 150);
- }
-
- Matrix4f viewProjMatrix = shadowCam.getViewProjectionMatrix();
- Matrix4f projMatrix = shadowCam.getProjectionMatrix();
-
- BoundingBox splitBB = computeBoundForPoints(points, viewProjMatrix);
-
- Vector3f splitMin = splitBB.getMin(null);
- Vector3f splitMax = splitBB.getMax(null);
-
-// splitMin.z = 0;
-
- // Create the crop matrix.
- float scaleX, scaleY, scaleZ;
- float offsetX, offsetY, offsetZ;
-
- scaleX = 2.0f / (splitMax.x - splitMin.x);
- scaleY = 2.0f / (splitMax.y - splitMin.y);
- offsetX = -0.5f * (splitMax.x + splitMin.x) * scaleX;
- offsetY = -0.5f * (splitMax.y + splitMin.y) * scaleY;
- scaleZ = 1.0f / (splitMax.z - splitMin.z);
- offsetZ = -splitMin.z * scaleZ;
-
- Matrix4f cropMatrix = new Matrix4f(scaleX, 0f, 0f, offsetX,
- 0f, scaleY, 0f, offsetY,
- 0f, 0f, scaleZ, offsetZ,
- 0f, 0f, 0f, 1f);
-
-
- Matrix4f result = new Matrix4f();
- result.set(cropMatrix);
- result.multLocal(projMatrix);
-
- shadowCam.setProjectionMatrix(result);
- }
-
- /**
- * Updates the shadow camera to properly contain the given
- * points (which contain the eye camera frustum corners) and the
- * shadow occluder objects.
- *
- * @param occluders
- * @param lightCam
- * @param points
- */
- public static void updateShadowCamera(GeometryList occluders,
- GeometryList receivers,
- Camera shadowCam,
- Vector3f[] points) {
- updateShadowCamera(occluders, receivers, shadowCam, points, null);
- }
-
- /**
- * Updates the shadow camera to properly contain the given
- * points (which contain the eye camera frustum corners) and the
- * shadow occluder objects.
- *
- * @param occluders
- * @param lightCam
- * @param points
- */
- public static void updateShadowCamera(GeometryList occluders,
- GeometryList receivers,
- Camera shadowCam,
- Vector3f[] points,
- GeometryList splitOccluders) {
-
- boolean ortho = shadowCam.isParallelProjection();
-
- shadowCam.setProjectionMatrix(null);
-
- if (ortho) {
- shadowCam.setFrustum(-1, 1, -1, 1, 1, -1);
- } else {
- shadowCam.setFrustumPerspective(45, 1, 1, 150);
- }
-
- // create transform to rotate points to viewspace
- Matrix4f viewProjMatrix = shadowCam.getViewProjectionMatrix();
-
- BoundingBox splitBB = computeBoundForPoints(points, viewProjMatrix);
-
- ArrayList visRecvList = new ArrayList();
- for (int i = 0; i < receivers.size(); i++) {
- // convert bounding box to light's viewproj space
- Geometry receiver = receivers.get(i);
- BoundingVolume bv = receiver.getWorldBound();
- BoundingVolume recvBox = bv.transform(viewProjMatrix, null);
-
- if (splitBB.intersects(recvBox)) {
- visRecvList.add(recvBox);
- }
- }
-
- ArrayList visOccList = new ArrayList();
- for (int i = 0; i < occluders.size(); i++) {
- // convert bounding box to light's viewproj space
- Geometry occluder = occluders.get(i);
- BoundingVolume bv = occluder.getWorldBound();
- BoundingVolume occBox = bv.transform(viewProjMatrix, null);
-
- boolean intersects = splitBB.intersects(occBox);
- if (!intersects && occBox instanceof BoundingBox) {
- BoundingBox occBB = (BoundingBox) occBox;
- //Kirill 01/10/2011
- // Extend the occluder further into the frustum
- // This fixes shadow dissapearing issues when
- // the caster itself is not in the view camera
- // but its shadow is in the camera
- // The number is in world units
- occBB.setZExtent(occBB.getZExtent() + 50);
- occBB.setCenter(occBB.getCenter().addLocal(0, 0, 25));
- if (splitBB.intersects(occBB)) {
- // To prevent extending the depth range too much
- // We return the bound to its former shape
- // Before adding it
- occBB.setZExtent(occBB.getZExtent() - 50);
- occBB.setCenter(occBB.getCenter().subtractLocal(0, 0, 25));
- visOccList.add(occBox);
- if (splitOccluders != null) {
- splitOccluders.add(occluder);
- }
- }
- } else if (intersects) {
- visOccList.add(occBox);
- if (splitOccluders != null) {
- splitOccluders.add(occluder);
- }
- }
- }
-
- BoundingBox casterBB = computeUnionBound(visOccList);
- BoundingBox receiverBB = computeUnionBound(visRecvList);
-
- //Nehon 08/18/2010 this is to avoid shadow bleeding when the ground is set to only receive shadows
- if (visOccList.size() != visRecvList.size()) {
- casterBB.setXExtent(casterBB.getXExtent() + 2.0f);
- casterBB.setYExtent(casterBB.getYExtent() + 2.0f);
- casterBB.setZExtent(casterBB.getZExtent() + 2.0f);
- }
-
- Vector3f casterMin = casterBB.getMin(null);
- Vector3f casterMax = casterBB.getMax(null);
-
- Vector3f receiverMin = receiverBB.getMin(null);
- Vector3f receiverMax = receiverBB.getMax(null);
-
- Vector3f splitMin = splitBB.getMin(null);
- Vector3f splitMax = splitBB.getMax(null);
-
- splitMin.z = 0;
-
- if (!ortho) {
- shadowCam.setFrustumPerspective(45, 1, 1, splitMax.z);
- }
-
- Matrix4f projMatrix = shadowCam.getProjectionMatrix();
-
- Vector3f cropMin = new Vector3f();
- Vector3f cropMax = new Vector3f();
-
- // IMPORTANT: Special handling for Z values
- cropMin.x = max(max(casterMin.x, receiverMin.x), splitMin.x);
- cropMax.x = min(min(casterMax.x, receiverMax.x), splitMax.x);
-
- cropMin.y = max(max(casterMin.y, receiverMin.y), splitMin.y);
- cropMax.y = min(min(casterMax.y, receiverMax.y), splitMax.y);
-
- cropMin.z = min(casterMin.z, splitMin.z);
- cropMax.z = min(receiverMax.z, splitMax.z);
-
-
- // Create the crop matrix.
- float scaleX, scaleY, scaleZ;
- float offsetX, offsetY, offsetZ;
-
- scaleX = (2.0f) / (cropMax.x - cropMin.x);
- scaleY = (2.0f) / (cropMax.y - cropMin.y);
-
- offsetX = -0.5f * (cropMax.x + cropMin.x) * scaleX;
- offsetY = -0.5f * (cropMax.y + cropMin.y) * scaleY;
-
- scaleZ = 1.0f / (cropMax.z - cropMin.z);
- offsetZ = -cropMin.z * scaleZ;
-
-
-
- Matrix4f cropMatrix = new Matrix4f(scaleX, 0f, 0f, offsetX,
- 0f, scaleY, 0f, offsetY,
- 0f, 0f, scaleZ, offsetZ,
- 0f, 0f, 0f, 1f);
-
-
- Matrix4f result = new Matrix4f();
- result.set(cropMatrix);
- result.multLocal(projMatrix);
-
- shadowCam.setProjectionMatrix(result);
-
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/water/ReflectionProcessor.java b/engine/src/desktop-fx/com/jme3/water/ReflectionProcessor.java
deleted file mode 100644
index 9a14df82f..000000000
--- a/engine/src/desktop-fx/com/jme3/water/ReflectionProcessor.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * 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
- * returns the frame buffer
- * @return
- */
- public FrameBuffer getReflectionBuffer() {
- return reflectionBuffer;
- }
-
- /**
- * Internal use only
- * 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;
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/water/SimpleWaterProcessor.java b/engine/src/desktop-fx/com/jme3/water/SimpleWaterProcessor.java
deleted file mode 100644
index 70ccd1130..000000000
--- a/engine/src/desktop-fx/com/jme3/water/SimpleWaterProcessor.java
+++ /dev/null
@@ -1,589 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.water;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.material.Material;
-import com.jme3.math.*;
-import com.jme3.post.SceneProcessor;
-import com.jme3.renderer.Camera;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.Renderer;
-import com.jme3.renderer.ViewPort;
-import com.jme3.renderer.queue.RenderQueue;
-import com.jme3.scene.Geometry;
-import com.jme3.scene.Spatial;
-import com.jme3.scene.shape.Quad;
-import com.jme3.texture.FrameBuffer;
-import com.jme3.texture.Image.Format;
-import com.jme3.texture.Texture.WrapMode;
-import com.jme3.texture.Texture2D;
-import com.jme3.ui.Picture;
-
-/**
- *
- * Simple Water renders a simple plane that use reflection and refraction to look like water.
- * It's pretty basic, but much faster than the WaterFilter
- * It's useful if you aim low specs hardware and still want a good looking water.
- * Usage is :
- *
- * SimpleWaterProcessor waterProcessor = new SimpleWaterProcessor(assetManager);
- * //setting the scene to use for reflection
- * waterProcessor.setReflectionScene(mainScene);
- * //setting the light position
- * waterProcessor.setLightPosition(lightPos);
- *
- * //setting the water plane
- * Vector3f waterLocation=new Vector3f(0,-20,0);
- * waterProcessor.setPlane(new Plane(Vector3f.UNIT_Y, waterLocation.dot(Vector3f.UNIT_Y)));
- * //setting the water color
- * waterProcessor.setWaterColor(ColorRGBA.Brown);
- *
- * //creating a quad to render water to
- * Quad quad = new Quad(400,400);
- *
- * //the texture coordinates define the general size of the waves
- * quad.scaleTextureCoordinates(new Vector2f(6f,6f));
- *
- * //creating a geom to attach the water material
- * Geometry water=new Geometry("water", quad);
- * water.setLocalTranslation(-200, -20, 250);
- * water.setLocalRotation(new Quaternion().fromAngleAxis(-FastMath.HALF_PI, Vector3f.UNIT_X));
- * //finally setting the material
- * water.setMaterial(waterProcessor.getMaterial());
- *
- * //attaching the water to the root node
- * rootNode.attachChild(water);
- *
- * @author Normen Hansen & Rémy Bouquet
- */
-public class SimpleWaterProcessor implements SceneProcessor {
-
- protected RenderManager rm;
- protected ViewPort vp;
- protected Spatial reflectionScene;
- protected ViewPort reflectionView;
- protected ViewPort refractionView;
- protected FrameBuffer reflectionBuffer;
- protected FrameBuffer refractionBuffer;
- protected Camera reflectionCam;
- protected Camera refractionCam;
- protected Texture2D reflectionTexture;
- protected Texture2D refractionTexture;
- protected Texture2D depthTexture;
- protected Texture2D normalTexture;
- protected Texture2D dudvTexture;
- protected int renderWidth = 512;
- protected int renderHeight = 512;
- protected Plane plane = new Plane(Vector3f.UNIT_Y, Vector3f.ZERO.dot(Vector3f.UNIT_Y));
- protected float speed = 0.05f;
- protected Ray ray = new Ray();
- protected Vector3f targetLocation = new Vector3f();
- protected AssetManager manager;
- protected Material material;
- protected float waterDepth = 1;
- protected float waterTransparency = 0.4f;
- protected boolean debug = false;
- private Picture dispRefraction;
- private Picture dispReflection;
- private Picture dispDepth;
- private Plane reflectionClipPlane;
- private Plane refractionClipPlane;
- private float refractionClippingOffset = 0.3f;
- private float reflectionClippingOffset = -5f;
- private Vector3f vect1 = new Vector3f();
- private Vector3f vect2 = new Vector3f();
- private Vector3f vect3 = new Vector3f();
-
- /**
- * Creates a SimpleWaterProcessor
- * @param manager the asset manager
- */
- public SimpleWaterProcessor(AssetManager manager) {
- this.manager = manager;
- material = new Material(manager, "Common/MatDefs/Water/SimpleWater.j3md");
- material.setFloat("waterDepth", waterDepth);
- material.setFloat("waterTransparency", waterTransparency / 10);
- material.setColor("waterColor", ColorRGBA.White);
- material.setVector3("lightPos", new Vector3f(1, -1, 1));
-
- material.setColor("distortionScale", new ColorRGBA(0.2f, 0.2f, 0.2f, 0.2f));
- material.setColor("distortionMix", new ColorRGBA(0.5f, 0.5f, 0.5f, 0.5f));
- material.setColor("texScale", new ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f));
- updateClipPlanes();
-
- }
-
- public void initialize(RenderManager rm, ViewPort vp) {
- this.rm = rm;
- this.vp = vp;
-
- loadTextures(manager);
- createTextures();
- applyTextures(material);
-
- createPreViews();
-
- material.setVector2("FrustumNearFar", new Vector2f(vp.getCamera().getFrustumNear(), vp.getCamera().getFrustumFar()));
-
- if (debug) {
- dispRefraction = new Picture("dispRefraction");
- dispRefraction.setTexture(manager, refractionTexture, false);
- dispReflection = new Picture("dispRefraction");
- dispReflection.setTexture(manager, reflectionTexture, false);
- dispDepth = new Picture("depthTexture");
- dispDepth.setTexture(manager, depthTexture, false);
- }
- }
-
- public void reshape(ViewPort vp, int w, int h) {
- }
-
- public boolean isInitialized() {
- return rm != null;
- }
- float time = 0;
- float savedTpf = 0;
-
- public void preFrame(float tpf) {
- time = time + (tpf * speed);
- if (time > 1f) {
- time = 0;
- }
- material.setFloat("time", time);
- savedTpf = tpf;
- }
-
- public void postQueue(RenderQueue rq) {
- Camera sceneCam = rm.getCurrentCamera();
-
- //update ray
- ray.setOrigin(sceneCam.getLocation());
- ray.setDirection(sceneCam.getDirection());
-
- //update refraction cam
- refractionCam.setLocation(sceneCam.getLocation());
- refractionCam.setRotation(sceneCam.getRotation());
- refractionCam.setFrustum(sceneCam.getFrustumNear(),
- sceneCam.getFrustumFar(),
- sceneCam.getFrustumLeft(),
- sceneCam.getFrustumRight(),
- sceneCam.getFrustumTop(),
- sceneCam.getFrustumBottom());
-
- //update reflection cam
- boolean inv = false;
- if (!ray.intersectsWherePlane(plane, targetLocation)) {
- ray.setDirection(ray.getDirection().negateLocal());
- ray.intersectsWherePlane(plane, targetLocation);
- inv = true;
- }
- Vector3f loc = plane.reflect(sceneCam.getLocation(), new Vector3f());
- reflectionCam.setLocation(loc);
- reflectionCam.setFrustum(sceneCam.getFrustumNear(),
- sceneCam.getFrustumFar(),
- sceneCam.getFrustumLeft(),
- sceneCam.getFrustumRight(),
- sceneCam.getFrustumTop(),
- sceneCam.getFrustumBottom());
- // tempVec and calcVect are just temporary vector3f objects
- vect1.set(sceneCam.getLocation()).addLocal(sceneCam.getUp());
- float planeDistance = plane.pseudoDistance(vect1);
- vect2.set(plane.getNormal()).multLocal(planeDistance * 2.0f);
- vect3.set(vect1.subtractLocal(vect2)).subtractLocal(loc).normalizeLocal().negateLocal();
- // now set the up vector
- reflectionCam.lookAt(targetLocation, vect3);
- if (inv) {
- reflectionCam.setAxes(reflectionCam.getLeft().negateLocal(), reflectionCam.getUp(), reflectionCam.getDirection().negateLocal());
- }
-
- //Rendering reflection and refraction
- rm.renderViewPort(reflectionView, savedTpf);
- rm.renderViewPort(refractionView, savedTpf);
- rm.getRenderer().setFrameBuffer(vp.getOutputFrameBuffer());
- rm.setCamera(sceneCam, false);
-
- }
-
- public void postFrame(FrameBuffer out) {
- if (debug) {
- displayMap(rm.getRenderer(), dispRefraction, 64);
- displayMap(rm.getRenderer(), dispReflection, 256);
- displayMap(rm.getRenderer(), dispDepth, 448);
- }
- }
-
- public void cleanup() {
- }
-
- //debug only : displays maps
- protected void displayMap(Renderer r, Picture pic, int left) {
- Camera cam = vp.getCamera();
- rm.setCamera(cam, true);
- int h = cam.getHeight();
-
- pic.setPosition(left, h / 20f);
-
- pic.setWidth(128);
- pic.setHeight(128);
- pic.updateGeometricState();
- rm.renderGeometry(pic);
- rm.setCamera(cam, false);
- }
-
- protected void loadTextures(AssetManager manager) {
- normalTexture = (Texture2D) manager.loadTexture("Common/MatDefs/Water/Textures/water_normalmap.dds");
- dudvTexture = (Texture2D) manager.loadTexture("Common/MatDefs/Water/Textures/dudv_map.jpg");
- normalTexture.setWrap(WrapMode.Repeat);
- dudvTexture.setWrap(WrapMode.Repeat);
- }
-
- protected void createTextures() {
- reflectionTexture = new Texture2D(renderWidth, renderHeight, Format.RGBA8);
- refractionTexture = new Texture2D(renderWidth, renderHeight, Format.RGBA8);
- depthTexture = new Texture2D(renderWidth, renderHeight, Format.Depth);
- }
-
- protected void applyTextures(Material mat) {
- mat.setTexture("water_reflection", reflectionTexture);
- mat.setTexture("water_refraction", refractionTexture);
- mat.setTexture("water_depthmap", depthTexture);
- mat.setTexture("water_normalmap", normalTexture);
- mat.setTexture("water_dudvmap", dudvTexture);
- }
-
- protected void createPreViews() {
- reflectionCam = new Camera(renderWidth, renderHeight);
- refractionCam = new Camera(renderWidth, renderHeight);
-
- // create a pre-view. a view that is rendered before the main view
- reflectionView = new ViewPort("Reflection View", reflectionCam);
- reflectionView.setClearFlags(true, true, true);
- reflectionView.setBackgroundColor(ColorRGBA.Black);
- // create offscreen framebuffer
- reflectionBuffer = new FrameBuffer(renderWidth, renderHeight, 1);
- //setup framebuffer to use texture
- reflectionBuffer.setDepthBuffer(Format.Depth);
- reflectionBuffer.setColorTexture(reflectionTexture);
-
- //set viewport to render to offscreen framebuffer
- reflectionView.setOutputFrameBuffer(reflectionBuffer);
- reflectionView.addProcessor(new ReflectionProcessor(reflectionCam, reflectionBuffer, reflectionClipPlane));
- // attach the scene to the viewport to be rendered
- reflectionView.attachScene(reflectionScene);
-
- // create a pre-view. a view that is rendered before the main view
- refractionView = new ViewPort("Refraction View", refractionCam);
- refractionView.setClearFlags(true, true, true);
- refractionView.setBackgroundColor(ColorRGBA.Black);
- // create offscreen framebuffer
- refractionBuffer = new FrameBuffer(renderWidth, renderHeight, 1);
- //setup framebuffer to use texture
- refractionBuffer.setDepthBuffer(Format.Depth);
- refractionBuffer.setColorTexture(refractionTexture);
- refractionBuffer.setDepthTexture(depthTexture);
- //set viewport to render to offscreen framebuffer
- refractionView.setOutputFrameBuffer(refractionBuffer);
- refractionView.addProcessor(new RefractionProcessor());
- // attach the scene to the viewport to be rendered
- refractionView.attachScene(reflectionScene);
- }
-
- protected void destroyViews() {
- // rm.removePreView(reflectionView);
- rm.removePreView(refractionView);
- }
-
- /**
- * Get the water material from this processor, apply this to your water quad.
- * @return
- */
- public Material getMaterial() {
- return material;
- }
-
- /**
- * Sets the reflected scene, should not include the water quad!
- * Set before adding processor.
- * @param spat
- */
- public void setReflectionScene(Spatial spat) {
- reflectionScene = spat;
- }
-
- /**
- * returns the width of the reflection and refraction textures
- * @return
- */
- public int getRenderWidth() {
- return renderWidth;
- }
-
- /**
- * returns the height of the reflection and refraction textures
- * @return
- */
- public int getRenderHeight() {
- return renderHeight;
- }
-
- /**
- * Set the reflection Texture render size,
- * set before adding the processor!
- * @param with
- * @param height
- */
- public void setRenderSize(int width, int height) {
- renderWidth = width;
- renderHeight = height;
- }
-
- /**
- * returns the water plane
- * @return
- */
- public Plane getPlane() {
- return plane;
- }
-
- /**
- * Set the water plane for this processor.
- * @param plane
- */
- public void setPlane(Plane plane) {
- this.plane.setConstant(plane.getConstant());
- this.plane.setNormal(plane.getNormal());
- updateClipPlanes();
- }
-
- /**
- * Set the water plane using an origin (location) and a normal (reflection direction).
- * @param origin Set to 0,-6,0 if your water quad is at that location for correct reflection
- * @param normal Set to 0,1,0 (Vector3f.UNIT_Y) for normal planar water
- */
- public void setPlane(Vector3f origin, Vector3f normal) {
- this.plane.setOriginNormal(origin, normal);
- updateClipPlanes();
- }
-
- private void updateClipPlanes() {
- reflectionClipPlane = plane.clone();
- reflectionClipPlane.setConstant(reflectionClipPlane.getConstant() + reflectionClippingOffset);
- refractionClipPlane = plane.clone();
- refractionClipPlane.setConstant(refractionClipPlane.getConstant() + refractionClippingOffset);
-
- }
-
- /**
- * Set the light Position for the processor
- * @param position
- */
- //TODO maybe we should provide a convenient method to compute position from direction
- public void setLightPosition(Vector3f position) {
- material.setVector3("lightPos", position);
- }
-
- /**
- * Set the color that will be added to the refraction texture.
- * @param color
- */
- public void setWaterColor(ColorRGBA color) {
- material.setColor("waterColor", color);
- }
-
- /**
- * Higher values make the refraction texture shine through earlier.
- * Default is 4
- * @param depth
- */
- public void setWaterDepth(float depth) {
- waterDepth = depth;
- material.setFloat("waterDepth", depth);
- }
-
- /**
- * return the water depth
- * @return
- */
- public float getWaterDepth() {
- return waterDepth;
- }
-
- /**
- * returns water transparency
- * @return
- */
- public float getWaterTransparency() {
- return waterTransparency;
- }
-
- /**
- * sets the water transparency default os 0.1f
- * @param waterTransparency
- */
- public void setWaterTransparency(float waterTransparency) {
- this.waterTransparency = Math.max(0, waterTransparency);
- material.setFloat("waterTransparency", waterTransparency / 10);
- }
-
- /**
- * Sets the speed of the wave animation, default = 0.05f.
- * @param speed
- */
- public void setWaveSpeed(float speed) {
- this.speed = speed;
- }
-
- /**
- * Sets the scale of distortion by the normal map, default = 0.2
- */
- public void setDistortionScale(float value) {
- material.setColor("distortionScale", new ColorRGBA(value, value, value, value));
- }
-
- /**
- * Sets how the normal and dudv map are mixed to create the wave effect, default = 0.5
- */
- public void setDistortionMix(float value) {
- material.setColor("distortionMix", new ColorRGBA(value, value, value, value));
- }
-
- /**
- * Sets the scale of the normal/dudv texture, default = 1.
- * Note that the waves should be scaled by the texture coordinates of the quad to avoid animation artifacts,
- * use mesh.scaleTextureCoordinates(Vector2f) for that.
- */
- public void setTexScale(float value) {
- material.setColor("texScale", new ColorRGBA(value, value, value, value));
- }
-
- /**
- * retruns true if the waterprocessor is in debug mode
- * @return
- */
- public boolean isDebug() {
- return debug;
- }
-
- /**
- * set to true to display reflection and refraction textures in the GUI for debug purpose
- * @param debug
- */
- public void setDebug(boolean debug) {
- this.debug = debug;
- }
-
- /**
- * Creates a quad with the water material applied to it.
- * @param width
- * @param height
- * @return
- */
- public Geometry createWaterGeometry(float width, float height) {
- Quad quad = new Quad(width, height);
- Geometry geom = new Geometry("WaterGeometry", quad);
- geom.setLocalRotation(new Quaternion().fromAngleAxis(-FastMath.HALF_PI, Vector3f.UNIT_X));
- geom.setMaterial(material);
- return geom;
- }
-
- /**
- * returns the reflection clipping plane offset
- * @return
- */
- public float getReflectionClippingOffset() {
- return reflectionClippingOffset;
- }
-
- /**
- * sets the reflection clipping plane offset
- * set a nagetive value to lower the clipping plane for relection texture rendering.
- * @param reflectionClippingOffset
- */
- public void setReflectionClippingOffset(float reflectionClippingOffset) {
- this.reflectionClippingOffset = reflectionClippingOffset;
- updateClipPlanes();
- }
-
- /**
- * returns the refraction clipping plane offset
- * @return
- */
- public float getRefractionClippingOffset() {
- return refractionClippingOffset;
- }
-
- /**
- * Sets the refraction clipping plane offset
- * set a positive value to raise the clipping plane for refraction texture rendering
- * @param refractionClippingOffset
- */
- public void setRefractionClippingOffset(float refractionClippingOffset) {
- this.refractionClippingOffset = refractionClippingOffset;
- updateClipPlanes();
- }
-
- /**
- * Refraction Processor
- */
- public class RefractionProcessor implements SceneProcessor {
-
- RenderManager rm;
- ViewPort vp;
-
- 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) {
- refractionCam.setClipPlane(refractionClipPlane, Plane.Side.Negative);//,-1
-
- }
-
- public void postQueue(RenderQueue rq) {
- }
-
- public void postFrame(FrameBuffer out) {
- }
-
- public void cleanup() {
- }
- }
-}
diff --git a/engine/src/desktop-fx/com/jme3/water/WaterFilter.java b/engine/src/desktop-fx/com/jme3/water/WaterFilter.java
deleted file mode 100644
index d54a192f2..000000000
--- a/engine/src/desktop-fx/com/jme3/water/WaterFilter.java
+++ /dev/null
@@ -1,1050 +0,0 @@
-/*
- * Copyright (c) 2009-2010 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.water;
-
-import com.jme3.asset.AssetManager;
-import com.jme3.export.InputCapsule;
-import com.jme3.export.JmeExporter;
-import com.jme3.export.JmeImporter;
-import com.jme3.export.OutputCapsule;
-import com.jme3.light.DirectionalLight;
-import com.jme3.light.Light;
-import com.jme3.material.Material;
-import com.jme3.math.*;
-import com.jme3.post.Filter;
-import com.jme3.post.Filter.Pass;
-import com.jme3.renderer.Camera;
-import com.jme3.renderer.RenderManager;
-import com.jme3.renderer.ViewPort;
-import com.jme3.scene.Node;
-import com.jme3.scene.Spatial;
-import com.jme3.texture.Image.Format;
-import com.jme3.texture.Texture.WrapMode;
-import com.jme3.texture.Texture2D;
-import com.jme3.util.TempVars;
-import java.io.IOException;
-
-/**
- * The WaterFilter is a 2D post process that simulate water.
- * It renders water above and under water.
- * See this blog post for more info http://jmonkeyengine.org/2011/01/15/new-advanced-water-effect-for-jmonkeyengine-3/
- *
- *
- * @author Rémy Bouquet aka Nehon
- */
-public class WaterFilter extends Filter {
-
- private Pass reflectionPass;
- protected Spatial reflectionScene;
- protected ViewPort reflectionView;
- private Texture2D normalTexture;
- private Texture2D foamTexture;
- private Texture2D causticsTexture;
- private Texture2D heightTexture;
- private Plane plane;
- private Camera reflectionCam;
- protected Ray ray = new Ray();
- private Vector3f targetLocation = new Vector3f();
- private ReflectionProcessor reflectionProcessor;
- private Matrix4f biasMatrix = new Matrix4f(0.5f, 0.0f, 0.0f, 0.5f,
- 0.0f, 0.5f, 0.0f, 0.5f,
- 0.0f, 0.0f, 0.0f, 0.5f,
- 0.0f, 0.0f, 0.0f, 1.0f);
- private Matrix4f textureProjMatrix = new Matrix4f();
- private boolean underWater;
- private RenderManager renderManager;
- private ViewPort viewPort;
- private float time = 0;
- //properties
- private float speed = 1;
- private Vector3f lightDirection = new Vector3f(0, -1, 0);
- private ColorRGBA lightColor = ColorRGBA.White;
- private float waterHeight = 0.0f;
- private ColorRGBA waterColor = new ColorRGBA(0.0078f, 0.3176f, 0.5f, 1.0f);
- private ColorRGBA deepWaterColor = new ColorRGBA(0.0039f, 0.00196f, 0.145f, 1.0f);
- private Vector3f colorExtinction = new Vector3f(5.0f, 20.0f, 30.0f);
- private float waterTransparency = 0.1f;
- private float maxAmplitude = 1.5f;
- private float shoreHardness = 0.1f;
- private boolean useFoam = true;
- private float foamIntensity = 0.5f;
- private float foamHardness = 1.0f;
- private Vector3f foamExistence = new Vector3f(0.45f, 4.35f, 1.5f);
- private float waveScale = 0.005f;
- private float sunScale = 3.0f;
- private float shininess = 0.7f;
- private Vector2f windDirection = new Vector2f(0.0f, -1.0f);
- private int reflectionMapSize = 512;
- private boolean useRipples = true;
- private float normalScale = 3.0f;
- private boolean useHQShoreline = true;
- private boolean useSpecular = true;
- private boolean useRefraction = true;
- private float refractionStrength = 0.0f;
- private float refractionConstant = 0.5f;
- private float reflectionDisplace = 30;
- private float underWaterFogDistance = 120;
- private boolean useCaustics = true;
- private float causticsIntensity = 0.5f;
-
- /**
- * Create a Water Filter
- */
- public WaterFilter() {
- super("WaterFilter");
- }
-
- public WaterFilter(Node reflectionScene, Vector3f lightDirection) {
- super("WaterFilter");
- this.reflectionScene = reflectionScene;
- this.lightDirection = lightDirection;
- }
-
- @Override
- protected boolean isRequiresDepthTexture() {
- return true;
- }
-
- @Override
- protected void preFrame(float tpf) {
- time = time + (tpf * speed);
- material.setFloat("Time", time);
- Camera sceneCam = viewPort.getCamera();
- biasMatrix.mult(sceneCam.getViewProjectionMatrix(), textureProjMatrix);
- material.setMatrix4("TextureProjMatrix", textureProjMatrix);
- material.setVector3("CameraPosition", sceneCam.getLocation());
- material.setMatrix4("ViewProjectionMatrixInverse", sceneCam.getViewProjectionMatrix().invert());
-
- material.setFloat("WaterHeight", waterHeight);
-
- //update reflection cam
- ray.setOrigin(sceneCam.getLocation());
- ray.setDirection(sceneCam.getDirection());
- plane = new Plane(Vector3f.UNIT_Y, new Vector3f(0, waterHeight, 0).dot(Vector3f.UNIT_Y));
- reflectionProcessor.setReflectionClipPlane(plane);
- boolean inv = false;
- if (!ray.intersectsWherePlane(plane, targetLocation)) {
- ray.setDirection(ray.getDirection().negateLocal());
- ray.intersectsWherePlane(plane, targetLocation);
- inv = true;
- }
- Vector3f loc = plane.reflect(sceneCam.getLocation(), new Vector3f());
- reflectionCam.setLocation(loc);
- reflectionCam.setFrustum(sceneCam.getFrustumNear(),
- sceneCam.getFrustumFar(),
- sceneCam.getFrustumLeft(),
- sceneCam.getFrustumRight(),
- sceneCam.getFrustumTop(),
- sceneCam.getFrustumBottom());
- TempVars vars = TempVars.get();
-
-
- vars.vect1.set(sceneCam.getLocation()).addLocal(sceneCam.getUp());
- float planeDistance = plane.pseudoDistance(vars.vect1);
- vars.vect2.set(plane.getNormal()).multLocal(planeDistance * 2.0f);
- vars.vect3.set(vars.vect1.subtractLocal(vars.vect2)).subtractLocal(loc).normalizeLocal().negateLocal();
-
- reflectionCam.lookAt(targetLocation, vars.vect3);
- vars.release();
-
- if (inv) {
- reflectionCam.setAxes(reflectionCam.getLeft().negateLocal(), reflectionCam.getUp(), reflectionCam.getDirection().negateLocal());
- }
-
- //if we're under water no need to compute reflection
- if (sceneCam.getLocation().y >= waterHeight) {
- boolean rtb = true;
- if (!renderManager.isHandleTranslucentBucket()) {
- renderManager.setHandleTranslucentBucket(true);
- rtb = false;
- }
- renderManager.renderViewPort(reflectionView, tpf);
- if (!rtb) {
- renderManager.setHandleTranslucentBucket(false);
- }
- renderManager.setCamera(sceneCam, false);
- renderManager.getRenderer().setFrameBuffer(viewPort.getOutputFrameBuffer());
-
-
- underWater = false;
- } else {
- underWater = true;
- }
- }
-
- @Override
- protected Material getMaterial() {
- return material;
- }
-
- private DirectionalLight findLight(Node node) {
- for (Light light : node.getWorldLightList()) {
- if (light instanceof DirectionalLight) {
- return (DirectionalLight) light;
- }
- }
- for (Spatial child : node.getChildren()) {
- if (child instanceof Node) {
- return findLight((Node) child);
- }
- }
-
- return null;
- }
-
- @Override
- protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) {
-
- if (reflectionScene == null) {
- reflectionScene = vp.getScenes().get(0);
- DirectionalLight l = findLight((Node) reflectionScene);
- if (l != null) {
- lightDirection = l.getDirection();
- }
-
- }
-
- this.renderManager = renderManager;
- this.viewPort = vp;
- reflectionPass = new Pass();
- reflectionPass.init(renderManager.getRenderer(), reflectionMapSize, reflectionMapSize, Format.RGBA8, Format.Depth);
- reflectionCam = new Camera(reflectionMapSize, reflectionMapSize);
- reflectionView = new ViewPort("reflectionView", reflectionCam);
- reflectionView.setClearFlags(true, true, true);
- reflectionView.attachScene(reflectionScene);
- reflectionView.setOutputFrameBuffer(reflectionPass.getRenderFrameBuffer());
- plane = new Plane(Vector3f.UNIT_Y, new Vector3f(0, waterHeight, 0).dot(Vector3f.UNIT_Y));
- reflectionProcessor = new ReflectionProcessor(reflectionCam, reflectionPass.getRenderFrameBuffer(), plane);
- reflectionView.addProcessor(reflectionProcessor);
-
- normalTexture = (Texture2D) manager.loadTexture("Common/MatDefs/Water/Textures/water_normalmap.dds");
- if (foamTexture == null) {
- foamTexture = (Texture2D) manager.loadTexture("Common/MatDefs/Water/Textures/foam.jpg");
- }
- if (causticsTexture == null) {
- causticsTexture = (Texture2D) manager.loadTexture("Common/MatDefs/Water/Textures/caustics.jpg");
- }
- heightTexture = (Texture2D) manager.loadTexture("Common/MatDefs/Water/Textures/heightmap.jpg");
-
- normalTexture.setWrap(WrapMode.Repeat);
- foamTexture.setWrap(WrapMode.Repeat);
- causticsTexture.setWrap(WrapMode.Repeat);
- heightTexture.setWrap(WrapMode.Repeat);
-
- material = new Material(manager, "Common/MatDefs/Water/Water.j3md");
- material.setTexture("HeightMap", heightTexture);
- material.setTexture("CausticsMap", causticsTexture);
- material.setTexture("FoamMap", foamTexture);
- material.setTexture("NormalMap", normalTexture);
- material.setTexture("ReflectionMap", reflectionPass.getRenderedTexture());
-
- material.setFloat("WaterTransparency", waterTransparency);
- material.setFloat("NormalScale", normalScale);
- material.setFloat("R0", refractionConstant);
- material.setFloat("MaxAmplitude", maxAmplitude);
- material.setVector3("LightDir", lightDirection);
- material.setColor("LightColor", lightColor);
- material.setFloat("ShoreHardness", shoreHardness);
- material.setFloat("RefractionStrength", refractionStrength);
- material.setFloat("WaveScale", waveScale);
- material.setVector3("FoamExistence", foamExistence);
- material.setFloat("SunScale", sunScale);
- material.setVector3("ColorExtinction", colorExtinction);
- material.setFloat("Shininess", shininess);
- material.setColor("WaterColor", waterColor);
- material.setColor("DeepWaterColor", deepWaterColor);
- material.setVector2("WindDirection", windDirection);
- material.setFloat("FoamHardness", foamHardness);
- material.setBoolean("UseRipples", useRipples);
- material.setBoolean("UseHQShoreline", useHQShoreline);
- material.setBoolean("UseSpecular", useSpecular);
- material.setBoolean("UseFoam", useFoam);
- material.setBoolean("UseCaustics", useCaustics);
- material.setBoolean("UseRefraction", useRefraction);
- material.setFloat("ReflectionDisplace", reflectionDisplace);
- material.setFloat("FoamIntensity", foamIntensity);
- material.setFloat("UnderWaterFogDistance", underWaterFogDistance);
- material.setFloat("CausticsIntensity", causticsIntensity);
-
-
- }
-
- @Override
- public void write(JmeExporter ex) throws IOException {
- super.write(ex);
- OutputCapsule oc = ex.getCapsule(this);
-
- oc.write(speed, "speed", 1f);
- oc.write(lightDirection, "lightDirection", new Vector3f(0, -1, 0));
- oc.write(lightColor, "lightColor", ColorRGBA.White);
- oc.write(waterHeight, "waterHeight", 0.0f);
- oc.write(waterColor, "waterColor", new ColorRGBA(0.0078f, 0.3176f, 0.5f, 1.0f));
- oc.write(deepWaterColor, "deepWaterColor", new ColorRGBA(0.0039f, 0.00196f, 0.145f, 1.0f));
-
- oc.write(colorExtinction, "colorExtinction", new Vector3f(5.0f, 20.0f, 30.0f));
- oc.write(waterTransparency, "waterTransparency", 0.1f);
- oc.write(maxAmplitude, "maxAmplitude", 1.5f);
- oc.write(shoreHardness, "shoreHardness", 0.1f);
- oc.write(useFoam, "useFoam", true);
-
- oc.write(foamIntensity, "foamIntensity", 0.5f);
- oc.write(foamHardness, "foamHardness", 1.0f);
-
- oc.write(foamExistence, "foamExistence", new Vector3f(0.45f, 4.35f, 1.5f));
- oc.write(waveScale, "waveScale", 0.005f);
-
- oc.write(sunScale, "sunScale", 3.0f);
- oc.write(shininess, "shininess", 0.7f);
- oc.write(windDirection, "windDirection", new Vector2f(0.0f, -1.0f));
- oc.write(reflectionMapSize, "reflectionMapSize", 512);
- oc.write(useRipples, "useRipples", true);
-
- oc.write(normalScale, "normalScale", 3.0f);
- oc.write(useHQShoreline, "useHQShoreline", true);
-
- oc.write(useSpecular, "useSpecular", true);
-
- oc.write(useRefraction, "useRefraction", true);
- oc.write(refractionStrength, "refractionStrength", 0.0f);
- oc.write(refractionConstant, "refractionConstant", 0.5f);
- oc.write(reflectionDisplace, "reflectionDisplace", 30f);
- oc.write(underWaterFogDistance, "underWaterFogDistance", 120f);
- oc.write(causticsIntensity, "causticsIntensity", 0.5f);
-
- oc.write(useCaustics, "useCaustics", true);
- }
-
- @Override
- public void read(JmeImporter im) throws IOException {
- super.read(im);
- InputCapsule ic = im.getCapsule(this);
- speed = ic.readFloat("speed", 1f);
- lightDirection = (Vector3f) ic.readSavable("lightDirection", new Vector3f(0, -1, 0));
- lightColor = (ColorRGBA) ic.readSavable("lightColor", ColorRGBA.White);
- waterHeight = ic.readFloat("waterHeight", 0.0f);
- waterColor = (ColorRGBA) ic.readSavable("waterColor", new ColorRGBA(0.0078f, 0.3176f, 0.5f, 1.0f));
- deepWaterColor = (ColorRGBA) ic.readSavable("deepWaterColor", new ColorRGBA(0.0039f, 0.00196f, 0.145f, 1.0f));
-
- colorExtinction = (Vector3f) ic.readSavable("colorExtinction", new Vector3f(5.0f, 20.0f, 30.0f));
- waterTransparency = ic.readFloat("waterTransparency", 0.1f);
- maxAmplitude = ic.readFloat("maxAmplitude", 1.5f);
- shoreHardness = ic.readFloat("shoreHardness", 0.1f);
- useFoam = ic.readBoolean("useFoam", true);
-
- foamIntensity = ic.readFloat("foamIntensity", 0.5f);
- foamHardness = ic.readFloat("foamHardness", 1.0f);
-
- foamExistence = (Vector3f) ic.readSavable("foamExistence", new Vector3f(0.45f, 4.35f, 1.5f));
- waveScale = ic.readFloat("waveScale", 0.005f);
-
- sunScale = ic.readFloat("sunScale", 3.0f);
- shininess = ic.readFloat("shininess", 0.7f);
- windDirection = (Vector2f) ic.readSavable("windDirection", new Vector2f(0.0f, -1.0f));
- reflectionMapSize = ic.readInt("reflectionMapSize", 512);
- useRipples = ic.readBoolean("useRipples", true);
-
- normalScale = ic.readFloat("normalScale", 3.0f);
- useHQShoreline = ic.readBoolean("useHQShoreline", true);
-
- useSpecular = ic.readBoolean("useSpecular", true);
-
- useRefraction = ic.readBoolean("useRefraction", true);
- refractionStrength = ic.readFloat("refractionStrength", 0.0f);
- refractionConstant = ic.readFloat("refractionConstant", 0.5f);
- reflectionDisplace = ic.readFloat("reflectionDisplace", 30f);
- underWaterFogDistance = ic.readFloat("underWaterFogDistance", 120f);
- causticsIntensity = ic.readFloat("causticsIntensity", 0.5f);
-
- useCaustics = ic.readBoolean("useCaustics", true);
-
- }
-
- /**
- * gets the height of the water plane
- * @return
- */
- public float getWaterHeight() {
- return waterHeight;
- }
-
- /**
- * Sets the height of the water plane
- * default is 0.0
- * @param waterHeight
- */
- public void setWaterHeight(float waterHeight) {
- this.waterHeight = waterHeight;
- }
-
- /**
- * sets the scene to render in the reflection map
- * @param reflectionScene
- */
- public void setReflectionScene(Spatial reflectionScene) {
- this.reflectionScene = reflectionScene;
- }
-
- /**
- * returns the waterTransparency value
- * @return
- */
- public float getWaterTransparency() {
- return waterTransparency;
- }
-
- /**
- * Sets how fast will colours fade out. You can also think about this
- * values as how clear water is. Therefore use smaller values (eg. 0.05)
- * to have crystal clear water and bigger to achieve "muddy" water.
- * default is 0.1f
- * @param waterTransparency
- */
- public void setWaterTransparency(float waterTransparency) {
- this.waterTransparency = waterTransparency;
- if (material != null) {
- material.setFloat("WaterTransparency", waterTransparency);
- }
- }
-
- /**
- * Returns the normal scales applied to the normal map
- * @return
- */
- public float getNormalScale() {
- return normalScale;
- }
-
- /**
- * Sets the normal scaling factors to apply to the normal map.
- * the higher the value the more small ripples will be visible on the waves.
- * default is 1.0
- * @param normalScale
- */
- public void setNormalScale(float normalScale) {
- this.normalScale = normalScale;
- if (material != null) {
- material.setFloat("NormalScale", normalScale);
- }
- }
-
- /**
- * returns the refractoin constant
- * @return
- */
- public float getRefractionConstant() {
- return refractionConstant;
- }
-
- /**
- * This is a constant related to the index of refraction (IOR) used to compute the fresnel term.
- * F = R0 + (1-R0)( 1 - N.V)^5
- * where F is the fresnel term, R0 the constant, N the normal vector and V tne view vector.
- * It usually depend on the material you are lookinh through (here water).
- * Default value is 0.3f
- * In practice, the lowest the value and the less the reflection can be seen on water
- * @param refractionConstant
- */
- public void setRefractionConstant(float refractionConstant) {
- this.refractionConstant = refractionConstant;
- if (material != null) {
- material.setFloat("R0", refractionConstant);
- }
- }
-
- /**
- * return the maximum wave amplitude
- * @return
- */
- public float getMaxAmplitude() {
- return maxAmplitude;
- }
-
- /**
- * Sets the maximum waves amplitude
- * default is 1.0
- * @param maxAmplitude
- */
- public void setMaxAmplitude(float maxAmplitude) {
- this.maxAmplitude = maxAmplitude;
- if (material != null) {
- material.setFloat("MaxAmplitude", maxAmplitude);
- }
- }
-
- /**
- * gets the light direction
- * @return
- */
- public Vector3f getLightDirection() {
- return lightDirection;
- }
-
- /**
- * Sets the light direction
- * @param lightDirection
- */
- public void setLightDirection(Vector3f lightDirection) {
- this.lightDirection = lightDirection;
- if (material != null) {
- material.setVector3("LightDir", lightDirection);
- }
- }
-
- /**
- * returns the light color
- * @return
- */
- public ColorRGBA getLightColor() {
- return lightColor;
- }
-
- /**
- * Sets the light color to use
- * default is white
- * @param lightColor
- */
- public void setLightColor(ColorRGBA lightColor) {
- this.lightColor = lightColor;
- if (material != null) {
- material.setColor("LightColor", lightColor);
- }
- }
-
- /**
- * Return the shoreHardeness
- * @return
- */
- public float getShoreHardness() {
- return shoreHardness;
- }
-
- /**
- * The smaller this value is, the softer the transition between
- * shore and water. If you want hard edges use very big value.
- * Default is 0.1f.
- * @param shoreHardness
- */
- public void setShoreHardness(float shoreHardness) {
- this.shoreHardness = shoreHardness;
- if (material != null) {
- material.setFloat("ShoreHardness", shoreHardness);
- }
- }
-
- /**
- * returns the foam hardness
- * @return
- */
- public float getFoamHardness() {
- return foamHardness;
- }
-
- /**
- * Sets the foam hardness : How much the foam will blend with the shore to avoid hard edged water plane.
- * Default is 1.0
- * @param foamHardness
- */
- public void setFoamHardness(float foamHardness) {
- this.foamHardness = foamHardness;
- if (material != null) {
- material.setFloat("FoamHardness", foamHardness);
- }
- }
-
- /**
- * returns the refractionStrenght
- * @return
- */
- public float getRefractionStrength() {
- return refractionStrength;
- }
-
- /**
- * This value modifies current fresnel term. If you want to weaken
- * reflections use bigger value. If you want to empasize them use
- * value smaller then 0. Default is 0.0f.
- * @param refractionStrength
- */
- public void setRefractionStrength(float refractionStrength) {
- this.refractionStrength = refractionStrength;
- if (material != null) {
- material.setFloat("RefractionStrength", refractionStrength);
- }
- }
-
- /**
- * returns the scale factor of the waves height map
- * @return
- */
- public float getWaveScale() {
- return waveScale;
- }
-
- /**
- * Sets the scale factor of the waves height map
- * the smaller the value the bigger the waves
- * default is 0.005f
- * @param waveScale
- */
- public void setWaveScale(float waveScale) {
- this.waveScale = waveScale;
- if (material != null) {
- material.setFloat("WaveScale", waveScale);
- }
- }
-
- /**
- * returns the foam existance vector
- * @return
- */
- public Vector3f getFoamExistence() {
- return foamExistence;
- }
-
- /**
- * Describes at what depth foam starts to fade out and
- * at what it is completely invisible. The third value is at
- * what height foam for waves appear (+ waterHeight).
- * default is (0.45, 4.35, 1.0);
- * @param foamExistence
- */
- public void setFoamExistence(Vector3f foamExistence) {
- this.foamExistence = foamExistence;
- if (material != null) {
- material.setVector3("FoamExistence", foamExistence);
- }
- }
-
- /**
- * gets the scale of the sun
- * @return
- */
- public float getSunScale() {
- return sunScale;
- }
-
- /**
- * Sets the scale of the sun for specular effect
- * @param sunScale
- */
- public void setSunScale(float sunScale) {
- this.sunScale = sunScale;
- if (material != null) {
- material.setFloat("SunScale", sunScale);
- }
- }
-
- /**
- * Returns the color exctinction vector of the water
- * @return
- */
- public Vector3f getColorExtinction() {
- return colorExtinction;
- }
-
- /**
- * Return at what depth the refraction color extinct
- * the first value is for red
- * the second is for green
- * the third is for blue
- * Play with thos parameters to "trouble" the water
- * default is (5.0, 20.0, 30.0f);
- * @param colorExtinction
- */
- public void setColorExtinction(Vector3f colorExtinction) {
- this.colorExtinction = colorExtinction;
- if (material != null) {
- material.setVector3("ColorExtinction", colorExtinction);
- }
- }
-
- /**
- * Sets the foam texture
- * @param foamTexture
- */
- public void setFoamTexture(Texture2D foamTexture) {
- this.foamTexture = foamTexture;
- foamTexture.setWrap(WrapMode.Repeat);
- if (material != null) {
- material.setTexture("FoamMap", foamTexture);
- }
- }
-
- /**
- * Sets the height texture
- * @param heightTexture
- */
- public void setHeightTexture(Texture2D heightTexture) {
- this.heightTexture = heightTexture;
- heightTexture.setWrap(WrapMode.Repeat);
- }
-
- /**
- * Sets the normal Texture
- * @param normalTexture
- */
- public void setNormalTexture(Texture2D normalTexture) {
- this.normalTexture = normalTexture;
- normalTexture.setWrap(WrapMode.Repeat);
- }
-
- /**
- * return the shininess factor of the water
- * @return
- */
- public float getShininess() {
- return shininess;
- }
-
- /**
- * Sets the shinines factor of the water
- * default is 0.7f
- * @param shininess
- */
- public void setShininess(float shininess) {
- this.shininess = shininess;
- if (material != null) {
- material.setFloat("Shininess", shininess);
- }
- }
-
- /**
- * retruns the speed of the waves
- * @return
- */
- public float getSpeed() {
- return speed;
- }
-
- /**
- * Set the speed of the waves (0.0 is still) default is 1.0
- * @param speed
- */
- public void setSpeed(float speed) {
- this.speed = speed;
- }
-
- /**
- * returns the color of the water
- *
- * @return
- */
- public ColorRGBA getWaterColor() {
- return waterColor;
- }
-
- /**
- * Sets the color of the water
- * see setDeepWaterColor for deep water color
- * default is (0.0078f, 0.5176f, 0.5f,1.0f) (greenish blue)
- * @param waterColour
- */
- public void setWaterColor(ColorRGBA waterColor) {
- this.waterColor = waterColor;
- if (material != null) {
- material.setColor("WaterColor", waterColor);
- }
- }
-
- /**
- * returns the deep water color
- * @return
- */
- public ColorRGBA getDeepWaterColor() {
- return deepWaterColor;
- }
-
- /**
- * sets the deep water color
- * see setWaterColor for general color
- * default is (0.0039f, 0.00196f, 0.145f,1.0f) (very dark blue)
- * @param deepWaterColor
- */
- public void setDeepWaterColor(ColorRGBA deepWaterColor) {
- this.deepWaterColor = deepWaterColor;
- if (material != null) {
- material.setColor("DeepWaterColor", deepWaterColor);
- }
- }
-
- /**
- * returns the wind direction
- * @return
- */
- public Vector2f getWindDirection() {
- return windDirection;
- }
-
- /**
- * sets the wind direction
- * the direction where the waves move
- * default is (0.0f, -1.0f)
- * @param windDirection
- */
- public void setWindDirection(Vector2f windDirection) {
- this.windDirection = windDirection;
- if (material != null) {
- material.setVector2("WindDirection", windDirection);
- }
- }
-
- /**
- * returns the size of the reflection map
- * @return
- */
- public int getReflectionMapSize() {
- return reflectionMapSize;
- }
-
- /**
- * Sets the size of the reflection map
- * default is 512, the higher, the better quality, but the slower the effect.
- * @param reflectionMapSize
- */
- public void setReflectionMapSize(int reflectionMapSize) {
- this.reflectionMapSize = reflectionMapSize;
- }
-
- /**
- * returns true if the water uses foam
- * @return
- */
- public boolean isUseFoam() {
- return useFoam;
- }
-
- /**
- * set to true to use foam with water
- * default true
- * @param useFoam
- */
- public void setUseFoam(boolean useFoam) {
- this.useFoam = useFoam;
- if (material != null) {
- material.setBoolean("UseFoam", useFoam);
- }
-
- }
-
- /**
- * sets the texture to use to render caustics on the ground underwater
- * @param causticsTexture
- */
- public void setCausticsTexture(Texture2D causticsTexture) {
- this.causticsTexture = causticsTexture;
- if (material != null) {
- material.setTexture("causticsMap", causticsTexture);
- }
- }
-
- /**
- * returns true if caustics are rendered
- * @return
- */
- public boolean isUseCaustics() {
- return useCaustics;
- }
-
- /**
- * set to true if you want caustics to be rendered on the ground underwater, false otherwise
- * @param useCaustics
- */
- public void setUseCaustics(boolean useCaustics) {
- this.useCaustics = useCaustics;
- if (material != null) {
- material.setBoolean("UseCaustics", useCaustics);
- }
- }
-
- /**
- * return true
- * @return
- */
- public boolean isUseHQShoreline() {
- return useHQShoreline;
- }
-
- public void setUseHQShoreline(boolean useHQShoreline) {
- this.useHQShoreline = useHQShoreline;
- if (material != null) {
- material.setBoolean("UseHQShoreline", useHQShoreline);
- }
-
- }
-
- /**
- * returns true if the water use the refraction
- * @return
- */
- public boolean isUseRefraction() {
- return useRefraction;
- }
-
- /**
- * set to true to use refraction (default is true)
- * @param useRefraction
- */
- public void setUseRefraction(boolean useRefraction) {
- this.useRefraction = useRefraction;
- if (material != null) {
- material.setBoolean("UseRefraction", useRefraction);
- }
-
- }
-
- /**
- * returns true if the ater use ripples
- * @return
- */
- public boolean isUseRipples() {
- return useRipples;
- }
-
- /**
- *
- * Set to true tu use ripples
- * @param useRipples
- */
- public void setUseRipples(boolean useRipples) {
- this.useRipples = useRipples;
- if (material != null) {
- material.setBoolean("UseRipples", useRipples);
- }
-
- }
-
- /**
- * returns true if the water use specular
- * @return
- */
- public boolean isUseSpecular() {
- return useSpecular;
- }
-
- /**
- * Set to true to use specular lightings on the water
- * @param useSpecular
- */
- public void setUseSpecular(boolean useSpecular) {
- this.useSpecular = useSpecular;
- if (material != null) {
- material.setBoolean("UseSpecular", useSpecular);
- }
- }
-
- /**
- * returns the foam intensity
- * @return
- */
- public float getFoamIntensity() {
- return foamIntensity;
- }
-
- /**
- * sets the foam intensity default is 0.5f
- * @param foamIntensity
- */
- public void setFoamIntensity(float foamIntensity) {
- this.foamIntensity = foamIntensity;
- if (material != null) {
- material.setFloat("FoamIntensity", foamIntensity);
-
- }
- }
-
- /**
- * returns the reflection displace
- * see {@link setReflectionDisplace(float reflectionDisplace)}
- * @return
- */
- public float getReflectionDisplace() {
- return reflectionDisplace;
- }
-
- /**
- * Sets the reflection displace. define how troubled will look the reflection in the water. default is 30
- * @param reflectionDisplace
- */
- public void setReflectionDisplace(float reflectionDisplace) {
- this.reflectionDisplace = reflectionDisplace;
- if (material != null) {
- material.setFloat("m_ReflectionDisplace", reflectionDisplace);
- }
- }
-
- /**
- * returns true if the camera is under the water level
- * @return
- */
- public boolean isUnderWater() {
- return underWater;
- }
-
- /**
- * returns the distance of the fog when under water
- * @return
- */
- public float getUnderWaterFogDistance() {
- return underWaterFogDistance;
- }
-
- /**
- * sets the distance of the fog when under water.
- * default is 120 (120 world units) use a high value to raise the view range under water
- * @param underWaterFogDistance
- */
- public void setUnderWaterFogDistance(float underWaterFogDistance) {
- this.underWaterFogDistance = underWaterFogDistance;
- if (material != null) {
- material.setFloat("UnderWaterFogDistance", underWaterFogDistance);
- }
- }
-
- /**
- * get the intensity of caustics under water
- * @return
- */
- public float getCausticsIntensity() {
- return causticsIntensity;
- }
-
- /**
- * sets the intensity of caustics under water. goes from 0 to 1, default is 0.5f
- * @param causticsIntensity
- */
- public void setCausticsIntensity(float causticsIntensity) {
- this.causticsIntensity = causticsIntensity;
- if (material != null) {
- material.setFloat("CausticsIntensity", causticsIntensity);
- }
- }
-}