3 * Daniel Nelson - 9/5/0
5 * Copyright (C) 2000 Daniel Nelson
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 * Daniel Nelson - aluminumangel.org
25 * Generates the display list and textures for the little sparkles!
36 #include "Displayer.h"
38 GLuint
Displayer::sparkle_list
;
39 GLuint
Displayer::mote_textures
[DC_NUMBER_MOTE_TYPES
];
40 GLuint
Displayer::spark_texture
;
42 void Displayer::generateSparkleList ( )
44 GLfloat texture
[DC_SPARKLE_TEX_LENGTH
][DC_SPARKLE_TEX_LENGTH
][2];
46 sparkle_list
= glGenLists(1);
48 glGenTextures(DC_NUMBER_MOTE_TYPES
, mote_textures
);
49 spark_texture
= mote_textures
[MT_FOUR_POINTED_STAR
];
51 for (int n
= DC_NUMBER_MOTE_TYPES
; n
--; ) {
53 glBindTexture(GL_TEXTURE_2D
, mote_textures
[n
]);
55 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_S
, GL_REPEAT
);
56 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_WRAP_T
, GL_REPEAT
);
57 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MAG_FILTER
, GL_LINEAR
);
58 glTexParameteri(GL_TEXTURE_2D
, GL_TEXTURE_MIN_FILTER
, GL_LINEAR
);
60 for (int s
= DC_SPARKLE_TEX_LENGTH
; s
--; )
61 for (int t
= DC_SPARKLE_TEX_LENGTH
; t
--; ) {
62 float x
= s
* (2.0f
/ (float) (DC_SPARKLE_TEX_LENGTH
- 1)) - 1.0f
;
63 float y
= t
* (2.0f
/ (float) (DC_SPARKLE_TEX_LENGTH
- 1)) - 1.0f
;
64 float r
= sqrt(x
* x
+ y
* y
);
65 float a
= atan(y
/ x
);
67 if (x
< 0.0f
) a
= PI
- a
;
70 case MT_FOUR_POINTED_STAR
:
71 texture
[s
][t
][0] = 0.3f
* (1.0f
- 2.5f
* fabs(x
* x
- y
* y
))
72 * exp(-r
* r
) / sqrt(r
);
73 texture
[s
][t
][1] = 4.5f
* texture
[s
][t
][0] * sqrt(r
);
76 case MT_FIVE_POINTED_STAR
:
79 texture
[s
][t
][0] = 0.3f
* (1.0f
- 2.5f
80 * fabs(pow(r
, 2.2f
) * cos(a
) * cos(a
)
81 - pow(r
, 2.2f
) * sin(a
) * sin(a
))) * exp(-r
* r
) / sqrt(r
);
82 texture
[s
][t
][1] = 4.5f
* texture
[s
][t
][0] * sqrt(r
);
85 case MT_SIX_POINTED_STAR
:
88 texture
[s
][t
][0] = 0.3f
* (1.0f
- 2.5f
89 * fabs(pow(r
, 2.2f
) * cos(a
) * cos(a
)
90 - pow(r
, 2.2f
) * sin(a
) * sin(a
))) * exp(-r
* r
) / sqrt(r
);
91 texture
[s
][t
][1] = 4.5f
* texture
[s
][t
][0] * sqrt(r
);
97 texture
[s
][t
][0] = 0.3f
* (1.0f
- 2.5f
98 * fabs(pow(r
, 4.2f
) * cos(a
) * cos(a
)
99 - pow(r
, 4.2f
) * sin(a
) * sin(a
))) * exp(-r
* r
) / sqrt(r
);
100 texture
[s
][t
][1] = 4.5f
* texture
[s
][t
][0] * sqrt(r
);
103 case MT_MULTIPLIER_ONE_STAR
:
106 texture
[s
][t
][0] = 0.3f
* (1.0f
- 2.5f
107 * fabs(pow(r
, 1.5f
) * cos(a
) * cos(a
)
108 - pow(r
, 1.5f
) * sin(a
) * sin(a
))) * exp(-r
* r
) / sqrt(r
);
112 u
= 0.3f
* (1.0f
- 2.5f
* fabs(pow(r
, 0.7f
) * cos(a
) * cos(a
)
113 - pow(r
, 0.7f
) * sin(a
) * sin(a
))) * exp(-0.3f
* r
* r
) / sqrt(r
);
114 if (u
> 0.0f
) texture
[s
][t
][0] += u
;
115 if (texture
[s
][t
][0] > 0.5f
)
116 texture
[s
][t
][0] *= 0.3f
+ 0.7f
/ (0.5f
+ texture
[s
][t
][0]);
119 texture
[s
][t
][1] = 4.5f
* texture
[s
][t
][0] * sqrt(r
);
122 case MT_MULTIPLIER_TWO_STAR
:
123 texture
[s
][t
][0] = 0.3f
* (1.0f
- 2.5f
* fabs(x
* x
- y
* y
))
124 * exp(-r
* r
) / sqrt(r
);
127 u
= 0.3f
* (1.0f
- 2.5f
* fabs(pow(r
, 0.7f
) * cos(a
) * cos(a
)
128 - pow(r
, 0.7f
) * sin(a
) * sin(a
))) * exp(-0.1f
* r
* r
) / sqrt(r
);
129 if (u
> 0.0f
) texture
[s
][t
][0] += u
;
130 if (texture
[s
][t
][0] > 0.5f
)
131 texture
[s
][t
][0] *= 0.3f
+ 0.7f
/ (0.5f
+ texture
[s
][t
][0]);
133 texture
[s
][t
][1] = 4.5f
* texture
[s
][t
][0] * sqrt(r
);
136 case MT_MULTIPLIER_THREE_STAR
:
138 u
= 0.3f
* (1.0f
- 3.1f
* fabs(pow(r
, 0.2f
) * cos(a
) * cos(a
)
139 - pow(r
, 0.2f
) * sin(a
) * sin(a
))) * exp(-0.1f
* r
* r
) / sqrt(r
);
141 texture
[s
][t
][0] = u
;
143 texture
[s
][t
][0] = 0.0f
;
145 texture
[s
][t
][0] += 0.3f
* (1.0f
- 6.0f
* fabs(x
* x
- y
* y
))
146 * exp(-0.4 * r
* r
) / sqrt(2.0 * r
);
147 if (texture
[s
][t
][0] > 0.5f
)
148 texture
[s
][t
][0] *= 0.3f
+ 0.7f
/ (0.5f
+ texture
[s
][t
][0]);
150 texture
[s
][t
][1] = 4.5f
* texture
[s
][t
][0] * sqrt(2 * r
);
152 u
= 0.15f
* exp(-350.0f
* (r
- 0.9f
) * (r
- 0.9f
))
153 * (1.15f
+ 0.3f
* cos(4.0f
* a
));
155 if (u
> texture
[s
][t
][0]) {
156 texture
[s
][t
][0] = u
;
157 texture
[s
][t
][1] = 4.5f
* u
;
163 glTexImage2D(GL_TEXTURE_2D
, 0, GL_LUMINANCE_ALPHA
, DC_SPARKLE_TEX_LENGTH
,
164 DC_SPARKLE_TEX_LENGTH
, GL_FALSE
, GL_LUMINANCE_ALPHA
, GL_FLOAT
, texture
);
167 glNewList(sparkle_list
, GL_COMPILE
);
168 glBegin(GL_TRIANGLE_STRIP
);
170 glTexCoord2f(0.0f
, 0.0f
);
171 glVertex3f(-DC_SPARKLE_LENGTH
, -DC_SPARKLE_LENGTH
, 0.0f
);
172 glTexCoord2f(1.0f
, 0.0f
);
173 glVertex3f(DC_SPARKLE_LENGTH
, -DC_SPARKLE_LENGTH
, 0.0f
);
174 glTexCoord2f(0.0f
, 1.0f
);
175 glVertex3f(-DC_SPARKLE_LENGTH
, DC_SPARKLE_LENGTH
, 0.0f
);
176 glTexCoord2f(1.0f
, 1.0f
);
177 glVertex3f(DC_SPARKLE_LENGTH
, DC_SPARKLE_LENGTH
, 0.0f
);