Add spark concentration & weight options

Weight does not work great, lines are not the right thing to use.
This commit is contained in:
bkuker 2013-12-03 19:08:11 -05:00
parent c83b16b385
commit ba037a1b2c
3 changed files with 62 additions and 15 deletions

View File

@ -34,6 +34,9 @@ public class PhotoSettings extends AbstractChangeSource implements FlameSettings
private double exhaustScale = 1.0; private double exhaustScale = 1.0;
private double flameAspectRatio = 1.0; private double flameAspectRatio = 1.0;
private double sparkConcentration;
private double sparkWeight;
private Sky sky = Mountains.instance; private Sky sky = Mountains.instance;
public double getRoll() { public double getRoll() {
@ -250,4 +253,22 @@ public class PhotoSettings extends AbstractChangeSource implements FlameSettings
this.sky = sky; this.sky = sky;
fireChangeEvent(); fireChangeEvent();
} }
public double getSparkConcentration() {
return sparkConcentration;
}
public void setSparkConcentration(double sparkConcentration) {
this.sparkConcentration = sparkConcentration;
fireChangeEvent();
}
public double getSparkWeight() {
return sparkWeight;
}
public void setSparkWeight(double sparkWeight) {
this.sparkWeight = sparkWeight;
fireChangeEvent();
}
} }

View File

@ -288,10 +288,32 @@ public class PhotoSettingsConfig extends JTabbedPane {
fireModel.addEnableComponent(flameAspectSpinner); fireModel.addEnableComponent(flameAspectSpinner);
add(new JLabel("Sparks")); add(new JLabel("Sparks"));
JCheckBox sparksCheck = new JCheckBox(new BooleanModel(p, "Sparks")); BooleanModel sparksModel = new BooleanModel(p, "Sparks");
JCheckBox sparksCheck = new JCheckBox(sparksModel);
add(sparksCheck, "wrap"); add(sparksCheck, "wrap");
fireModel.addEnableComponent(sparksCheck); fireModel.addEnableComponent(sparksCheck);
add(new JLabel("Spark Concentration"));
DoubleModel sparkConcentrationModel = new DoubleModel(p, "SparkConcentration", 100, UnitGroup.UNITS_NONE, 0, 100);
JSpinner sparkConcentrationSpinner = new JSpinner(sparkConcentrationModel.getSpinnerModel());
add(sparkConcentrationSpinner, "wrap");
sparksModel.addEnableComponent(sparkConcentrationSpinner);
add(new JLabel("Spark Weight"));
DoubleModel sparkWeightModel = new DoubleModel(p, "SparkWeight", 100, UnitGroup.UNITS_NONE, 0, 100);
JSpinner sparkWeightSpinner = new JSpinner(sparkWeightModel.getSpinnerModel());
add(sparkWeightSpinner, "wrap");
sparksModel.addEnableComponent(sparkWeightSpinner);
add(new JLabel("Exhaust Scale")); add(new JLabel("Exhaust Scale"));
DoubleModel exhaustScaleModel = new DoubleModel(p, "ExhaustScale", 100, UnitGroup.UNITS_NONE, 0, 1000); DoubleModel exhaustScaleModel = new DoubleModel(p, "ExhaustScale", 100, UnitGroup.UNITS_NONE, 0, 1000);
add(new JSpinner(exhaustScaleModel.getSpinnerModel()), "wrap"); add(new JSpinner(exhaustScaleModel.getSpinnerModel()), "wrap");

View File

@ -141,21 +141,25 @@ import com.jogamp.opengl.util.texture.TextureIO;
public final class FlameRenderer { public final class FlameRenderer {
public interface FlameSettings { public interface FlameSettings {
public double getExhaustScale();
public boolean isFlame(); public boolean isFlame();
public boolean isSmoke();
public Color getFlameColor(); public Color getFlameColor();
public boolean isSmoke();
public Color getSmokeColor(); public Color getSmokeColor();
public double getSmokeAlpha(); public double getSmokeAlpha();
public double getFlameAspectRatio();
public boolean isSparks(); public boolean isSparks();
public double getExhaustScale(); public double getSparkConcentration();
public double getFlameAspectRatio(); public double getSparkWeight();
} }
private static final Logger log = LoggerFactory.getLogger(FlameRenderer.class); private static final Logger log = LoggerFactory.getLogger(FlameRenderer.class);
@ -175,7 +179,7 @@ public final class FlameRenderer {
gl.glDisable(GLLightingFunc.GL_LIGHTING); gl.glDisable(GLLightingFunc.GL_LIGHTING);
if (fs.isSparks() && fs.isFlame()) { if (fs.isSparks() && fs.isFlame()) {
sparks(gl, fs.getFlameColor()); sparks(gl, fs);
} }
gl.glEnable(GL.GL_BLEND); gl.glEnable(GL.GL_BLEND);
@ -457,13 +461,13 @@ public final class FlameRenderer {
} }
} }
private static void sparks(GL2 gl, Color color) { 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);
float[] c = new float[4]; float[] c = new float[4];
float[] c2 = new float[4]; float[] c2 = new float[4];
convertColor(color, c); convertColor(fs.getFlameColor(), c);
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
c[i] = c2[i] = c[i] * .2f + .8f; c[i] = c2[i] = c[i] * .2f + .8f;
} }
@ -471,17 +475,17 @@ public final class FlameRenderer {
c2[3] = 1; c2[3] = 1;
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL.GL_BLEND); gl.glEnable(GL.GL_BLEND);
gl.glLineWidth(1f); gl.glLineWidth(1 + (float)fs.getSparkWeight() * 1.0f);
for (int i = 0; i < 200; i++) { for (int i = 0; i < 4000 * fs.getSparkConcentration(); i++) {
final float z = 2 * (r.nextFloat() * r.nextFloat() * r.nextFloat()); final float z = 0.01f + 2 * (r.nextFloat() * r.nextFloat() * r.nextFloat());
final float x = z * (r.nextFloat() - 0.5f); final float x = z * (r.nextFloat() - 0.5f);
final float y = z * (r.nextFloat() - 0.5f); final float y = z * (r.nextFloat() - 0.5f);
gl.glPointSize(1); //gl.glPointSize(1);
gl.glBegin(GL.GL_LINES); gl.glBegin(GL.GL_LINES);
gl.glColor4fv(c, 0); gl.glColor4fv(c, 0);
gl.glVertex3f(x, y, z * 2); gl.glVertex3f(x, y, z * 2);
gl.glColor4fv(c2, 0); gl.glColor4fv(c2, 0);
gl.glVertex3f(x * 1.02f, y * 1.02f, z * 2 + 0.01f); gl.glVertex3f(x * 1.02f, y * 1.02f, z * 2 + 0.01f + ((float)fs.getSparkWeight() / 20));
gl.glEnd(); gl.glEnd();
} }
} }