summaryrefslogtreecommitdiffstats
path: root/src/demos/particles/engine/Particle.java
blob: dcba387cd6c93bae7a6174b5ee4a1552ab1580e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
 * Copyright (c) 2006 Ben Chappell. 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.jogamp.opengl.util.texture.*;

import com.jogamp.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(GL2 gl, Texture texture, RGBA tendToColor) {
    adjust(tendToColor);
    texture.bind(gl);
    gl.glColor4f(rgba.r,rgba.g,rgba.b,rgba.a);
        
    gl.glBegin(GL2.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);
  }
    
}