Merge lp:~mc-return/compiz/compiz.merge-fix1106270-showmouse-plugin-needs-port-to-GLES into lp:compiz/0.9.9

Proposed by MC Return
Status: Merged
Approved by: Timo Jyrinki
Approved revision: 3591
Merged at revision: 3590
Proposed branch: lp:~mc-return/compiz/compiz.merge-fix1106270-showmouse-plugin-needs-port-to-GLES
Merge into: lp:compiz/0.9.9
Diff against target: 506 lines (+176/-213)
5 files modified
debian/compiz-plugins.install.armel (+2/-0)
debian/compiz-plugins.install.armhf (+2/-0)
plugins/CMakeLists.txt (+0/-1)
plugins/showmouse/src/showmouse.cpp (+164/-197)
plugins/showmouse/src/showmouse.h (+8/-15)
To merge this branch: bzr merge lp:~mc-return/compiz/compiz.merge-fix1106270-showmouse-plugin-needs-port-to-GLES
Reviewer Review Type Date Requested Status
Timo Jyrinki Approve
Michail Bitzes (community) Approve
MC Return Needs Resubmitting
Sam Spilsbury Approve
PS Jenkins bot continuous-integration Pending
Review via email: mp+145069@code.launchpad.net

Commit message

Showmouse plugin OpenGL|ES port.

Thanks go to Michail Bitzes for porting Firepaint first,
as those 2 plugins share a lot of code, his work made this
job here possible in the first place.

Build showmouse for OpenGL|ES as well.
Also install showmouse on armel and armhf.

(LP: #1106270)

To post a comment you must log in.
Revision history for this message
Sam Spilsbury (smspillaz) wrote :

Again, well done, thanks for the effort.

The only things I would point out are:

1. You probably need to update .install.armhf too (only .install.armel is updated)
2. Coding style: spaces between both brackets () and operators foo + bar not foo+ bar

Revision history for this message
Sam Spilsbury (smspillaz) :
review: Needs Fixing
3588. By MC Return

Also install showmouse on armhf

3589. By MC Return

Hopefully fixed coding style

Revision history for this message
MC Return (mc-return) wrote :

> Again, well done, thanks for the effort.
>
Most credit in this case goes to Michail Bitzes.

> The only things I would point out are:
>
> 1. You probably need to update .install.armhf too (only .install.armel is
> updated)

Seems I forgot to save the file before the commit. Thanks for noticing. Fixed.

> 2. Coding style: spaces between both brackets () and operators foo + bar not
> foo+ bar

I hope I got them all. We need to fix those for firepaint as well then, seems
they slipped through there as well...

review: Needs Resubmitting
Revision history for this message
Sam Spilsbury (smspillaz) wrote :

Not able to test it at the moment but code wise this is a +1 from me.

review: Approve
Revision history for this message
Michail Bitzes (bitzesmichail) wrote :

Line 83 in showmouse.cpp:

I think it's:
      if (particles.size () * 6 * 3 > vertices_cache.size ())
Not:
      if (particles.size () > vertices_cache.size ())

vertices_cache needs space for 6 vertices, 3 for each triangle(2 triangles per particle), each vertex is stored as 3 GLfloats.

It could be inverted like that(and similarly for the rest caches):
      if (vertices_cache.size () < particles.size () * 6 * 3)
it makes reading it a bit clearer.

review: Needs Fixing
3590. By MC Return

Fixed wrong calculation in if condition, vertices_cache needs place for 6 vertices
(3 for each triangle, 2 triangles per particle)
Also inverted the statements in the if conditions checking cache_size to improve
readability
Credits & thanks (once again): Michail Bitzes

3591. By MC Return

Fixed indentation

Revision history for this message
MC Return (mc-return) wrote :

> Line 83 in showmouse.cpp:
>
> I think it's:
> if (particles.size () * 6 * 3 > vertices_cache.size ())
> Not:
> if (particles.size () > vertices_cache.size ())
>
> vertices_cache needs space for 6 vertices, 3 for each triangle(2 triangles per
> particle), each vertex is stored as 3 GLfloats.
>
> It could be inverted like that(and similarly for the rest caches):
> if (vertices_cache.size () < particles.size () * 6 * 3)
> it makes reading it a bit clearer.

Hopefully fixed now. :) Thanks for noticing.
Michail, could you (and do you want to) do some wizard GLES magic as well ?

review: Needs Resubmitting
Revision history for this message
Michail Bitzes (bitzesmichail) wrote :

Yes, I will look at wizard soon.

You can also fix the C++-style comments in showmouse.cpp, there are several, including the ones in my code ("//first triangle" etc)

(http://wiki.compiz.org/Development/CodingStyle says that only /* */ comments should be used)

Revision history for this message
MC Return (mc-return) wrote :

> Yes, I will look at wizard soon.
>
Cool, that are awesome news :)

> You can also fix the C++-style comments in showmouse.cpp, there are several,
> including the ones in my code ("//first triangle" etc)
>
> (http://wiki.compiz.org/Development/CodingStyle says that only /* */ comments
> should be used)
I think it is no big deal to use "//" comments for one-liners, not sure if those
really need fixing...

Revision history for this message
Michail Bitzes (bitzesmichail) :
review: Approve
Revision history for this message
Timo Jyrinki (timo-jyrinki) wrote :

Looks and builds fine for me.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'debian/compiz-plugins.install.armel'
--- debian/compiz-plugins.install.armel 2013-01-24 08:14:41 +0000
+++ debian/compiz-plugins.install.armel 2013-01-27 19:37:21 +0000
@@ -33,6 +33,8 @@
33debian/tmp/usr/*/compiz/*shelf.*33debian/tmp/usr/*/compiz/*shelf.*
34debian/tmp/usr/*/compiz/*shift.*34debian/tmp/usr/*/compiz/*shift.*
35debian/tmp/usr/*/compiz/*showdesktop.*35debian/tmp/usr/*/compiz/*showdesktop.*
36debian/tmp/usr/*/compiz/*showmouse.*
37debian/tmp/usr/share/compiz/showmouse
36debian/tmp/usr/*/compiz/*switcher.*38debian/tmp/usr/*/compiz/*switcher.*
37debian/tmp/usr/*/compiz/*text.*39debian/tmp/usr/*/compiz/*text.*
38debian/tmp/usr/*/compiz/*titleinfo.*40debian/tmp/usr/*/compiz/*titleinfo.*
3941
=== modified file 'debian/compiz-plugins.install.armhf'
--- debian/compiz-plugins.install.armhf 2013-01-24 08:14:41 +0000
+++ debian/compiz-plugins.install.armhf 2013-01-27 19:37:21 +0000
@@ -33,6 +33,8 @@
33debian/tmp/usr/*/compiz/*shelf.*33debian/tmp/usr/*/compiz/*shelf.*
34debian/tmp/usr/*/compiz/*shift.*34debian/tmp/usr/*/compiz/*shift.*
35debian/tmp/usr/*/compiz/*showdesktop.*35debian/tmp/usr/*/compiz/*showdesktop.*
36debian/tmp/usr/*/compiz/*showmouse.*
37debian/tmp/usr/share/compiz/showmouse
36debian/tmp/usr/*/compiz/*switcher.*38debian/tmp/usr/*/compiz/*switcher.*
37debian/tmp/usr/*/compiz/*text.*39debian/tmp/usr/*/compiz/*text.*
38debian/tmp/usr/*/compiz/*titleinfo.*40debian/tmp/usr/*/compiz/*titleinfo.*
3941
=== modified file 'plugins/CMakeLists.txt'
--- plugins/CMakeLists.txt 2013-01-20 11:15:20 +0000
+++ plugins/CMakeLists.txt 2013-01-27 19:37:21 +0000
@@ -46,7 +46,6 @@
46 set (COMPIZ_DISABLE_PLUGIN_BENCH ON)46 set (COMPIZ_DISABLE_PLUGIN_BENCH ON)
47 set (COMPIZ_DISABLE_PLUGIN_SHOWREPAINT ON)47 set (COMPIZ_DISABLE_PLUGIN_SHOWREPAINT ON)
48 set (COMPIZ_DISABLE_PLUGIN_WIDGET ON)48 set (COMPIZ_DISABLE_PLUGIN_WIDGET ON)
49 set (COMPIZ_DISABLE_PLUGIN_SHOWMOUSE ON)
50 set (COMPIZ_DISABLE_PLUGIN_SPLASH ON)49 set (COMPIZ_DISABLE_PLUGIN_SPLASH ON)
51 set (COMPIZ_DISABLE_PLUGIN_THUMBNAIL ON)50 set (COMPIZ_DISABLE_PLUGIN_THUMBNAIL ON)
52 set (COMPIZ_DISABLE_PLUGIN_WIZARD ON)51 set (COMPIZ_DISABLE_PLUGIN_WIZARD ON)
5352
=== modified file 'plugins/showmouse/src/showmouse.cpp'
--- plugins/showmouse/src/showmouse.cpp 2013-01-07 19:48:41 +0000
+++ plugins/showmouse/src/showmouse.cpp 2013-01-27 19:37:21 +0000
@@ -84,20 +84,10 @@
84 darken = 0;84 darken = 0;
8585
86 // Initialize cache86 // Initialize cache
87 vertices_cache.cache = NULL;87 vertices_cache.clear ();
88 colors_cache.cache = NULL;88 coords_cache.clear ();
89 coords_cache.cache = NULL;89 colors_cache.clear ();
90 dcolors_cache.cache = NULL;90 dcolors_cache.clear ();
91
92 vertices_cache.count = 0;
93 colors_cache.count = 0;
94 coords_cache.count = 0;
95 dcolors_cache.count = 0;
96
97 vertices_cache.size = 0;
98 colors_cache.size = 0;
99 coords_cache.size = 0;
100 dcolors_cache.size = 0;
10191
102 for (int i = 0; i < f_numParticles; i++)92 for (int i = 0; i < f_numParticles; i++)
103 {93 {
@@ -108,14 +98,23 @@
108}98}
10999
110void100void
111ParticleSystem::drawParticles ()101ParticleSystem::drawParticles (const GLMatrix &transform)
112{102{
113 GLfloat *dcolors;103 int i, j, k, l;
114 GLfloat *vertices;104
115 GLfloat *coords;105 /* Check that the cache is big enough */
116 GLfloat *colors;106 if (vertices_cache.size () < particles.size () * 6 * 3)
117107 vertices_cache.resize (particles.size () * 6 * 3);
118 glPushMatrix ();108
109 if (coords_cache.size () < particles.size () * 6 * 2)
110 coords_cache.resize (particles.size () * 6 * 2);
111
112 if (colors_cache.size () < particles.size () * 6 * 4)
113 colors_cache.resize (particles.size () * 6 * 4);
114
115 if (darken > 0)
116 if (dcolors_cache.size () < particles.size () * 6 * 4)
117 dcolors_cache.resize (particles.size () * 6 * 4);
119118
120 glEnable (GL_BLEND);119 glEnable (GL_BLEND);
121120
@@ -125,172 +124,171 @@
125 glEnable (GL_TEXTURE_2D);124 glEnable (GL_TEXTURE_2D);
126 }125 }
127126
128 glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);127 i = j = k = l = 0;
129128
130 /* Check that the cache is big enough */129 /* use 2 triangles per particle */
131
132 if (particles.size () > vertices_cache.count)
133 {
134 vertices_cache.cache = (GLfloat *) realloc (vertices_cache.cache,
135 particles.size () * 4 * 3 *
136 sizeof (GLfloat));
137 vertices_cache.size = particles.size () * 4 * 3;
138 vertices_cache.count = particles.size ();
139 }
140
141 if (particles.size () > coords_cache.count)
142 {
143 coords_cache.cache = (GLfloat *) realloc (coords_cache.cache,
144 particles.size () * 4 * 2 *
145 sizeof (GLfloat));
146 coords_cache.size = particles.size () * 4 * 2;
147 coords_cache.count = particles.size ();
148 }
149
150 if (particles.size () > colors_cache.count)
151 {
152 colors_cache.cache = (GLfloat *) realloc (colors_cache.cache,
153 particles.size () * 4 * 4 *
154 sizeof (GLfloat));
155 colors_cache.size = particles.size () * 4 * 4;
156 colors_cache.count = particles.size ();
157 }
158
159 if (darken > 0)
160 {
161 if (dcolors_cache.count < particles.size ())
162 {
163 dcolors_cache.cache = (GLfloat *) realloc (dcolors_cache.cache,
164 particles.size () * 4 * 4 *
165 sizeof (GLfloat));
166 dcolors_cache.size = particles.size () * 4 * 4;
167 dcolors_cache.count = particles.size ();
168 }
169 }
170
171 dcolors = dcolors_cache.cache;
172 vertices = vertices_cache.cache;
173 coords = coords_cache.cache;
174 colors = colors_cache.cache;
175
176 int numActive = 0;
177
178 foreach (Particle &part, particles)130 foreach (Particle &part, particles)
179 {131 {
180 if (part.life > 0.0f)132 if (part.life > 0.0f)
181 {133 {
182 numActive += 4;
183
184 float w = part.width / 2;134 float w = part.width / 2;
185 float h = part.height / 2;135 float h = part.height / 2;
186136
137 GLushort r, g, b, a, dark_a;
138
139 r = part.r * 65535.0f;
140 g = part.g * 65535.0f;
141 b = part.b * 65535.0f;
142 a = part.life * part.a * 65535.0f;
143 dark_a = part.life * part.a * darken * 65535.0f;
144
187 w += (w * part.w_mod) * part.life;145 w += (w * part.w_mod) * part.life;
188 h += (h * part.h_mod) * part.life;146 h += (h * part.h_mod) * part.life;
189147
190 vertices[0] = part.x - w;148 //first triangle
191 vertices[1] = part.y - h;149 vertices_cache[i + 0] = part.x - w;
192 vertices[2] = part.z;150 vertices_cache[i + 1] = part.y - h;
193151 vertices_cache[i + 2] = part.z;
194 vertices[3] = part.x - w;152
195 vertices[4] = part.y + h;153 vertices_cache[i + 3] = part.x - w;
196 vertices[5] = part.z;154 vertices_cache[i + 4] = part.y + h;
197155 vertices_cache[i + 5] = part.z;
198 vertices[6] = part.x + w;156
199 vertices[7] = part.y + h;157 vertices_cache[i + 6] = part.x + w;
200 vertices[8] = part.z;158 vertices_cache[i + 7] = part.y + h;
201159 vertices_cache[i + 8] = part.z;
202 vertices[9] = part.x + w;160
203 vertices[10] = part.y - h;161 //second triangle
204 vertices[11] = part.z;162 vertices_cache[i + 9] = part.x + w;
205163 vertices_cache[i + 10] = part.y + h;
206 vertices += 12;164 vertices_cache[i + 11] = part.z;
207165
208 coords[0] = 0.0;166 vertices_cache[i + 12] = part.x + w;
209 coords[1] = 0.0;167 vertices_cache[i + 13] = part.y - h;
210168 vertices_cache[i + 14] = part.z;
211 coords[2] = 0.0;169
212 coords[3] = 1.0;170 vertices_cache[i + 15] = part.x - w;
213171 vertices_cache[i + 16] = part.y - h;
214 coords[4] = 1.0;172 vertices_cache[i + 17] = part.z;
215 coords[5] = 1.0;173
216174 i += 18;
217 coords[6] = 1.0;175
218 coords[7] = 0.0;176 coords_cache[j + 0] = 0.0;
219177 coords_cache[j + 1] = 0.0;
220 coords += 8;178
221179 coords_cache[j + 2] = 0.0;
222 colors[0] = part.r;180 coords_cache[j + 3] = 1.0;
223 colors[1] = part.g;181
224 colors[2] = part.b;182 coords_cache[j + 4] = 1.0;
225 colors[3] = part.life * part.a;183 coords_cache[j + 5] = 1.0;
226 colors[4] = part.r;184
227 colors[5] = part.g;185 //second
228 colors[6] = part.b;186 coords_cache[j + 6] = 1.0;
229 colors[7] = part.life * part.a;187 coords_cache[j + 7] = 1.0;
230 colors[8] = part.r;188
231 colors[9] = part.g;189 coords_cache[j + 8] = 1.0;
232 colors[10] = part.b;190 coords_cache[j + 9] = 0.0;
233 colors[11] = part.life * part.a;191
234 colors[12] = part.r;192 coords_cache[j + 10] = 0.0;
235 colors[13] = part.g;193 coords_cache[j + 11] = 0.0;
236 colors[14] = part.b;194
237 colors[15] = part.life * part.a;195 j += 12;
238196
239 colors += 16;197 colors_cache[k + 0] = r;
240198 colors_cache[k + 1] = g;
241 if (darken > 0)199 colors_cache[k + 2] = b;
200 colors_cache[k + 3] = a;
201
202 colors_cache[k + 4] = r;
203 colors_cache[k + 5] = g;
204 colors_cache[k + 6] = b;
205 colors_cache[k + 7] = a;
206
207 colors_cache[k + 8] = r;
208 colors_cache[k + 9] = g;
209 colors_cache[k + 10] = b;
210 colors_cache[k + 11] = a;
211
212 //second
213 colors_cache[k + 12] = r;
214 colors_cache[k + 13] = g;
215 colors_cache[k + 14] = b;
216 colors_cache[k + 15] = a;
217
218 colors_cache[k + 16] = r;
219 colors_cache[k + 17] = g;
220 colors_cache[k + 18] = b;
221 colors_cache[k + 19] = a;
222
223 colors_cache[k + 20] = r;
224 colors_cache[k + 21] = g;
225 colors_cache[k + 22] = b;
226 colors_cache[k + 23] = a;
227
228 k += 24;
229
230 if(darken > 0)
242 {231 {
243232 dcolors_cache[l + 0] = r;
244 dcolors[0] = part.r;233 dcolors_cache[l + 1] = g;
245 dcolors[1] = part.g;234 dcolors_cache[l + 2] = b;
246 dcolors[2] = part.b;235 dcolors_cache[l + 3] = dark_a;
247 dcolors[3] = part.life * part.a * darken;236
248 dcolors[4] = part.r;237 dcolors_cache[l + 4] = r;
249 dcolors[5] = part.g;238 dcolors_cache[l + 5] = g;
250 dcolors[6] = part.b;239 dcolors_cache[l + 6] = b;
251 dcolors[7] = part.life * part.a * darken;240 dcolors_cache[l + 7] = dark_a;
252 dcolors[8] = part.r;241
253 dcolors[9] = part.g;242 dcolors_cache[l + 8] = r;
254 dcolors[10] = part.b;243 dcolors_cache[l + 9] = g;
255 dcolors[11] = part.life * part.a * darken;244 dcolors_cache[l + 10] = b;
256 dcolors[12] = part.r;245 dcolors_cache[l + 11] = dark_a;
257 dcolors[13] = part.g;246
258 dcolors[14] = part.b;247 //second
259 dcolors[15] = part.life * part.a * darken;248 dcolors_cache[l + 12] = r;
260249 dcolors_cache[l + 13] = g;
261 dcolors += 16;250 dcolors_cache[l + 14] = b;
251 dcolors_cache[l + 15] = dark_a;
252
253 dcolors_cache[l + 16] = r;
254 dcolors_cache[l + 17] = g;
255 dcolors_cache[l + 18] = b;
256 dcolors_cache[l + 19] = dark_a;
257
258 dcolors_cache[l + 20] = r;
259 dcolors_cache[l + 21] = g;
260 dcolors_cache[l + 22] = b;
261 dcolors_cache[l + 23] = dark_a;
262
263 l += 24;
262 }264 }
263 }265 }
264 }266 }
265 glEnableClientState (GL_VERTEX_ARRAY);267
266 glEnableClientState (GL_TEXTURE_COORD_ARRAY);268 GLVertexBuffer *stream = GLVertexBuffer::streamingBuffer ();
267 glEnableClientState (GL_COLOR_ARRAY);
268
269 glTexCoordPointer (2, GL_FLOAT, 2 * sizeof (GLfloat), coords_cache.cache);
270 glVertexPointer (3, GL_FLOAT, 3 * sizeof (GLfloat), vertices_cache.cache);
271
272 // darken the background
273269
274 if (darken > 0)270 if (darken > 0)
275 {271 {
276 glBlendFunc (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);272 glBlendFunc (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
277 glColorPointer (4, GL_FLOAT, 4 * sizeof (GLfloat), dcolors_cache.cache);273 stream->begin (GL_TRIANGLES);
278 glDrawArrays (GL_QUADS, 0, numActive);274 stream->addVertices (i / 3, &vertices_cache[0]);
275 stream->addTexCoords (0, j / 2, &coords_cache[0]);
276 stream->addColors (l / 4, &dcolors_cache[0]);
277
278 if (stream->end ())
279 stream->render (transform);
279 }280 }
280281
281 // draw particles282 // draw particles
282 glBlendFunc (GL_SRC_ALPHA, blendMode);283 glBlendFunc (GL_SRC_ALPHA, blendMode);
283284 stream->begin (GL_TRIANGLES);
284 glColorPointer (4, GL_FLOAT, 4 * sizeof (GLfloat), colors_cache.cache);285
285 glDrawArrays (GL_QUADS, 0, numActive);286 stream->addVertices (i / 3, &vertices_cache[0]);
286 glDisableClientState (GL_COLOR_ARRAY);287 stream->addTexCoords (0, j / 2, &coords_cache[0]);
287 glDisableClientState (GL_TEXTURE_COORD_ARRAY);288 stream->addColors (k / 4, &colors_cache[0]);
288 glDisableClientState (GL_VERTEX_ARRAY);289
289290 if (stream->end ())
290 glPopMatrix ();291 stream->render (transform);
291 glColor4usv (defaultColor);
292
293 GLScreen::get(screen)->setTexEnvMode (GL_REPLACE); // ???
294292
295 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);293 glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
296 glDisable (GL_TEXTURE_2D);294 glDisable (GL_TEXTURE_2D);
@@ -333,30 +331,6 @@
333331
334 if (tex)332 if (tex)
335 glDeleteTextures (1, &tex);333 glDeleteTextures (1, &tex);
336
337 if (vertices_cache.cache)
338 {
339 free (vertices_cache.cache);
340 vertices_cache.cache = NULL;
341 }
342
343 if (colors_cache.cache)
344 {
345 free (colors_cache.cache);
346 colors_cache.cache = NULL;
347 }
348
349 if (coords_cache.cache)
350 {
351 free (coords_cache.cache);
352 coords_cache.cache = NULL;
353 }
354
355 if (dcolors_cache.cache)
356 {
357 free (dcolors_cache.cache);
358 dcolors_cache.cache = NULL;
359 }
360}334}
361335
362static void336static void
@@ -591,14 +565,7 @@
591565
592 sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA);566 sTransform.toScreenSpace (output, -DEFAULT_Z_CAMERA);
593567
594 glPushMatrix ();568 ps.drawParticles (sTransform);
595 glLoadMatrixf (sTransform.getMatrix ());
596
597 ps.drawParticles ();
598
599 glPopMatrix();
600
601 glColor4usv (defaultColor);
602569
603 return status;570 return status;
604}571}
605572
=== modified file 'plugins/showmouse/src/showmouse.h'
--- plugins/showmouse/src/showmouse.h 2012-09-04 15:33:44 +0000
+++ plugins/showmouse/src/showmouse.h 2013-01-27 19:37:21 +0000
@@ -62,15 +62,6 @@
62 float zo; /* orginal Z position */62 float zo; /* orginal Z position */
63};63};
6464
65class ParticleCache
66{
67 public:
68
69 GLfloat *cache;
70 unsigned int count;
71 unsigned int size;
72};
73
74class ParticleSystem65class ParticleSystem
75{66{
76 public:67 public:
@@ -87,17 +78,19 @@
87 float darken;78 float darken;
88 GLuint blendMode;79 GLuint blendMode;
8980
90 /* Moved from drawParticles to get rid of spurious malloc's */81 /* Cache used in drawParticles
91 ParticleCache vertices_cache;82 It's here to avoid multiple mem allocation
92 ParticleCache coords_cache;83 during drawing */
93 ParticleCache colors_cache;84 std::vector<GLfloat> vertices_cache;
94 ParticleCache dcolors_cache;85 std::vector<GLfloat> coords_cache;
86 std::vector<GLushort> colors_cache;
87 std::vector<GLushort> dcolors_cache;
9588
96 void89 void
97 initParticles (int f_numParticles);90 initParticles (int f_numParticles);
9891
99 void92 void
100 drawParticles ();93 drawParticles (const GLMatrix &transform);
10194
102 void95 void
103 updateParticles (float time);96 updateParticles (float time);

Subscribers

People subscribed via source and target branches