summaryrefslogtreecommitdiffstats
path: root/src/demos/proceduralTexturePhysics/Water.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/demos/proceduralTexturePhysics/Water.java')
-rw-r--r--src/demos/proceduralTexturePhysics/Water.java237
1 files changed, 121 insertions, 116 deletions
diff --git a/src/demos/proceduralTexturePhysics/Water.java b/src/demos/proceduralTexturePhysics/Water.java
index 94ed0ce..dfb72de 100644
--- a/src/demos/proceduralTexturePhysics/Water.java
+++ b/src/demos/proceduralTexturePhysics/Water.java
@@ -33,29 +33,32 @@
package demos.proceduralTexturePhysics;
-import com.jogamp.common.util.IOUtil;
-import com.jogamp.opengl.util.texture.Texture;
-import com.jogamp.opengl.util.texture.TextureData;
-import com.jogamp.opengl.util.texture.TextureIO;
-import demos.util.Cubemap;
import gleem.linalg.Mat4f;
import gleem.linalg.Rotf;
+
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
-import javax.media.opengl.GLProfile;
+
import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
-import javax.media.opengl.GLCapabilitiesImmutable;
import javax.media.opengl.GLDrawableFactory;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLException;
-import javax.media.opengl.GLPbuffer;
+import javax.media.opengl.GLOffscreenAutoDrawable;
+import javax.media.opengl.GLProfile;
import javax.media.opengl.glu.GLU;
+import com.jogamp.common.util.IOUtil;
+import com.jogamp.opengl.util.texture.Texture;
+import com.jogamp.opengl.util.texture.TextureData;
+import com.jogamp.opengl.util.texture.TextureIO;
+
+import demos.util.Cubemap;
+
/**
@@ -75,7 +78,7 @@ public class Water {
// used to render the water geometry (with the parent drawable's GL
// object).
- private GLU glu = new GLU();
+ private final GLU glu = new GLU();
// Rendering modes
public static final int CA_FULLSCREEN_REFLECT = 0;
@@ -85,7 +88,7 @@ public class Water {
public static final int CA_TILED_THREE_WINDOWS = 4;
public static final int CA_DO_NOT_RENDER = 5;
- private int[] initialMapDimensions = new int[2];
+ private final int[] initialMapDimensions = new int[2];
private TextureData initialMapData;
private String tmpSpinFilename;
@@ -93,8 +96,8 @@ public class Water {
private String tmpCubeMapFilenamePrefix;
private String tmpCubeMapFilenameSuffix;
- private GLPbuffer pbuffer;
- private Rotf cameraOrientation = new Rotf();
+ private GLOffscreenAutoDrawable pbuffer;
+ private final Rotf cameraOrientation = new Rotf();
// Dynamic texture names
private static final int CA_TEXTURE_FORCE_INTERMEDIATE = 0;
@@ -105,7 +108,7 @@ public class Water {
private static final int CA_TEXTURE_HEIGHT_TARGET = 5;
private static final int CA_TEXTURE_NORMAL_MAP = 6;
private static final int CA_NUM_DYNAMIC_TEXTURES = 7;
-
+
// List names
private static final int CA_FRAGMENT_PROGRAM_EQ_WEIGHT_COMBINE = 0;
private static final int CA_FRAGMENT_PROGRAM_NEIGHBOR_FORCE_CALC_1 = 1;
@@ -123,8 +126,8 @@ public class Water {
private Texture dropletTex;
private Texture cubemap;
- private Texture[] dynamicTextures = new Texture[CA_NUM_DYNAMIC_TEXTURES];
-
+ private final Texture[] dynamicTextures = new Texture[CA_NUM_DYNAMIC_TEXTURES];
+
private int texHeightInput; // current input height texture ID.
private int texHeightOutput; // current output height texture ID.
private int texVelocityInput; // current input velocity texture ID.
@@ -132,13 +135,13 @@ public class Water {
private int texForceStepOne; // intermediate force computation result texture ID.
private int texForceOutput; // current output force texture ID.
- private int[] displayListIDs = new int[CA_NUM_LISTS];
-
+ private final int[] displayListIDs = new int[CA_NUM_LISTS];
+
private int vertexProgramID; // one vertex program is used to choose the texcoord offset
private int flipState; // used to flip target texture configurations.
- private boolean wrap; // CA can either wrap its borders, or clamp (clamp by default)
+ private boolean wrap; // CA can either wrap its borders, or clamp (clamp by default)
private boolean reset = true; // are we resetting this frame? (user hit reset).
private boolean singleStep; // animation step on keypress.
private boolean animate = true; // continuous animation.
@@ -146,7 +149,7 @@ public class Water {
private boolean wireframe; // render in wireframe mode
private boolean applyInteriorBoundaries = true; // enable / disable "boundary" image drawing.
private boolean spinLogo = true; // draw spinning logo.
- private boolean createNormalMap = true; // enable / disable normal map creation.
+ private final boolean createNormalMap = true; // enable / disable normal map creation.
private float perTexelWidth; // width of a texel (percentage of texture)
private float perTexelHeight; // height of a texel
@@ -154,20 +157,20 @@ public class Water {
private float blurDist = 0.5f; // distance over which to blur.
private boolean mustUpdateBlurOffsets; // flag indicating blurDist was set last tick
- private float normalSTScale = 0.8f; // scale of normals in normal map.
+ private final float normalSTScale = 0.8f; // scale of normals in normal map.
private float bumpScale = 0.25f; // scale of bumps in water.
private float dropletFrequency = 0.175f; // frequency at which droplets are drawn in water...
- private int slowDelay = 1; // amount (milliseconds) to delay when running slow.
+ private final int slowDelay = 1; // amount (milliseconds) to delay when running slow.
private int skipInterval; // frames to skip simulation.
private int skipCount; // frame count for skipping rendering
private int angle; // angle in degrees for spinning logo
- private List/*<Droplet>*/ droplets = new ArrayList/*<Droplet>*/(); // array of droplets
+ private final List/*<Droplet>*/ droplets = new ArrayList/*<Droplet>*/(); // array of droplets
- private int renderMode;
+ private int renderMode;
// Constant memory locations
private static final int CV_UV_OFFSET_TO_USE = 0;
@@ -205,24 +208,22 @@ public class Water {
String cubeMapFilenameSuffix,
GLAutoDrawable parentWindow) {
GLCapabilities caps = (GLCapabilities) parentWindow.getChosenGLCapabilities().cloneMutable();
+ caps.setPBuffer(true);
loadInitialTexture(caps.getGLProfile(), initialMapFilename);
tmpSpinFilename = spinFilename;
tmpDropletFilename = dropletFilename;
tmpCubeMapFilenamePrefix = cubeMapFilenamePrefix;
tmpCubeMapFilenameSuffix = cubeMapFilenameSuffix;
-
+
// create the pbuffer. Will use this as an offscreen rendering buffer.
// it allows rendering a texture larger than our window.
caps.setDoubleBuffered(false);
if (!GLDrawableFactory.getFactory(caps.getGLProfile()).canCreateGLPbuffer(null, caps.getGLProfile())) {
throw new GLException("Pbuffers not supported with this graphics card");
}
- pbuffer = GLDrawableFactory.getFactory(caps.getGLProfile()).createGLPbuffer(
- null, caps, null,
- initialMapDimensions[0],
- initialMapDimensions[1],
- parentWindow.getContext());
+ pbuffer = GLDrawableFactory.getFactory(GLProfile.getDefault()).createOffscreenAutoDrawable(null, caps, null, initialMapDimensions[0], initialMapDimensions[1]);
+ pbuffer.setSharedContext(parentWindow.getContext());
pbuffer.addGLEventListener(new Listener());
}
@@ -234,7 +235,7 @@ public class Water {
reset = true;
}
- public void tick() {
+ public void tick() {
pbuffer.display();
}
@@ -246,12 +247,12 @@ public class Water {
// Display the results of the rendering to texture
if (wireframe) {
gl.glPolygonMode(GL2.GL_FRONT_AND_BACK, GL2.GL_LINE);
-
+
// chances are the texture will be all dark, so lets not use a texture
gl.glDisable(GL2.GL_TEXTURE_2D);
} else {
gl.glPolygonMode(GL2.GL_FRONT_AND_BACK, GL2.GL_FILL);
-
+
gl.glActiveTexture(GL2.GL_TEXTURE0);
gl.glEnable(GL2.GL_TEXTURE_2D);
}
@@ -280,36 +281,36 @@ public class Water {
gl.glColor4f(1, 1, 1, 1);
gl.glBegin(GL2.GL_QUADS);
-
+
gl.glMultiTexCoord2f(GL2.GL_TEXTURE0, 0,0);
gl.glMultiTexCoord4f(GL2.GL_TEXTURE1, matRot.get(0,0), matRot.get(0,1), matRot.get(0,2), 1);
gl.glMultiTexCoord4f(GL2.GL_TEXTURE2, matRot.get(1,0), matRot.get(1,1), matRot.get(1,2), 1);
gl.glMultiTexCoord4f(GL2.GL_TEXTURE3, matRot.get(2,0), matRot.get(2,1), matRot.get(2,2), 1);
gl.glVertex2f(-1,-1);
-
+
gl.glMultiTexCoord2f(GL2.GL_TEXTURE0, 1,0);
gl.glMultiTexCoord4f(GL2.GL_TEXTURE1, matRot.get(0,0), matRot.get(0,1), matRot.get(0,2), -1);
gl.glMultiTexCoord4f(GL2.GL_TEXTURE2, matRot.get(1,0), matRot.get(1,1), matRot.get(1,2), 1);
gl.glMultiTexCoord4f(GL2.GL_TEXTURE3, matRot.get(2,0), matRot.get(2,1), matRot.get(2,2), 1);
gl.glVertex2f( 1,-1);
-
+
gl.glMultiTexCoord2f(GL2.GL_TEXTURE0, 1,1);
gl.glMultiTexCoord4f(GL2.GL_TEXTURE1, matRot.get(0,0), matRot.get(0,1), matRot.get(0,2), -1);
gl.glMultiTexCoord4f(GL2.GL_TEXTURE2, matRot.get(1,0), matRot.get(1,1), matRot.get(1,2), -1);
gl.glMultiTexCoord4f(GL2.GL_TEXTURE3, matRot.get(2,0), matRot.get(2,1), matRot.get(2,2), 1);
gl.glVertex2f( 1, 1);
-
+
gl.glMultiTexCoord2f(GL2.GL_TEXTURE0, 0,1);
gl.glMultiTexCoord4f(GL2.GL_TEXTURE1, matRot.get(0,0), matRot.get(0,1), matRot.get(0,2), 1);
gl.glMultiTexCoord4f(GL2.GL_TEXTURE2, matRot.get(1,0), matRot.get(1,1), matRot.get(1,2), -1);
gl.glMultiTexCoord4f(GL2.GL_TEXTURE3, matRot.get(2,0), matRot.get(2,1), matRot.get(2,2), 1);
gl.glVertex2f(-1, 1);
-
+
gl.glEnd();
-
+
cubemap.disable(gl);
gl.glDisable(GL2.GL_FRAGMENT_PROGRAM_ARB);
-
+
break;
}
@@ -317,7 +318,7 @@ public class Water {
// Draw quad over full display
gl.glActiveTexture(GL2.GL_TEXTURE0);
dynamicTextures[CA_TEXTURE_NORMAL_MAP].bind(gl);
-
+
gl.glCallList(displayListIDs[CA_DRAW_SCREEN_QUAD]);
break;
}
@@ -326,7 +327,7 @@ public class Water {
// Draw quad over full display
gl.glActiveTexture(GL2.GL_TEXTURE0);
gl.glBindTexture(GL2.GL_TEXTURE_2D, texHeightOutput);
-
+
gl.glCallList(displayListIDs[CA_DRAW_SCREEN_QUAD]);
break;
}
@@ -335,7 +336,7 @@ public class Water {
// Draw quad over full display
gl.glActiveTexture(GL2.GL_TEXTURE0);
dynamicTextures[CA_TEXTURE_FORCE_TARGET].bind(gl);
-
+
gl.glCallList(displayListIDs[CA_DRAW_SCREEN_QUAD]);
break;
}
@@ -347,7 +348,7 @@ public class Water {
dynamicTextures[CA_TEXTURE_FORCE_TARGET].bind(gl);
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glPushMatrix();
-
+
gl.glTranslatef(-0.5f, -0.5f, 0);
gl.glScalef(0.5f, 0.5f, 1);
gl.glCallList(displayListIDs[CA_DRAW_SCREEN_QUAD]);
@@ -356,7 +357,7 @@ public class Water {
// lower right
gl.glBindTexture(GL2.GL_TEXTURE_2D, texVelocityOutput);
gl.glPushMatrix();
-
+
gl.glTranslatef(0.5f, -0.5f, 0);
gl.glScalef(0.5f, 0.5f, 1);
gl.glCallList(displayListIDs[CA_DRAW_SCREEN_QUAD]);
@@ -366,7 +367,7 @@ public class Water {
dynamicTextures[CA_TEXTURE_NORMAL_MAP].bind(gl);
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glPushMatrix();
-
+
gl.glTranslatef(-0.5f, 0.5f, 0);
gl.glScalef(0.5f, 0.5f, 1);
gl.glCallList(displayListIDs[CA_DRAW_SCREEN_QUAD]);
@@ -376,12 +377,12 @@ public class Water {
gl.glBindTexture(GL2.GL_TEXTURE_2D, texHeightOutput);
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glPushMatrix();
-
+
gl.glTranslatef(0.5f, 0.5f, 0);
gl.glScalef(0.5f, 0.5f, 1);
gl.glCallList(displayListIDs[CA_DRAW_SCREEN_QUAD]);
gl.glPopMatrix();
-
+
break;
}
}
@@ -396,10 +397,10 @@ public class Water {
public void enableSlowAnimation(boolean enable) { slow = enable; }
public void reset() { reset = true; }
public void setRenderMode(int mode) { renderMode = mode; }
-
+
public void enableWireframe(boolean enable) { wireframe = enable; }
public void enableBorderWrapping(boolean enable) { wrap = enable; }
-
+
public void enableBoundaryApplication(boolean enable) { applyInteriorBoundaries = enable; }
public void enableSpinningLogo(boolean enable) { spinLogo = enable; }
@@ -414,23 +415,23 @@ public class Water {
public float getDropFrequency() { return dropletFrequency; }
public static class Droplet {
- private float rX;
- private float rY;
- private float rScale;
+ private final float rX;
+ private final float rY;
+ private final float rScale;
Droplet(float rX, float rY, float rScale) {
this.rX = rX;
this.rY = rY;
this.rScale = rScale;
}
-
+
float rX() { return rX; }
float rY() { return rY; }
float rScale() { return rScale; }
}
public synchronized void addDroplet(Droplet drop) {
- droplets.add(drop);
+ droplets.add(drop);
}
//----------------------------------------------------------------------
@@ -439,23 +440,26 @@ public class Water {
class Listener implements GLEventListener {
- public void init(GLAutoDrawable drawable) {
+ @Override
+ public void init(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
initOpenGL(gl);
}
- public void dispose(GLAutoDrawable drawable) {
+ @Override
+ public void dispose(GLAutoDrawable drawable) {
}
- public void display(GLAutoDrawable drawable) {
+ @Override
+ public void display(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
if (mustUpdateBlurOffsets) {
updateBlurVertOffset(gl);
mustUpdateBlurOffsets = false;
}
-
+
// Take a single step in the cellular automaton
// Disable culling
@@ -473,7 +477,7 @@ public class Water {
doSingleTimeStep(gl);
singleStep = false;
}
-
+
// Force rendering to pbuffer to complete
gl.glFlush();
@@ -485,7 +489,8 @@ public class Water {
}
}
- public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {}
+ @Override
+ public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {}
// Unused routines
public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {}
@@ -522,11 +527,11 @@ public class Water {
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluOrtho2D(-1, 1, -1, 1);
-
+
gl.glClearColor(0, 0, 0, 0);
gl.glDisable(GL2.GL_LIGHTING);
gl.glDisable(GL2.GL_DEPTH_TEST);
-
+
createAndWriteUVOffsets(gl, initialMapDimensions[0], initialMapDimensions[1]);
checkExtension(gl, "GL_ARB_vertex_program");
@@ -542,7 +547,7 @@ public class Water {
vertexProgramID = tmpInt[0];
gl.glBindProgramARB(GL2.GL_VERTEX_PROGRAM_ARB, vertexProgramID);
- String programBuffer =
+ String programBuffer =
"!!ARBvp1.0\n" +
"# Constant memory location declarations (must match those in Java sources)\n" +
"# CV_UV_OFFSET_TO_USE = 0\n" +
@@ -711,8 +716,8 @@ public class Water {
// use CopyTexSubImage for speed (even though we copy all of it) since we pre-allocated the texture
gl.glCopyTexSubImage2D(GL2.GL_TEXTURE_2D, 0, 0, 0, 0, 0, initialMapDimensions[0], initialMapDimensions[1]);
- break;
-
+ break;
+
case 1:
temp = texHeightInput;
texHeightInput = texHeightOutput;
@@ -734,10 +739,10 @@ public class Water {
texVelocityOutput = temp;
break;
}
-
+
// even if wireframe mode, render to texture as solid
gl.glPolygonMode(GL2.GL_FRONT_AND_BACK, GL2.GL_FILL);
-
+
/////////////////////////////////////////////////////////////
// Render first 3 components of force from three neighbors
// Offsets selected are 1 center texel for center height
@@ -776,18 +781,18 @@ public class Water {
// Now we need to copy the resulting pixels into the intermediate force field texture
gl.glActiveTexture(GL2.GL_TEXTURE2);
- dynamicTextures[CA_TEXTURE_FORCE_INTERMEDIATE].bind(gl);
+ dynamicTextures[CA_TEXTURE_FORCE_INTERMEDIATE].bind(gl);
// use CopyTexSubImage for speed (even though we copy all of it) since we pre-allocated the texture
gl.glCopyTexSubImage2D(GL2.GL_TEXTURE_2D, 0, 0, 0, 0, 0, initialMapDimensions[0], initialMapDimensions[1]);
////////////////////////////////////////////////////////////////
// Now add in last component of force for the 4th neighbor
- // that we didn't have enough texture lookups to do in the
+ // that we didn't have enough texture lookups to do in the
// first pass
gl.glCallList(displayListIDs[CA_FRAGMENT_PROGRAM_NEIGHBOR_FORCE_CALC_2]);
-
+
// Cannot use additive blending as the force contribution might
// be negative and would have to subtract from the dest.
// We must instead use an additional texture as target and read
@@ -826,7 +831,7 @@ public class Water {
/////////////////////////////////////////////////////////////////
// Apply the force with a scale factor to reduce it's magnitude.
// Add this to the current texture representing the water height.
-
+
gl.glCallList(displayListIDs[CA_FRAGMENT_PROGRAM_APPLY_FORCE]);
// use offsets of zero
@@ -837,7 +842,7 @@ public class Water {
gl.glActiveTexture(GL2.GL_TEXTURE0);
gl.glBindTexture(GL2.GL_TEXTURE_2D, texVelocityInput);
gl.glActiveTexture(GL2.GL_TEXTURE1);
- dynamicTextures[CA_TEXTURE_FORCE_TARGET].bind(gl);
+ dynamicTextures[CA_TEXTURE_FORCE_TARGET].bind(gl);
gl.glActiveTexture(GL2.GL_TEXTURE2);
gl.glDisable(GL2.GL_TEXTURE_2D);
gl.glActiveTexture(GL2.GL_TEXTURE3);
@@ -896,7 +901,7 @@ public class Water {
// Now we need to copy the resulting pixels into the input height texture
gl.glActiveTexture(GL2.GL_TEXTURE0);
gl.glBindTexture(GL2.GL_TEXTURE_2D, texHeightInput);
-
+
// use CopyTexSubImage for speed (even though we copy all of it) since we pre-allocated the texture
gl.glCopyTexSubImage2D(GL2.GL_TEXTURE_2D, 0, 0, 0, 0, 0, initialMapDimensions[0], initialMapDimensions[1]);
@@ -904,7 +909,7 @@ public class Water {
// blur positions to smooth noise & generaly dampen things
// degree of blur is controlled by magnitude of 4 neighbor texel
// offsets with bilinear on
-
+
for (int i = 1; i < 4; i++) {
gl.glActiveTexture(GL2.GL_TEXTURE0 + i);
gl.glBindTexture(GL2.GL_TEXTURE_2D, texHeightInput);
@@ -931,14 +936,14 @@ public class Water {
// use CopyTexSubImage for speed (even though we copy all of it) since we pre-allocated the texture
gl.glCopyTexSubImage2D(GL2.GL_TEXTURE_2D, 0, 0, 0, 0, 0, initialMapDimensions[0], initialMapDimensions[1]);
-
+
///////////////////////////////////////////////////////////////////
// If selected, create a normal map from the height
-
+
if (createNormalMap) {
createNormalMap(gl);
}
-
+
///////////////////////////////////////////////////////////
// Flip the state variable for the next round of rendering
switch (flipState) {
@@ -978,7 +983,7 @@ public class Water {
// set vp offsets to nearest neighbors
gl.glProgramEnvParameter4fARB(GL2.GL_VERTEX_PROGRAM_ARB, CV_UV_OFFSET_TO_USE, 4, 0, 0, 0);
gl.glEnable(GL2.GL_VERTEX_PROGRAM_ARB);
-
+
gl.glCallList(displayListIDs[CA_DRAW_SCREEN_QUAD]);
gl.glDisable(GL2.GL_FRAGMENT_PROGRAM_ARB);
@@ -986,13 +991,13 @@ public class Water {
// Now we need to copy the resulting pixels into the normal map
gl.glActiveTexture(GL2.GL_TEXTURE0);
dynamicTextures[CA_TEXTURE_NORMAL_MAP].bind(gl);
-
+
// use CopyTexSubImage for speed (even though we copy all of it) since we pre-allocated the texture
gl.glCopyTexSubImage2D(GL2.GL_TEXTURE_2D, 0, 0, 0, 0, 0, initialMapDimensions[0], initialMapDimensions[1]);
}
private void drawInteriorBoundaryObjects(GL2 gl) {
-
+
gl.glActiveTexture(GL2.GL_TEXTURE0);
initialMapTex.bind(gl);
initialMapTex.enable(gl);
@@ -1004,7 +1009,7 @@ public class Water {
gl.glActiveTexture(GL2.GL_TEXTURE0 + i);
gl.glDisable(GL2.GL_TEXTURE_2D);
}
-
+
gl.glBlendFunc(GL2.GL_SRC_ALPHA, GL2.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL2.GL_BLEND);
@@ -1057,17 +1062,17 @@ public class Water {
texHeightInput = initialMapTex.getTextureObject(gl); // initial height map.
texHeightOutput = dynamicTextures[CA_TEXTURE_HEIGHT_TARGET].getTextureObject(gl); // next height map.
-
+
texVelocityInput = dynamicTextures[CA_TEXTURE_VELOCITY_SOURCE].getTextureObject(gl); // initial velocity.
texVelocityOutput = dynamicTextures[CA_TEXTURE_VELOCITY_TARGET].getTextureObject(gl); // next velocity.
}
private void createAndWriteUVOffsets(GL2 gl, int width, int height) {
// This sets vertex shader constants used to displace the
- // source texture over several additive samples. This is
+ // source texture over several additive samples. This is
// used to accumulate neighboring texel information that we
- // need to run the game - the 8 surrounding texels, and the
- // single source texel which will either spawn or die in the
+ // need to run the game - the 8 surrounding texels, and the
+ // single source texel which will either spawn or die in the
// next generation.
// Label the texels as follows, for a source texel "e" that
// we want to compute for the next generation:
@@ -1078,9 +1083,9 @@ public class Water {
// first the easy one: no offsets for sampling center
// occupied or unoccupied
- // Use index offset value 0.0 to access these in the
+ // Use index offset value 0.0 to access these in the
// vertex shader.
-
+
perTexelWidth = 1.0f / width;
perTexelHeight = 1.0f / height;
@@ -1096,7 +1101,7 @@ public class Water {
float[] type1OffsetY = new float[] { 0.0f, dist * perTexelHeight, dist * perTexelHeight, -dist * perTexelHeight };
// Offset set 2: for use with neighbor force pixel shader 2
- // samples center with 0, and -v texels
+ // samples center with 0, and -v texels
// ie the 'e' and 'b' texels
// This completes a pattern of sampling center texel and it's
// 4 nearest neighbors to run the height-based water simulation
@@ -1105,7 +1110,7 @@ public class Water {
float[] type2OffsetX = new float[] { 0.0f, -dist * perTexelWidth, 0.0f, 0.0f };
float[] type2OffsetY = new float[] { 0.0f, -dist * perTexelHeight, 0.0f, 0.0f };
-
+
// type 3 offsets
updateBlurVertOffset(gl);
@@ -1130,15 +1135,15 @@ public class Water {
}
private void updateBlurVertOffset(GL2 gl) {
- float[] type3OffsetX = new float[] { -perTexelWidth * 0.5f,
- perTexelWidth,
- perTexelWidth * 0.5f,
- -perTexelWidth
+ float[] type3OffsetX = new float[] { -perTexelWidth * 0.5f,
+ perTexelWidth,
+ perTexelWidth * 0.5f,
+ -perTexelWidth
};
float[] type3OffsetY = new float[] { perTexelHeight,
perTexelHeight * 0.5f,
-perTexelHeight,
- -perTexelHeight * 0.5f
+ -perTexelHeight * 0.5f
};
float[] offsets = new float[] { 0, 0, 0, 0 };
@@ -1173,11 +1178,11 @@ public class Water {
// The quad is textured with the initial droplet texture, and
// covers some small portion of the render target
// Draw the droplet
-
+
gl.glTexCoord2f(0, 0); gl.glVertex2f(droplet.rX() - droplet.rScale(), droplet.rY() - droplet.rScale());
gl.glTexCoord2f(1, 0); gl.glVertex2f(droplet.rX() + droplet.rScale(), droplet.rY() - droplet.rScale());
gl.glTexCoord2f(1, 1); gl.glVertex2f(droplet.rX() + droplet.rScale(), droplet.rY() + droplet.rScale());
- gl.glTexCoord2f(0, 1); gl.glVertex2f(droplet.rX() - droplet.rScale(), droplet.rY() + droplet.rScale());
+ gl.glTexCoord2f(0, 1); gl.glVertex2f(droplet.rX() - droplet.rScale(), droplet.rY() + droplet.rScale());
}
gl.glEnd();
@@ -1268,7 +1273,7 @@ public class Water {
//
// This step takes the center point and three neighboring points, and computes
// the texel difference as the "force" acting to pull the center texel.
- //
+ //
// The amount to which the computed force is applied to the texel is controlled
// in a separate shader.
@@ -1287,7 +1292,7 @@ public class Water {
// //s0 = t1 - t0;
// discard = -tex0;
// discard = tex1;
- // spare0 = sum();
+ // spare0 = sum();
// }
// Stage 1
// rgb
@@ -1295,16 +1300,16 @@ public class Water {
// //s1 = t2 - t0;
// discard = -tex0;
// discard = tex2;
- // spare1 = sum();
+ // spare1 = sum();
// }
// Stage 2
// // 'force' for 1st axis
- // rgb
+ // rgb
// {
// //s0 = s0 + s1 = t1 - t0 + t2 - t0;
// discard = spare0;
// discard = spare1;
- // spare0 = sum();
+ // spare0 = sum();
// }
// Stage 3
// // one more point for 2nd axis
@@ -1313,7 +1318,7 @@ public class Water {
// //s1 = t3 - t0;
// discard = -tex0;
// discard = tex3;
- // spare1 = sum();
+ // spare1 = sum();
// }
// Stage 4
// rgb
@@ -1321,20 +1326,20 @@ public class Water {
// //s0 = s0 + s1 = t3 - t0 + t2 - t0 + t1 - t0;
// discard = spare0;
// discard = spare1;
- // spare0 = sum();
+ // spare0 = sum();
// }
// Stage 5
- // // Now add in a force to gently pull the center texel's
+ // // Now add in a force to gently pull the center texel's
// // value to 0.5. The strength of this is controlled by
// // the PCN_EQ_REST_FAC - restoration factor
// // Without this, the simulation will fade to zero or fly
// // away to saturate at 1.0
- // rgb
+ // rgb
// {
- // //s1 = 0.5 - t0;
+ // //s1 = 0.5 - t0;
// discard = -tex0;
// discard = const0;
- // spare1 = sum();
+ // spare1 = sum();
// }
// Stage 6
// {
@@ -1410,10 +1415,10 @@ public class Water {
// 2nd step of force calc for render-to-texture
// water simulation.
//
- // Adds the 4th & final neighbor point to the
+ // Adds the 4th & final neighbor point to the
// force calc..
//
- // Bias and scale the values so 0 force is 0.5,
+ // Bias and scale the values so 0 force is 0.5,
// full negative force is 0.0, and full pos is
// 1.0
//
@@ -1475,14 +1480,14 @@ public class Water {
//
// This is used to apply a "force" texture value to a "velocity" state texture
// for nearest-neighbor height-based water simulations. The output pixel is
- // the new "velocity" value to replace the t0 sample in rendering to a new
+ // the new "velocity" value to replace the t0 sample in rendering to a new
// texture which will replace the texture selected into t0.
//
// A nearly identical shader using a different scaling constant is used to
// apply the "velocity" value to a "height" texture at each texel.
//
// t1 comes in the range [0,1] but needs to hold signed values, so a value of
- // 0.5 in t1 represents zero force. This is biased to a signed value in
+ // 0.5 in t1 represents zero force. This is biased to a signed value in
// computing the new velocity.
//
// tex0 = previous velocity
@@ -1554,18 +1559,18 @@ public class Water {
//
// This is used to apply a "velocity" texture value to a "height" state texture
// for nearest-neighbor height-based water simulations. The output pixel is
- // the new "height" value to replace the t0 sample in rendering to a new
+ // the new "height" value to replace the t0 sample in rendering to a new
// texture which will replace the texture selected into t0.
//
// A nearly identical shader using a different scaling constant is used to
// apply the "force" value to the "velocity" texture at each texel.
//
// t1 comes in the range [0,1] but needs to hold signed values, so a value of
- // 0.5 in t1 represents zero velocity. This is biased to a signed value in
- // computing the new position.
+ // 0.5 in t1 represents zero velocity. This is biased to a signed value in
+ // computing the new position.
//
// tex0 = height field
- // tex1 = velocity
+ // tex1 = velocity
//
// Bias the force/velocity to a signed value so we can subtract from
// the t0 position sample.
@@ -1700,7 +1705,7 @@ public class Water {
// }
// Stage 6
// const0 = (0, 0, 1, 1);
- // rgb
+ // rgb
// {
// discard = spare1 * const0;
// discard = spare0;