summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/demos/particles/engine/ControlWindow.java240
-rwxr-xr-xsrc/demos/particles/engine/Engine.java103
-rwxr-xr-xsrc/demos/particles/engine/GLComponent.java137
-rwxr-xr-xsrc/demos/particles/engine/Particle.java121
-rwxr-xr-xsrc/demos/particles/engine/RGBA.java56
-rwxr-xr-xsrc/demos/particles/engine/XYZ.java62
-rwxr-xr-xsrc/demos/particles/engine/images/particle.jpgbin0 -> 1056 bytes
7 files changed, 719 insertions, 0 deletions
diff --git a/src/demos/particles/engine/ControlWindow.java b/src/demos/particles/engine/ControlWindow.java
new file mode 100755
index 0000000..8beb8ee
--- /dev/null
+++ b/src/demos/particles/engine/ControlWindow.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 2006 Ben Chappell (bwchappell@gmail.com) All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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.
+ *
+ * The names of Ben Chappell, Sun Microsystems, Inc. or the names of
+ * contributors may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. BEN CHAPPELL,
+ * SUN MICROSYSTEMS, INC. ("SUN"), AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL BEN
+ * CHAPPELL, SUN, OR SUN'S LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
+ * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
+ * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF BEN
+ * CHAPPELL OR SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ */
+
+package demos.particles.engine;
+
+import javax.swing.*;
+import java.awt.*;
+import javax.swing.border.*;
+import java.awt.event.*;
+import javax.swing.event.*;
+
+public class ControlWindow extends JFrame implements ActionListener, ChangeListener {
+
+ // For the engine
+ private Engine engine;
+ private GLComponent glComponent;
+ private Integer numParticles;
+
+ // Swing components
+ private JSlider greenSlider;
+ private JSlider redSlider;
+ private JSlider blueSlider;
+
+ private JButton resetButton;
+ private JButton closeButton;
+
+ private JSpinner particleSpinner;
+
+ public ControlWindow() {
+ super("Particle Engine");
+
+ Dimension d = getToolkit().getScreenSize();
+
+ buildFrame(d);
+ initComponents();
+ setVisible(true);
+ }
+
+ private void buildFrame(Dimension d) {
+ // Nicely center the window on the screen
+ int width = 800;
+ int x = (int)(d.getWidth()/2)-(int)(width/2);
+
+ int height = 800;
+ int y = (int)(d.getHeight()/2)-(int)(height/2);
+
+ setBounds(x, y, width, height);
+ setResizable(false);
+ getContentPane().setLayout(new GridBagLayout());
+ setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+ }
+
+ private void initComponents() {
+ // This will be used when borders or GridBagConstraints are needed
+ Border border;
+ GridBagConstraints constraints;
+
+ // Engine components
+ numParticles = new Integer(1000);
+ engine = new Engine(numParticles.intValue(), "demos/particles/engine/images/particle.jpg");
+ glComponent = new GLComponent(100, new RGBA(0.0f, 0.0f, 0.0f, 1.0f), new RGBA(0.0f, 0.0f, 0.0f, 1.0f), engine);
+
+ // Close and reset buttons
+ resetButton = new JButton("Reset");
+ resetButton.addActionListener(this);
+ closeButton = new JButton("Close");
+ closeButton.addActionListener(this);
+
+ // The RGB sliders
+ redSlider = new JSlider(0, 100, (int)engine.tendToColor.r*100) ;
+ redSlider.addChangeListener(this);
+ greenSlider = new JSlider(0, 100, (int)engine.tendToColor.g*100) ;
+ greenSlider.addChangeListener(this);
+ blueSlider = new JSlider(0, 100, (int)engine.tendToColor.b*100) ;
+ blueSlider.addChangeListener(this);
+
+ // Particle spinner
+ particleSpinner = new JSpinner(new SpinnerNumberModel(numParticles,
+ new Integer(0),
+ null,
+ new Integer(1)));
+ particleSpinner.addChangeListener(this);
+ particleSpinner.setPreferredSize(
+ new Dimension((int)(getBounds().width/3.5), 25));
+
+ // The color control panel
+ JPanel colorPanel = new JPanel(new GridBagLayout());
+ border = BorderFactory.createTitledBorder(
+ BorderFactory.createLineBorder(new Color(0.0f,0.0f,0.0f)),
+ "Color Tendency");
+ colorPanel.setBorder(border);
+
+ constraints = new GridBagConstraints();
+ constraints.insets = new Insets(3,2,3,2);
+ constraints.fill=constraints.HORIZONTAL;
+
+ constraints.gridx = 0;
+ constraints.gridy = 0;
+ colorPanel.add(new JLabel("Red"), constraints);
+ constraints.gridx = 1;
+ colorPanel.add(redSlider, constraints);
+
+ constraints.gridx = 0;
+ constraints.gridy = 1;
+ colorPanel.add(new JLabel("Green"), constraints);
+ constraints.gridx = 1;
+ colorPanel.add(greenSlider, constraints);
+
+ constraints.gridx = 0;
+ constraints.gridy = 2;
+ colorPanel.add(new JLabel("Blue"), constraints);
+ constraints.gridx = 1;
+ colorPanel.add(blueSlider, constraints);
+
+ // The panel containing the spinnger
+ JPanel numPanel = new JPanel(new GridBagLayout());
+ border = BorderFactory.createTitledBorder(
+ BorderFactory.createLineBorder(new Color(0.0f,0.0f,0.0f)),
+ "Number of Particles");
+ numPanel.setBorder(border);
+
+ constraints = new GridBagConstraints();
+ numPanel.add(particleSpinner, constraints);
+
+ // The panel containing the reset and close buttons
+ JPanel optionsPanel = new JPanel(new GridBagLayout());
+ border = BorderFactory.createTitledBorder(
+ BorderFactory.createLineBorder(new Color(0.0f,0.0f,0.0f)),
+ "Options");
+ optionsPanel.setBorder(border);
+
+ constraints = new GridBagConstraints();
+ constraints.insets = new Insets(5,5,5,5);
+ optionsPanel.add(resetButton, constraints);
+ constraints.gridy = GridBagConstraints.RELATIVE;
+ constraints.gridx = GridBagConstraints.RELATIVE;
+ optionsPanel.add(closeButton, constraints);
+
+ // The panel containing the the OpenGL content
+ JPanel glPanel = new JPanel(new BorderLayout());
+ glPanel.setPreferredSize(new Dimension(getBounds().width-10, (int)getBounds().height*3/4));
+ glPanel.add(glComponent);
+
+ constraints = new GridBagConstraints();
+ constraints.weightx = constraints.weighty = 1.0d;
+ constraints.fill=constraints.BOTH;
+
+ constraints.gridx = 0;
+ constraints.gridy = 0;
+ glPanel.setBorder(BorderFactory.createRaisedBevelBorder());
+ getContentPane().add(glPanel, constraints);
+
+ // The panel containing the panels that contain all the other components
+ JPanel bottomPanel = new JPanel(new GridLayout(1,3,3,3));
+ bottomPanel.add(colorPanel);
+ bottomPanel.add(numPanel);
+ bottomPanel.add(optionsPanel);
+ constraints.gridx = 0;
+ constraints.gridy = GridBagConstraints.RELATIVE;
+ getContentPane().add(bottomPanel, constraints);
+ }
+
+ public static void main(String[] args) {
+ new ControlWindow();
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ if(e.getSource().equals(closeButton)) {
+ setVisible(false);
+ dispose();
+ System.exit(0);
+ }
+ if(e.getSource().equals(resetButton))
+ engine.reset();
+ }
+
+ public void stateChanged(ChangeEvent e) {
+ if(e.getSource().equals(particleSpinner)) {
+ // Get the number; loop up or down until the vector in the engine has the proper number
+ Integer newNum = (Integer)particleSpinner.getValue();
+ int diff = newNum.intValue()-numParticles.intValue();
+ if(diff>0)
+ for(int i=0; i<diff; i++)
+ engine.addParticle();
+ else
+ for(int i=0; i>diff; i--)
+ engine.removeParticle();
+
+ numParticles=newNum;
+ }
+ if(e.getSource().equals(redSlider)) {
+ float value = (float)(redSlider.getValue());
+ value/=100;
+ engine.tendToColor.r = value;
+ }
+ if(e.getSource().equals(greenSlider)) {
+ float value = (float)(greenSlider.getValue());
+ value/=100;
+ engine.tendToColor.g = value;
+ }
+ if(e.getSource().equals(blueSlider)) {
+ float value = (float)(blueSlider.getValue());
+ value/=100;
+ engine.tendToColor.b = value;
+ }
+ }
+}
diff --git a/src/demos/particles/engine/Engine.java b/src/demos/particles/engine/Engine.java
new file mode 100755
index 0000000..62a6237
--- /dev/null
+++ b/src/demos/particles/engine/Engine.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2006 Ben Chappell (bwchappell@gmail.com) All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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.
+ *
+ * The names of Ben Chappell, Sun Microsystems, Inc. or the names of
+ * contributors may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. BEN CHAPPELL,
+ * SUN MICROSYSTEMS, INC. ("SUN"), AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL BEN
+ * CHAPPELL, SUN, OR SUN'S LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
+ * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
+ * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF BEN
+ * CHAPPELL OR SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ */
+
+package demos.particles.engine;
+
+import javax.media.opengl.*;
+import com.sun.opengl.util.texture.*;
+import java.net.*;
+import java.util.*;
+import java.io.*;
+
+public class Engine {
+
+ private Texture texture;
+ private List/*<Particle>*/ particles;
+ private String path;
+ public RGBA tendToColor;
+
+ public Engine(int numParticles, String path) {
+ this.path=path;
+
+ tendToColor = new RGBA(1.0f, 1.0f, 1.0f, 1.0f);
+
+ particles = new ArrayList/*<Particle>*/(numParticles);
+ for(int i=0; i<numParticles; i++)
+ particles.add(new Particle());
+ }
+
+ public void addParticle() {
+ particles.add(new Particle());
+ }
+
+ public void removeParticle() {
+ if(particles.size()-1 >= 0)
+ particles.remove(particles.size()-1);
+ }
+
+ public void draw(GL gl) {
+
+ gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
+ gl.glLoadIdentity();
+
+ for(int i=0; i<particles.size(); i++) {
+ ((Particle) particles.get(i)).draw(gl, texture, tendToColor);
+ }
+ }
+
+ public void init() {
+ try {
+ ClassLoader c1 = this.getClass().getClassLoader();
+ URL url = c1.getResource(path);
+ texture = TextureIO.newTexture(url, false, null);
+ texture.enable();
+ }
+ catch(IOException e) {
+ e.printStackTrace();
+ }
+ catch(GLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void reset() {
+ int numParticles = particles.size();
+ particles = new ArrayList/*<Particle>*/(numParticles);
+ for(int i=0; i<numParticles; i++)
+ particles.add(new Particle());
+ }
+
+}
diff --git a/src/demos/particles/engine/GLComponent.java b/src/demos/particles/engine/GLComponent.java
new file mode 100755
index 0000000..299578f
--- /dev/null
+++ b/src/demos/particles/engine/GLComponent.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2006 Ben Chappell (bwchappell@gmail.com) All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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.
+ *
+ * The names of Ben Chappell, Sun Microsystems, Inc. or the names of
+ * contributors may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. BEN CHAPPELL,
+ * SUN MICROSYSTEMS, INC. ("SUN"), AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL BEN
+ * CHAPPELL, SUN, OR SUN'S LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
+ * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
+ * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF BEN
+ * CHAPPELL OR SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ */
+
+package demos.particles.engine;
+
+import javax.media.opengl.*;
+import javax.media.opengl.glu.*;
+import com.sun.opengl.util.*;
+
+import java.io.*;
+
+public class GLComponent extends GLCanvas implements GLEventListener {
+
+ private GLU glu;
+ private FPSAnimator animator;
+ private RGBA background;
+ private RGBA ambient;
+ private Engine engine;
+
+ public GLComponent(int fps, RGBA ambient, RGBA background, Engine engine) {
+ super(getCapabilities());
+ addGLEventListener(this);
+ glu = new GLU();
+
+ this.background=background;
+ this.ambient=ambient;
+ this.engine=engine;
+
+ animator = new FPSAnimator(this, fps);
+ }
+
+ private static GLCapabilities getCapabilities() {
+ GLCapabilities caps = new GLCapabilities();
+ caps.setDoubleBuffered(true);
+ caps.setHardwareAccelerated(true);
+ return caps;
+ }
+
+ public void display(GLAutoDrawable drawable) {
+ final GL gl = drawable.getGL();
+ engine.draw(gl);
+ }
+
+
+
+ public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {
+
+ }
+
+ public void init(GLAutoDrawable drawable) {
+ final GL gl = drawable.getGL();
+
+ gl.glShadeModel(GL.GL_SMOOTH);
+ // Set the background / clear color.
+ gl.glClearColor(background.r, background.g, background.b, background.a);
+ // Clear the depth
+ gl.glClearDepth(1.0);
+ // Disable depth testing.
+ gl.glDisable(GL.GL_DEPTH_TEST);
+ // Enable blending and specify blening function.
+ gl.glEnable(GL.GL_BLEND);
+ gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE);
+ // Get nice perspective calculations.
+ gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
+ // Nice point smoothing.
+ gl.glHint(GL.GL_POINT_SMOOTH_HINT, GL.GL_NICEST);
+ // Enable texture mapping.
+ gl.glEnable(GL.GL_TEXTURE_2D);
+
+ animator.start();
+
+ engine.init();
+
+ }
+
+ public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
+ GL gl = drawable.getGL();
+ // the size of openGL
+ gl.glViewport(0,0, width, height);
+
+ // perspective view (smaller for further behind)
+ gl.glMatrixMode(GL.GL_PROJECTION);
+ gl.glLoadIdentity();
+
+ // perspective
+ double ratio = (double)width/(double)height;
+ // angle, ratio, nearest, farthest
+ glu.gluPerspective(45.0, ratio, 0.0, 1.0);
+
+ // draw into the model matrix now
+ gl.glMatrixMode(GL.GL_MODELVIEW);
+ gl.glLoadIdentity();
+ }
+
+ public void setFPS(int fps) {
+ animator.stop();
+ animator = new FPSAnimator(this, fps);
+ animator.start();
+ }
+
+ public void kill() {
+ animator.stop();
+ }
+}
diff --git a/src/demos/particles/engine/Particle.java b/src/demos/particles/engine/Particle.java
new file mode 100755
index 0000000..82e0756
--- /dev/null
+++ b/src/demos/particles/engine/Particle.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2006 Ben Chappell (bwchappell@gmail.com) All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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.
+ *
+ * The names of Ben Chappell, Sun Microsystems, Inc. or the names of
+ * contributors may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. BEN CHAPPELL,
+ * SUN MICROSYSTEMS, INC. ("SUN"), AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL BEN
+ * CHAPPELL, SUN, OR SUN'S LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
+ * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
+ * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF BEN
+ * CHAPPELL OR SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ */
+
+package demos.particles.engine;
+
+import com.sun.opengl.util.texture.*;
+
+import javax.media.opengl.*;
+
+public class Particle {
+ private XYZ currentPos;
+ private RGBA rgba;
+
+ public Particle() {
+ currentPos = new XYZ((float)Math.random(),
+ (float)Math.random(),
+ -30.0f
+ );
+
+ rgba = rgba = new RGBA((float)Math.random(),
+ (float)Math.random(),
+ (float)Math.random(),
+ (float)Math.random());
+ }
+
+ public void draw(GL gl, Texture texture, RGBA tendToColor) {
+ adjust(tendToColor);
+ texture.bind();
+ gl.glColor4f(rgba.r,rgba.g,rgba.b,rgba.a);
+
+ gl.glBegin(GL.GL_QUADS);
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(currentPos.x, currentPos.y-2, currentPos.z);
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(currentPos.x+2, currentPos.y-2, currentPos.z);
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(currentPos.x+2, currentPos.y, currentPos.z);
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(currentPos.x, currentPos.y, currentPos.z);
+ gl.glEnd();
+ }
+
+ private void tendToColor(RGBA tendToColor) {
+ float red = 0.0f;
+ float blue = 0.0f;
+ float green = 0.0f;
+ float sign=1.0f;
+
+ if(Math.random()>=0.5)
+ sign=-1.0f;
+
+ // RED
+ if(tendToColor.r <= 1-tendToColor.r)
+ red = tendToColor.r;
+ else
+ red = 1-tendToColor.r;
+
+ red = (float)(Math.random()*red*sign+tendToColor.r);
+
+ // GREEN
+ if(tendToColor.g <= 1-tendToColor.g)
+ green = tendToColor.g;
+ else
+ green = 1-tendToColor.g;
+
+ green =(float)(Math.random()*green*sign+tendToColor.g);
+
+ // BLUE
+ if(tendToColor.b <= 1-tendToColor.b)
+ blue = tendToColor.b;
+ else
+ blue = 1-tendToColor.b;
+
+ blue = (float)(Math.random()*blue*sign+tendToColor.b);
+
+ rgba = new RGBA(red, green, blue, (float)Math.random());
+ }
+
+ private void tendToPos() {
+ XYZ xyz = new XYZ((float)Math.random()-0.5f,(float)Math.random()-0.5f,(float)Math.random()-0.5f);
+ currentPos.add(xyz);
+ }
+
+ private void adjust(RGBA tendToColor) {
+ tendToPos();
+
+ rgba.a-=Math.random()/100;
+ if(rgba.a<=0)
+ tendToColor(tendToColor);
+ }
+
+}
diff --git a/src/demos/particles/engine/RGBA.java b/src/demos/particles/engine/RGBA.java
new file mode 100755
index 0000000..06f8863
--- /dev/null
+++ b/src/demos/particles/engine/RGBA.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2006 Ben Chappell (bwchappell@gmail.com) All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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.
+ *
+ * The names of Ben Chappell, Sun Microsystems, Inc. or the names of
+ * contributors may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. BEN CHAPPELL,
+ * SUN MICROSYSTEMS, INC. ("SUN"), AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL BEN
+ * CHAPPELL, SUN, OR SUN'S LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
+ * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
+ * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF BEN
+ * CHAPPELL OR SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ */
+
+package demos.particles.engine;
+
+public class RGBA {
+
+ public float r;
+ public float g;
+ public float b;
+ public float a;
+
+ public RGBA() {
+ this.r = this.g = this.g = this.a = 0.0f;
+ }
+
+ public RGBA(float r, float g, float b, float a) {
+ this.r=r;
+ this.g=g;
+ this.b=b;
+ this.a=a;
+ }
+}
diff --git a/src/demos/particles/engine/XYZ.java b/src/demos/particles/engine/XYZ.java
new file mode 100755
index 0000000..f38a6fa
--- /dev/null
+++ b/src/demos/particles/engine/XYZ.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2006 Ben Chappell (bwchappell@gmail.com) All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistribution of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistribution 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.
+ *
+ * The names of Ben Chappell, Sun Microsystems, Inc. or the names of
+ * contributors may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
+ * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
+ * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. BEN CHAPPELL,
+ * SUN MICROSYSTEMS, INC. ("SUN"), AND SUN'S LICENSORS SHALL NOT BE LIABLE FOR
+ * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
+ * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL BEN
+ * CHAPPELL, SUN, OR SUN'S LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
+ * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
+ * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF BEN
+ * CHAPPELL OR SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use
+ * in the design, construction, operation or maintenance of any nuclear
+ * facility.
+ */
+
+package demos.particles.engine;
+
+public class XYZ {
+
+ public float x;
+ public float y;
+ public float z;
+
+ public XYZ() {
+ this.x = this.y = this.z = 0.0f;
+ }
+
+ public XYZ(float x, float y, float z) {
+ this.x=x;
+ this.y=y;
+ this.z=z;
+ }
+
+ public XYZ add(XYZ xyz) {
+ x += xyz.x;
+ y += xyz.y;
+ z += xyz.z;
+
+ return this;
+ }
+}
diff --git a/src/demos/particles/engine/images/particle.jpg b/src/demos/particles/engine/images/particle.jpg
new file mode 100755
index 0000000..70e28ac
--- /dev/null
+++ b/src/demos/particles/engine/images/particle.jpg
Binary files differ