Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/g4tools/include/tools/glprims

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 // Copyright (C) 2010, Guy Barrand. All rights reserved.
  2 // See the file tools.license for terms.
  3 
  4 #ifndef tools_glprims
  5 #define tools_glprims
  6 
  7 //same as OpenGL GL_[POINTS,etc...], but for the case we don't have OpenGL.
  8 
  9 #include <cstddef> //size_t
 10 
 11 namespace tools {
 12 namespace gl {
 13 
 14 typedef unsigned char mode_t;
 15 
 16 inline mode_t points()         {return 0x0000;}
 17 inline mode_t lines()          {return 0x0001;} //segments
 18 inline mode_t line_loop()      {return 0x0002;}
 19 inline mode_t line_strip()     {return 0x0003;} //polyline
 20 inline mode_t triangles()      {return 0x0004;}
 21 inline mode_t triangle_strip() {return 0x0005;}
 22 inline mode_t triangle_fan()   {return 0x0006;}
 23 //inline mode_t quads()          {return 0x0007;}
 24 //inline mode_t quad_strip()     {return 0x0008;}
 25 //inline mode_t polygon()        {return 0x0009;}
 26 
 27 inline bool is_mode(mode_t a_mode) {
 28   return a_mode<=0x006?true:false;
 29 }
 30 
 31 inline bool is_line(mode_t a_mode) {
 32   if(a_mode==points())     return true; //0 sz line !
 33   if(a_mode==lines())      return true;
 34   if(a_mode==line_loop())  return true;
 35   if(a_mode==line_strip()) return true;
 36   return false;
 37 }
 38 
 39 inline void cvt_2to3(size_t a_npt,const float* a_xys,float*& a_xyzs) {
 40   const float* vpos = a_xys;
 41   float x,y;
 42   for(size_t i=0;i<a_npt;i++) {
 43     x = *vpos;vpos++;
 44     y = *vpos;vpos++;
 45     *a_xyzs = x;a_xyzs++;
 46     *a_xyzs = y;a_xyzs++;
 47     *a_xyzs = 0;a_xyzs++;
 48   }
 49 }
 50 
 51 
 52 inline void triangle_fan_to_triangles(size_t a_npt,const float* a_xyzs,float*& a_pxyzs) {
 53   // a_pxyzs = (a_npt-2)*3*3
 54 
 55   const float* vpos = a_xyzs;
 56 
 57   float x1 = *vpos;vpos++;
 58   float y1 = *vpos;vpos++;
 59   float z1 = *vpos;vpos++;
 60 
 61   float x2 = *vpos;vpos++;
 62   float y2 = *vpos;vpos++;
 63   float z2 = *vpos;vpos++;
 64 
 65   float x3,y3,z3;
 66   for(size_t i=2;i<a_npt;i++) {
 67     x3 = *vpos;vpos++;
 68     y3 = *vpos;vpos++;
 69     z3 = *vpos;vpos++;
 70     *a_pxyzs = x1;a_pxyzs++;
 71     *a_pxyzs = y1;a_pxyzs++;
 72     *a_pxyzs = z1;a_pxyzs++;
 73 
 74     *a_pxyzs = x2;a_pxyzs++;
 75     *a_pxyzs = y2;a_pxyzs++;
 76     *a_pxyzs = z2;a_pxyzs++;
 77 
 78     *a_pxyzs = x3;a_pxyzs++;
 79     *a_pxyzs = y3;a_pxyzs++;
 80     *a_pxyzs = z3;a_pxyzs++;
 81 
 82     x2 = x3;
 83     y2 = y3;
 84     z2 = z3;
 85   }
 86 
 87 }
 88 
 89 inline void triangle_fan_to_triangles_texture(size_t a_npt,const float* a_xyzs,const float* a_tcs,float*& a_pxyzs,float*& a_ptcs) {
 90   // a_pxyzs = (a_npt-2)*3*3
 91 
 92   // a_ptcs = (a_npt-2)*3*2
 93 
 94   const float* vpos = a_xyzs;
 95   const float* tpos = a_tcs;
 96 
 97   float x1 = *vpos;vpos++;
 98   float y1 = *vpos;vpos++;
 99   float z1 = *vpos;vpos++;
100 
101   float tx1 = *tpos;tpos++;
102   float ty1 = *tpos;tpos++;
103 
104   float x2 = *vpos;vpos++;
105   float y2 = *vpos;vpos++;
106   float z2 = *vpos;vpos++;
107 
108   float tx2 = *tpos;tpos++;
109   float ty2 = *tpos;tpos++;
110   
111   float x3,y3,z3,tx3,ty3;
112   for(size_t i=2;i<a_npt;i++) {
113     x3 = *vpos;vpos++;
114     y3 = *vpos;vpos++;
115     z3 = *vpos;vpos++;
116 
117     tx3 = *tpos;tpos++;
118     ty3 = *tpos;tpos++;
119     
120     *a_pxyzs = x1;a_pxyzs++;
121     *a_pxyzs = y1;a_pxyzs++;
122     *a_pxyzs = z1;a_pxyzs++;
123 
124     *a_ptcs = tx1;a_ptcs++;
125     *a_ptcs = ty1;a_ptcs++;
126 
127     *a_pxyzs = x2;a_pxyzs++;
128     *a_pxyzs = y2;a_pxyzs++;
129     *a_pxyzs = z2;a_pxyzs++;
130 
131     *a_ptcs = tx2;a_ptcs++;
132     *a_ptcs = ty2;a_ptcs++;
133     
134     *a_pxyzs = x3;a_pxyzs++;
135     *a_pxyzs = y3;a_pxyzs++;
136     *a_pxyzs = z3;a_pxyzs++;
137 
138     *a_ptcs = tx3;a_ptcs++;
139     *a_ptcs = ty3;a_ptcs++;
140     
141     x2 = x3;
142     y2 = y3;
143     z2 = z3;
144 
145     tx2 = tx3;
146     ty2 = ty3;
147   }
148 
149 }
150 
151 inline void triangle_strip_to_triangles(size_t a_npt,const float* a_xyzs,float*& a_pxyzs) {
152   // a_pxyzs = (a_npt-2)*3*3
153 
154   const float* vpos = a_xyzs;
155 
156   float x1 = *vpos;vpos++;
157   float y1 = *vpos;vpos++;
158   float z1 = *vpos;vpos++;
159 
160   float x2 = *vpos;vpos++;
161   float y2 = *vpos;vpos++;
162   float z2 = *vpos;vpos++;
163 
164   float x3,y3,z3;
165   bool flip = false;
166   for(size_t i=2;i<a_npt;i++) {
167     x3 = *vpos;vpos++;
168     y3 = *vpos;vpos++;
169     z3 = *vpos;vpos++;
170 
171     if(flip) {
172       *a_pxyzs = x1;a_pxyzs++;
173       *a_pxyzs = y1;a_pxyzs++;
174       *a_pxyzs = z1;a_pxyzs++;
175 
176       *a_pxyzs = x3;a_pxyzs++;
177       *a_pxyzs = y3;a_pxyzs++;
178       *a_pxyzs = z3;a_pxyzs++;
179 
180       *a_pxyzs = x2;a_pxyzs++;
181       *a_pxyzs = y2;a_pxyzs++;
182       *a_pxyzs = z2;a_pxyzs++;
183     } else {
184       *a_pxyzs = x1;a_pxyzs++;
185       *a_pxyzs = y1;a_pxyzs++;
186       *a_pxyzs = z1;a_pxyzs++;
187 
188       *a_pxyzs = x2;a_pxyzs++;
189       *a_pxyzs = y2;a_pxyzs++;
190       *a_pxyzs = z2;a_pxyzs++;
191 
192       *a_pxyzs = x3;a_pxyzs++;
193       *a_pxyzs = y3;a_pxyzs++;
194       *a_pxyzs = z3;a_pxyzs++;
195     }
196 
197     x1 = x2;
198     y1 = y2;
199     z1 = z2;
200 
201     x2 = x3;
202     y2 = y3;
203     z2 = z3;
204 
205     flip = flip?false:true;
206   }
207 }
208 
209 inline void triangle_strip_to_triangles_texture(size_t a_npt,const float* a_xyzs,const float* a_tcs,float*& a_pxyzs,float*& a_ptcs) {
210   // a_pxyzs = (a_npt-2)*3*3
211   // a_ptcs = (a_npt-2)*3*2
212 
213   const float* vpos = a_xyzs;
214   const float* tpos = a_tcs;
215 
216   float x1 = *vpos;vpos++;
217   float y1 = *vpos;vpos++;
218   float z1 = *vpos;vpos++;
219 
220   float tx1 = *tpos;tpos++;
221   float ty1 = *tpos;tpos++;
222   
223   float x2 = *vpos;vpos++;
224   float y2 = *vpos;vpos++;
225   float z2 = *vpos;vpos++;
226 
227   float tx2 = *tpos;tpos++;
228   float ty2 = *tpos;tpos++;
229   
230   float x3,y3,z3,tx3,ty3;
231   bool flip = false;
232   for(size_t i=2;i<a_npt;i++) {
233     x3 = *vpos;vpos++;
234     y3 = *vpos;vpos++;
235     z3 = *vpos;vpos++;
236 
237     tx3 = *tpos;tpos++;
238     ty3 = *tpos;tpos++;
239   
240     if(flip) {
241       *a_pxyzs = x1;a_pxyzs++;
242       *a_pxyzs = y1;a_pxyzs++;
243       *a_pxyzs = z1;a_pxyzs++;
244 
245       *a_ptcs = tx1;a_ptcs++;
246       *a_ptcs = ty1;a_ptcs++;
247       
248       *a_pxyzs = x3;a_pxyzs++;
249       *a_pxyzs = y3;a_pxyzs++;
250       *a_pxyzs = z3;a_pxyzs++;
251 
252       *a_ptcs = tx3;a_ptcs++;
253       *a_ptcs = ty3;a_ptcs++;
254       
255       *a_pxyzs = x2;a_pxyzs++;
256       *a_pxyzs = y2;a_pxyzs++;
257       *a_pxyzs = z2;a_pxyzs++;
258 
259       *a_ptcs = tx2;a_ptcs++;
260       *a_ptcs = ty2;a_ptcs++;
261     } else {
262       *a_pxyzs = x1;a_pxyzs++;
263       *a_pxyzs = y1;a_pxyzs++;
264       *a_pxyzs = z1;a_pxyzs++;
265 
266       *a_ptcs = tx1;a_ptcs++;
267       *a_ptcs = ty1;a_ptcs++;
268       
269       *a_pxyzs = x2;a_pxyzs++;
270       *a_pxyzs = y2;a_pxyzs++;
271       *a_pxyzs = z2;a_pxyzs++;
272 
273       *a_ptcs = tx2;a_ptcs++;
274       *a_ptcs = ty2;a_ptcs++;
275       
276       *a_pxyzs = x3;a_pxyzs++;
277       *a_pxyzs = y3;a_pxyzs++;
278       *a_pxyzs = z3;a_pxyzs++;
279       
280       *a_ptcs = tx3;a_ptcs++;
281       *a_ptcs = ty3;a_ptcs++;
282     }
283 
284     x1 = x2;
285     y1 = y2;
286     z1 = z2;
287 
288     tx1 = tx2;
289     ty1 = ty2;
290 
291     x2 = x3;
292     y2 = y3;
293     z2 = z3;
294 
295     tx2 = tx3;
296     ty2 = ty3;
297     
298     flip = flip?false:true;
299   }
300 }
301 
302 inline void triangle_fan_to_triangles_nms(size_t a_npt,const float* a_xyzs,const float* a_nms,float*& a_pxyzs,float*& a_pnms) {
303   triangle_fan_to_triangles(a_npt,a_xyzs,a_pxyzs);
304   triangle_fan_to_triangles(a_npt,a_nms,a_pnms);
305 }
306 
307 inline void triangle_strip_to_triangles_nms(size_t a_npt,const float* a_xyzs,const float* a_nms,float*& a_pxyzs,float*& a_pnms) {
308   // a_pxyzs, a_pnms = (a_npt-2)*3*3
309   triangle_strip_to_triangles(a_npt,a_xyzs,a_pxyzs);
310   triangle_strip_to_triangles(a_npt,a_nms,a_pnms);
311 }
312 
313 inline void triangle_fan_to_triangles_2to3(size_t a_npt,const float* a_xyzs,float*& a_pxyzs) {
314 
315   const float* vpos = a_xyzs;
316 
317   float x1 = *vpos;vpos++;
318   float y1 = *vpos;vpos++;
319 
320   float x2 = *vpos;vpos++;
321   float y2 = *vpos;vpos++;
322 
323   float x3,y3;
324   for(size_t i=2;i<a_npt;i++) {
325     x3 = *vpos;vpos++;
326     y3 = *vpos;vpos++;
327 
328     *a_pxyzs = x1;a_pxyzs++;
329     *a_pxyzs = y1;a_pxyzs++;
330     *a_pxyzs = 0;a_pxyzs++;
331 
332     *a_pxyzs = x2;a_pxyzs++;
333     *a_pxyzs = y2;a_pxyzs++;
334     *a_pxyzs = 0;a_pxyzs++;
335 
336     *a_pxyzs = x3;a_pxyzs++;
337     *a_pxyzs = y3;a_pxyzs++;
338     *a_pxyzs = 0;a_pxyzs++;
339 
340     x2 = x3;
341     y2 = y3;
342   }
343 
344 }
345 
346 inline void triangle_strip_to_triangles_2to3(size_t a_npt,const float* a_xyzs,float*& a_pxyzs) {
347 
348   const float* vpos = a_xyzs;
349 
350   float x1 = *vpos;vpos++;
351   float y1 = *vpos;vpos++;
352 
353   float x2 = *vpos;vpos++;
354   float y2 = *vpos;vpos++;
355 
356   float x3,y3;
357   bool flip = false;
358   for(size_t i=2;i<a_npt;i++) {
359     x3 = *vpos;vpos++;
360     y3 = *vpos;vpos++;
361 
362     if(flip) {
363       *a_pxyzs = x1;a_pxyzs++;
364       *a_pxyzs = y1;a_pxyzs++;
365       *a_pxyzs = 0;a_pxyzs++;
366 
367       *a_pxyzs = x3;a_pxyzs++;
368       *a_pxyzs = y3;a_pxyzs++;
369       *a_pxyzs = 0;a_pxyzs++;
370 
371       *a_pxyzs = x2;a_pxyzs++;
372       *a_pxyzs = y2;a_pxyzs++;
373       *a_pxyzs = 0;a_pxyzs++;
374     } else {
375       *a_pxyzs = x1;a_pxyzs++;
376       *a_pxyzs = y1;a_pxyzs++;
377       *a_pxyzs = 0;a_pxyzs++;
378 
379       *a_pxyzs = x2;a_pxyzs++;
380       *a_pxyzs = y2;a_pxyzs++;
381       *a_pxyzs = 0;a_pxyzs++;
382 
383       *a_pxyzs = x3;a_pxyzs++;
384       *a_pxyzs = y3;a_pxyzs++;
385       *a_pxyzs = 0;a_pxyzs++;
386     }
387 
388     x1 = x2;
389     y1 = y2;
390 
391     x2 = x3;
392     y2 = y3;
393 
394     flip = flip?false:true;
395   }
396 
397 }
398 
399 inline void line_strip_to_lines_2to3(size_t a_npt,const float* a_xyzs,float*& a_pxyzs) {
400 
401   const float* vpos = a_xyzs;
402 
403   float x1 = *vpos;vpos++;
404   float y1 = *vpos;vpos++;
405 
406   float x2,y2;
407   for(size_t i=1;i<a_npt;i++) {
408     x2 = *vpos;vpos++;
409     y2 = *vpos;vpos++;
410 
411     *a_pxyzs = x1;a_pxyzs++;
412     *a_pxyzs = y1;a_pxyzs++;
413     *a_pxyzs = 0;a_pxyzs++;
414 
415     *a_pxyzs = x2;a_pxyzs++;
416     *a_pxyzs = y2;a_pxyzs++;
417     *a_pxyzs = 0;a_pxyzs++;
418 
419     x1 = x2;
420     y1 = y2;
421   }
422 
423 }
424 
425 inline void line_strip_to_lines(size_t a_npt,const float* a_xyzs,float*& a_pxyzs) {
426   // a_pxyzs = (a_npt-1)*2*3
427 
428   const float* vpos = a_xyzs;
429 
430   float x1 = *vpos;vpos++;
431   float y1 = *vpos;vpos++;
432   float z1 = *vpos;vpos++;
433 
434   float x2,y2,z2;
435   for(size_t i=1;i<a_npt;i++) {
436     x2 = *vpos;vpos++;
437     y2 = *vpos;vpos++;
438     z2 = *vpos;vpos++;
439 
440     *a_pxyzs = x1;a_pxyzs++;
441     *a_pxyzs = y1;a_pxyzs++;
442     *a_pxyzs = z1;a_pxyzs++;
443 
444     *a_pxyzs = x2;a_pxyzs++;
445     *a_pxyzs = y2;a_pxyzs++;
446     *a_pxyzs = z2;a_pxyzs++;
447 
448     x1 = x2;
449     y1 = y2;
450     z1 = z2;
451   }
452 
453 }
454 
455 inline void line_loop_to_lines(size_t a_npt,const float* a_xyzs,float*& a_pxyzs) {
456   // a_pxyzs = a_npt*2*3
457 
458   const float* vpos = a_xyzs;
459 
460   float x1 = *vpos;vpos++;
461   float y1 = *vpos;vpos++;
462   float z1 = *vpos;vpos++;
463 
464   float x0 = x1;
465   float y0 = y1;
466   float z0 = z1;
467 
468   float x2,y2,z2;
469   for(size_t i=1;i<a_npt;i++) {
470     x2 = *vpos;vpos++;
471     y2 = *vpos;vpos++;
472     z2 = *vpos;vpos++;
473 
474     *a_pxyzs = x1;a_pxyzs++;
475     *a_pxyzs = y1;a_pxyzs++;
476     *a_pxyzs = z1;a_pxyzs++;
477 
478     *a_pxyzs = x2;a_pxyzs++;
479     *a_pxyzs = y2;a_pxyzs++;
480     *a_pxyzs = z2;a_pxyzs++;
481 
482     x1 = x2;
483     y1 = y2;
484     z1 = z2;
485   }
486 
487   *a_pxyzs = x1;a_pxyzs++;
488   *a_pxyzs = y1;a_pxyzs++;
489   *a_pxyzs = z1;a_pxyzs++;
490 
491   *a_pxyzs = x0;a_pxyzs++;
492   *a_pxyzs = y0;a_pxyzs++;
493   *a_pxyzs = z0;a_pxyzs++;
494 
495 }
496 
497 inline void line_loop_to_line_strip(size_t a_npt,const float* a_xyzs,float*& a_pxyzs) {
498   // a_pxyzs = (a_npt+1)*3
499 
500   const float* vpos = a_xyzs;
501 
502   float x1 = *vpos;vpos++;
503   float y1 = *vpos;vpos++;
504   float z1 = *vpos;vpos++;
505 
506   for(size_t i=0;i<a_npt;i++) {
507     *a_pxyzs = *vpos;vpos++;a_pxyzs++;
508     *a_pxyzs = *vpos;vpos++;a_pxyzs++;
509     *a_pxyzs = *vpos;vpos++;a_pxyzs++;
510   }
511 
512   *a_pxyzs = x1;a_pxyzs++;
513   *a_pxyzs = y1;a_pxyzs++;
514   *a_pxyzs = z1;a_pxyzs++;
515 }
516 
517 /// for DirectX_action :
518 inline void triangle_fan_to_triangles_2to3(size_t a_npt,const float* a_xyzs,
519                                            float a_r,float a_g,float a_b,float a_a,
520              float*& a_pxyz_rgbas) {
521 
522   const float* vpos = a_xyzs;
523 
524   float x1 = *vpos;vpos++;
525   float y1 = *vpos;vpos++;
526 
527   float x2 = *vpos;vpos++;
528   float y2 = *vpos;vpos++;
529 
530   float x3,y3;
531   for(size_t i=2;i<a_npt;i++) {
532     x3 = *vpos;vpos++;
533     y3 = *vpos;vpos++;
534 
535     *a_pxyz_rgbas = x1;a_pxyz_rgbas++;
536     *a_pxyz_rgbas = y1;a_pxyz_rgbas++;
537     *a_pxyz_rgbas = 0;a_pxyz_rgbas++;
538 
539     *a_pxyz_rgbas = a_r;a_pxyz_rgbas++;
540     *a_pxyz_rgbas = a_g;a_pxyz_rgbas++;
541     *a_pxyz_rgbas = a_b;a_pxyz_rgbas++;
542     *a_pxyz_rgbas = a_a;a_pxyz_rgbas++;
543 
544     *a_pxyz_rgbas = x2;a_pxyz_rgbas++;
545     *a_pxyz_rgbas = y2;a_pxyz_rgbas++;
546     *a_pxyz_rgbas = 0;a_pxyz_rgbas++;
547 
548     *a_pxyz_rgbas = a_r;a_pxyz_rgbas++;
549     *a_pxyz_rgbas = a_g;a_pxyz_rgbas++;
550     *a_pxyz_rgbas = a_b;a_pxyz_rgbas++;
551     *a_pxyz_rgbas = a_a;a_pxyz_rgbas++;
552 
553     *a_pxyz_rgbas = x3;a_pxyz_rgbas++;
554     *a_pxyz_rgbas = y3;a_pxyz_rgbas++;
555     *a_pxyz_rgbas = 0;a_pxyz_rgbas++;
556 
557     *a_pxyz_rgbas = a_r;a_pxyz_rgbas++;
558     *a_pxyz_rgbas = a_g;a_pxyz_rgbas++;
559     *a_pxyz_rgbas = a_b;a_pxyz_rgbas++;
560     *a_pxyz_rgbas = a_a;a_pxyz_rgbas++;
561 
562     x2 = x3;
563     y2 = y3;
564   }
565 }
566 
567 inline void triangle_fan_to_triangles(size_t a_npt,const float* a_xyzs,
568                                       float a_r,float a_g,float a_b,float a_a,
569               float*& a_pxyz_rgbas) {
570 
571   const float* vpos = a_xyzs;
572 
573   float x1 = *vpos;vpos++;
574   float y1 = *vpos;vpos++;
575   float z1 = *vpos;vpos++;
576 
577   float x2 = *vpos;vpos++;
578   float y2 = *vpos;vpos++;
579   float z2 = *vpos;vpos++;
580 
581   float x3,y3,z3;
582   for(size_t i=2;i<a_npt;i++) {
583     x3 = *vpos;vpos++;
584     y3 = *vpos;vpos++;
585     z3 = *vpos;vpos++;
586 
587     *a_pxyz_rgbas = x1;a_pxyz_rgbas++;
588     *a_pxyz_rgbas = y1;a_pxyz_rgbas++;
589     *a_pxyz_rgbas = z1;a_pxyz_rgbas++;
590 
591     *a_pxyz_rgbas = a_r;a_pxyz_rgbas++;
592     *a_pxyz_rgbas = a_g;a_pxyz_rgbas++;
593     *a_pxyz_rgbas = a_b;a_pxyz_rgbas++;
594     *a_pxyz_rgbas = a_a;a_pxyz_rgbas++;
595 
596     *a_pxyz_rgbas = x2;a_pxyz_rgbas++;
597     *a_pxyz_rgbas = y2;a_pxyz_rgbas++;
598     *a_pxyz_rgbas = z2;a_pxyz_rgbas++;
599 
600     *a_pxyz_rgbas = a_r;a_pxyz_rgbas++;
601     *a_pxyz_rgbas = a_g;a_pxyz_rgbas++;
602     *a_pxyz_rgbas = a_b;a_pxyz_rgbas++;
603     *a_pxyz_rgbas = a_a;a_pxyz_rgbas++;
604 
605     *a_pxyz_rgbas = x3;a_pxyz_rgbas++;
606     *a_pxyz_rgbas = y3;a_pxyz_rgbas++;
607     *a_pxyz_rgbas = z3;a_pxyz_rgbas++;
608 
609     *a_pxyz_rgbas = a_r;a_pxyz_rgbas++;
610     *a_pxyz_rgbas = a_g;a_pxyz_rgbas++;
611     *a_pxyz_rgbas = a_b;a_pxyz_rgbas++;
612     *a_pxyz_rgbas = a_a;a_pxyz_rgbas++;
613 
614     x2 = x3;
615     y2 = y3;
616     z2 = z3;
617   }
618 }
619 
620 }}
621 
622 #endif