Add light from flame to smoke.
This commit is contained in:
parent
ba037a1b2c
commit
e9a75b1111
@ -1,25 +1,36 @@
|
|||||||
uniform sampler2D uNormal;
|
uniform sampler2D uNormal;
|
||||||
uniform sampler2D uSmoke;
|
uniform sampler2D uSmoke;
|
||||||
|
uniform float z;
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
vec3 normal = 2.0 * texture2D (uNormal, gl_TexCoord[0].st).rgb - 1.0;
|
vec3 normal = 2.0 * texture2D (uNormal, gl_TexCoord[0].st).rgb - 1.0;
|
||||||
normal = normalize (gl_NormalMatrix * normal);
|
|
||||||
|
|
||||||
float lamberFactor = max (dot (gl_LightSource[1].position.xyz, normal), 0.0) ;
|
|
||||||
|
|
||||||
lamberFactor = lamberFactor * .6 + .4;
|
|
||||||
|
|
||||||
|
//Load only the Alpha from the smoke texture
|
||||||
vec4 diffuseMaterial = texture2D (uSmoke, gl_TexCoord[0].st);
|
vec4 diffuseMaterial = texture2D (uSmoke, gl_TexCoord[0].st);
|
||||||
diffuseMaterial.rgb = vec3(1);
|
diffuseMaterial.rgb = vec3(1);
|
||||||
|
|
||||||
vec4 diffuseLight = gl_LightSource[1].diffuse;
|
//Get Ambient light
|
||||||
vec4 ambientLight = gl_LightSource[1].ambient;
|
vec4 ambientLight = gl_LightSource[1].ambient;
|
||||||
|
|
||||||
vec4 bump = vec4(lamberFactor,lamberFactor,lamberFactor,1);
|
//Calculate diffuse light from "sun"
|
||||||
|
vec3 diffuseNormal = normal;
|
||||||
|
diffuseNormal.b = diffuseNormal.b * 0.5;
|
||||||
|
diffuseNormal = normalize (gl_NormalMatrix * diffuseNormal);
|
||||||
|
vec4 diffuseLight = gl_LightSource[1].diffuse;
|
||||||
|
float diffuseFactor = max (dot (gl_LightSource[1].position.xyz, diffuseNormal), 0.0) ;
|
||||||
|
diffuseFactor = diffuseFactor * .6 + .4;
|
||||||
|
vec4 diffuseBump = vec4(diffuseFactor,diffuseFactor,diffuseFactor,1);
|
||||||
|
|
||||||
vec4 light = diffuseLight * bump + ambientLight;
|
|
||||||
|
|
||||||
gl_FragColor = gl_Color * diffuseMaterial * light;
|
vec4 flameColor = gl_LightSource[2].diffuse;
|
||||||
|
float flameFactor = max (dot (vec3(0,0,1), diffuseNormal), 0.0);
|
||||||
|
flameFactor = flameFactor * (1 - z / 1.0);
|
||||||
|
flameFactor = flameFactor * diffuseMaterial.a * gl_Color.a * 10;
|
||||||
|
flameFactor = clamp(flameFactor,0,1);
|
||||||
|
|
||||||
|
vec4 light = diffuseLight * diffuseBump + ambientLight;
|
||||||
|
|
||||||
|
gl_FragColor = gl_Color * diffuseMaterial * light + flameColor * flameFactor;
|
||||||
}
|
}
|
@ -345,6 +345,7 @@ public class PhotoPanel extends JPanel implements GLEventListener {
|
|||||||
gl.glEnable(GLLightingFunc.GL_LIGHT2);
|
gl.glEnable(GLLightingFunc.GL_LIGHT2);
|
||||||
} else {
|
} else {
|
||||||
gl.glDisable(GLLightingFunc.GL_LIGHT2);
|
gl.glDisable(GLLightingFunc.GL_LIGHT2);
|
||||||
|
gl.glLightfv(GLLightingFunc.GL_LIGHT2, GLLightingFunc.GL_DIFFUSE, new float[] { 0,0,0,1 }, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -169,6 +169,10 @@ public final class FlameRenderer {
|
|||||||
|
|
||||||
public static void drawExhaust(GL2 gl, FlameSettings fs, Motor motor) {
|
public static void drawExhaust(GL2 gl, FlameSettings fs, Motor motor) {
|
||||||
|
|
||||||
|
//TODO REmove these
|
||||||
|
//dispose(gl);
|
||||||
|
//init(gl);
|
||||||
|
|
||||||
final float s = (float) Math.max(.5, Math.sqrt(motor.getAverageThrustEstimate()) / 4.0)
|
final float s = (float) Math.max(.5, Math.sqrt(motor.getAverageThrustEstimate()) / 4.0)
|
||||||
* (float) fs.getExhaustScale();
|
* (float) fs.getExhaustScale();
|
||||||
gl.glScalef(s, s, s);
|
gl.glScalef(s, s, s);
|
||||||
@ -307,6 +311,7 @@ public final class FlameRenderer {
|
|||||||
|
|
||||||
public static void init(GL2 gl) {
|
public static void init(GL2 gl) {
|
||||||
try {
|
try {
|
||||||
|
log.debug("Loading Textures");
|
||||||
TextureData data = TextureIO.newTextureData(GLProfile.getDefault(),
|
TextureData data = TextureIO.newTextureData(GLProfile.getDefault(),
|
||||||
FlameRenderer.class.getResourceAsStream("/datafiles/flame/c-color.png"), GL.GL_RGBA, GL.GL_RGBA,
|
FlameRenderer.class.getResourceAsStream("/datafiles/flame/c-color.png"), GL.GL_RGBA, GL.GL_RGBA,
|
||||||
true, null);
|
true, null);
|
||||||
@ -320,6 +325,7 @@ public final class FlameRenderer {
|
|||||||
true, null);
|
true, null);
|
||||||
flameT = TextureIO.newTexture(data);
|
flameT = TextureIO.newTexture(data);
|
||||||
|
|
||||||
|
log.debug("Loading Shader");
|
||||||
String line;
|
String line;
|
||||||
shaderprogram = gl.glCreateProgram();
|
shaderprogram = gl.glCreateProgram();
|
||||||
|
|
||||||
@ -366,6 +372,19 @@ public final class FlameRenderer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void dispose(GL2 gl) {
|
||||||
|
log.debug("Destroying Textures");
|
||||||
|
smokeT.destroy(gl);
|
||||||
|
smokeN.destroy(gl);
|
||||||
|
flameT.destroy(gl);
|
||||||
|
smokeT = null;
|
||||||
|
smokeN = null;
|
||||||
|
flameT = null;
|
||||||
|
log.debug("Deleting Shader {}", shaderprogram);
|
||||||
|
//gl.glDeleteShader(shaderprogram); TODO Why is this broken?
|
||||||
|
shaderprogram = 0;
|
||||||
|
}
|
||||||
|
|
||||||
private static void trail(GL2 gl, Func radius, Func dZ, Func alpha, float LEN, int P, Color color, float scale) {
|
private static void trail(GL2 gl, Func radius, Func dZ, Func alpha, float LEN, int P, Color color, float scale) {
|
||||||
float[] c = new float[4];
|
float[] c = new float[4];
|
||||||
convertColor(color, c);
|
convertColor(color, c);
|
||||||
@ -417,6 +436,11 @@ public final class FlameRenderer {
|
|||||||
c[3] = alpha.f(z);
|
c[3] = alpha.f(z);
|
||||||
gl.glColor4fv(c, 0);
|
gl.glColor4fv(c, 0);
|
||||||
|
|
||||||
|
int[] ii = {0};
|
||||||
|
gl.glGetIntegerv(GL2.GL_CURRENT_PROGRAM, ii, 0);
|
||||||
|
if ( ii[0] == shaderprogram )
|
||||||
|
setUniform1f(gl, shaderprogram, "z", z);
|
||||||
|
|
||||||
for (int i = 0; i < P; i++) {
|
for (int i = 0; i < P; i++) {
|
||||||
gl.glPushMatrix();
|
gl.glPushMatrix();
|
||||||
float rx = radius.f(z) - ((float) r.nextFloat() * radius.f(z) * 2.0f);
|
float rx = radius.f(z) - ((float) r.nextFloat() * radius.f(z) * 2.0f);
|
||||||
@ -461,6 +485,15 @@ public final class FlameRenderer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void setUniform1f(GL2 inGL, int inProgramID, String inName, float inValue) {
|
||||||
|
int tUniformLocation = inGL.glGetUniformLocation(inProgramID, inName);
|
||||||
|
if (tUniformLocation != -1) {
|
||||||
|
inGL.glUniform1f(tUniformLocation, inValue);
|
||||||
|
} else {
|
||||||
|
log.warn("UNIFORM COULD NOT BE FOUND! NAME={}", inName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static void sparks(GL2 gl, FlameSettings fs) {
|
private static void sparks(GL2 gl, FlameSettings fs) {
|
||||||
// Use the same seed every time
|
// Use the same seed every time
|
||||||
Random r = new Random(0);
|
Random r = new Random(0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user