ruby-opengl 0.50.0 → 0.60.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. data/Rakefile +15 -11
  2. data/doc/build_install.txt +10 -6
  3. data/doc/extensions.txt.in +348 -0
  4. data/doc/history.txt +4 -0
  5. data/doc/roadmap.txt +4 -6
  6. data/doc/scientific_use.txt +7 -0
  7. data/doc/supplies/page_template.html +2 -1
  8. data/doc/thanks.txt +5 -0
  9. data/doc/tutorial.txt +431 -121
  10. data/examples/NeHe/nehe_lesson02.rb +1 -1
  11. data/examples/NeHe/nehe_lesson03.rb +1 -1
  12. data/examples/NeHe/nehe_lesson04.rb +1 -1
  13. data/examples/NeHe/nehe_lesson05.rb +1 -1
  14. data/examples/NeHe/nehe_lesson36.rb +1 -1
  15. data/examples/OrangeBook/brick.rb +3 -15
  16. data/examples/OrangeBook/particle.rb +2 -20
  17. data/examples/RedBook/aapoly.rb +1 -1
  18. data/examples/RedBook/aargb.rb +2 -2
  19. data/examples/RedBook/accanti.rb +1 -1
  20. data/examples/RedBook/accpersp.rb +1 -1
  21. data/examples/RedBook/alpha.rb +2 -2
  22. data/examples/RedBook/alpha3D.rb +1 -1
  23. data/examples/RedBook/bezcurve.rb +1 -1
  24. data/examples/RedBook/bezmesh.rb +1 -1
  25. data/examples/RedBook/checker.rb +1 -1
  26. data/examples/RedBook/clip.rb +1 -1
  27. data/examples/RedBook/colormat.rb +1 -1
  28. data/examples/RedBook/cube.rb +1 -1
  29. data/examples/RedBook/depthcue.rb +1 -1
  30. data/examples/RedBook/dof.rb +1 -1
  31. data/examples/RedBook/double.rb +1 -1
  32. data/examples/RedBook/drawf.rb +1 -1
  33. data/examples/RedBook/feedback.rb +1 -1
  34. data/examples/RedBook/fog.rb +1 -1
  35. data/examples/RedBook/font.rb +2 -2
  36. data/examples/RedBook/hello.rb +1 -1
  37. data/examples/RedBook/image.rb +4 -4
  38. data/examples/RedBook/lines.rb +1 -1
  39. data/examples/RedBook/list.rb +1 -1
  40. data/examples/RedBook/material.rb +1 -1
  41. data/examples/RedBook/mipmap.rb +1 -1
  42. data/examples/RedBook/model.rb +1 -1
  43. data/examples/RedBook/movelight.rb +1 -1
  44. data/examples/RedBook/pickdepth.rb +1 -1
  45. data/examples/RedBook/planet.rb +5 -5
  46. data/examples/RedBook/quadric.rb +1 -1
  47. data/examples/RedBook/robot.rb +5 -5
  48. data/examples/RedBook/select.rb +1 -1
  49. data/examples/RedBook/smooth.rb +1 -1
  50. data/examples/RedBook/stencil.rb +1 -1
  51. data/examples/RedBook/stroke.rb +2 -2
  52. data/examples/RedBook/surface.rb +1 -1
  53. data/examples/RedBook/teaambient.rb +1 -1
  54. data/examples/RedBook/teapots.rb +1 -1
  55. data/examples/RedBook/tess.rb +1 -1
  56. data/examples/RedBook/texbind.rb +1 -1
  57. data/examples/RedBook/texgen.rb +5 -5
  58. data/examples/RedBook/texturesurf.rb +1 -1
  59. data/examples/RedBook/varray.rb +1 -1
  60. data/examples/RedBook/wrap.rb +5 -5
  61. data/examples/misc/OGLBench.rb +337 -0
  62. data/examples/misc/anisotropic.rb +1 -1
  63. data/examples/misc/fbo_test.rb +356 -0
  64. data/examples/misc/font-glut.rb +1 -1
  65. data/examples/misc/glfwtest.rb +30 -0
  66. data/examples/misc/md2model.rb +15 -0
  67. data/examples/misc/plane.rb +1 -1
  68. data/examples/misc/readpixel.rb +1 -1
  69. data/examples/misc/sdltest.rb +34 -0
  70. data/examples/misc/trislam.rb +828 -0
  71. data/ext/common/common.h +126 -218
  72. data/ext/common/conv.h +244 -0
  73. data/ext/common/funcdef.h +280 -0
  74. data/ext/common/gl-error.h +23 -0
  75. data/ext/common/gl-types.h +14 -0
  76. data/ext/gl/gl-1.0-1.1.c +497 -1255
  77. data/ext/gl/gl-1.2.c +121 -304
  78. data/ext/gl/gl-1.3.c +78 -339
  79. data/ext/gl/gl-1.4.c +102 -164
  80. data/ext/gl/gl-1.5.c +42 -173
  81. data/ext/gl/gl-2.0.c +273 -1039
  82. data/ext/gl/gl-2.1.c +15 -19
  83. data/ext/gl/gl-enums.c +3 -2
  84. data/ext/gl/gl-error.c +104 -0
  85. data/ext/gl/gl-ext-3dfx.c +27 -0
  86. data/ext/gl/gl-ext-arb.c +812 -12
  87. data/ext/gl/gl-ext-ati.c +41 -0
  88. data/ext/gl/gl-ext-ext.c +791 -119
  89. data/ext/gl/gl-ext-gremedy.c +41 -0
  90. data/ext/gl/gl-ext-nv.c +679 -0
  91. data/ext/gl/gl.c +48 -28
  92. data/ext/gl/mkrf_conf.rb +13 -10
  93. data/ext/glu/glu-enums.c +3 -2
  94. data/ext/glu/glu.c +136 -41
  95. data/ext/glu/mkrf_conf.rb +15 -12
  96. data/ext/glut/glut.c +37 -80
  97. data/ext/glut/mkrf_conf.rb +17 -13
  98. data/lib/opengl.rb +29 -53
  99. data/test/tc_common.rb +9 -3
  100. data/test/tc_ext_arb.rb +397 -3
  101. data/test/tc_ext_ati.rb +33 -0
  102. data/test/tc_ext_ext.rb +479 -2
  103. data/test/tc_ext_gremedy.rb +36 -0
  104. data/test/tc_ext_nv.rb +357 -0
  105. data/test/tc_func_10_11.rb +93 -67
  106. data/test/tc_func_12.rb +11 -11
  107. data/test/tc_func_13.rb +38 -18
  108. data/test/tc_func_14.rb +2 -2
  109. data/test/tc_func_15.rb +10 -10
  110. data/test/tc_func_20.rb +20 -20
  111. data/test/tc_func_21.rb +53 -22
  112. data/test/tc_glu.rb +9 -4
  113. data/test/tc_misc.rb +15 -2
  114. metadata +22 -8
  115. data/doc/extensions.txt +0 -361
  116. data/examples/RedBook/aaindex.rb +0 -97
  117. data/examples/misc/smooth.rb +0 -42
  118. data/examples/misc/test.rb +0 -65
@@ -24,6 +24,8 @@
24
24
 
25
25
  #include <ruby.h>
26
26
 
27
+ #include <ctype.h>
28
+
27
29
  #ifdef __APPLE__
28
30
  #include <OpenGL/gl.h>
29
31
  #include <OpenGL/glu.h>
@@ -46,6 +48,10 @@
46
48
  #include "gl-types.h"
47
49
  #include "gl-enums.h"
48
50
  #include "glu-enums.h"
51
+ #include "gl-error.h"
52
+
53
+ #include "funcdef.h"
54
+ #include "conv.h"
49
55
 
50
56
  #ifndef APIENTRY
51
57
  #define APIENTRY
@@ -67,21 +73,16 @@
67
73
 
68
74
  /* */
69
75
 
76
+ /* at least GL_MAX_VERTEX_ATTRIBS - usually 16 or 32 on today's high-end cards */
77
+ #define _MAX_VERTEX_ATTRIBS 64
78
+
70
79
  typedef struct RArray RArray;
71
80
 
72
81
  extern VALUE cProc;
73
82
 
74
- #define LOAD_GL_FUNC(_NAME_) \
75
- if (fptr_##_NAME_==NULL) \
76
- fptr_##_NAME_ = load_gl_function(#_NAME_, 1);
77
-
78
- #define LOAD_GL_EXT_FUNC(_NAME_,_EXTNAME_) \
79
- if (fptr_##_NAME_==NULL) {\
80
- if (CheckExtension(_EXTNAME_)==GL_FALSE) \
81
- rb_raise(rb_eNotImpError,"Extension %s is not available on this system",_EXTNAME_); \
82
- fptr_##_NAME_ = load_gl_function(#_NAME_, 1); \
83
- }
84
-
83
+ /* For now we do not honor pixel store modes, so we need to
84
+ force them to defaults on each affected function call for
85
+ correct size requirement calculations */
85
86
  #define FORCE_PIXEL_STORE_MODE \
86
87
  glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT); \
87
88
  glPixelStorei(GL_PACK_ALIGNMENT, 1); \
@@ -90,7 +91,7 @@ if (fptr_##_NAME_==NULL) {\
90
91
  glPixelStorei(GL_PACK_ROW_LENGTH, 0); \
91
92
  glPixelStorei(GL_PACK_SKIP_IMAGES, 0); \
92
93
  glPixelStorei(GL_PACK_IMAGE_HEIGHT, 0); \
93
- if (CheckExtension("GL_SGIS_texture4D")) { \
94
+ if (CheckVersionExtension("GL_SGIS_texture4D")) { \
94
95
  glPixelStorei(GL_PACK_SKIP_VOLUMES_SGIS, 0); \
95
96
  glPixelStorei(GL_PACK_IMAGE_DEPTH_SGIS, 0); \
96
97
  }
@@ -98,151 +99,9 @@ if (fptr_##_NAME_==NULL) {\
98
99
  #define RESTORE_PIXEL_STORE_MODE \
99
100
  glPopClientAttrib();
100
101
 
101
- GLboolean CheckExtension(const char *name);
102
+ GLboolean CheckVersionExtension(const char *name);
102
103
  GLint CheckBufferBinding(GLint buffer);
103
104
 
104
- /* -------------------------------------------------------------------- */
105
- #ifndef NUM2DBL
106
- #define NUM2DBL(_val) num2double(_val)
107
-
108
- static inline double num2double( VALUE val )
109
- {
110
- struct RFloat* flt;
111
- if (NIL_P(val)) return 0;
112
- flt = RFLOAT(f_float(0, val));
113
- return flt->value;
114
- }
115
- #endif
116
-
117
- /* -------------------------------------------------------------------- */
118
- #define ARY2INTEGRAL(_type_,_convert_) \
119
- static inline int ary2c##_type_( arg, cary, maxlen ) \
120
- VALUE arg; \
121
- GL##_type_ cary[]; \
122
- int maxlen; \
123
- { \
124
- int i; \
125
- struct RArray* ary; \
126
- VALUE entry; \
127
- ary = RARRAY(rb_Array(arg)); \
128
- if (maxlen < 1) \
129
- maxlen = ary->len; \
130
- else \
131
- maxlen = maxlen < ary->len ? maxlen : ary->len; \
132
- for (i=0; i < maxlen; i++) \
133
- { \
134
- entry = rb_ary_entry((VALUE)ary,i); \
135
- cary[i] = (GL##_type_)_convert_(entry); \
136
- } \
137
- return i; \
138
- }
139
-
140
- ARY2INTEGRAL(int,NUM2INT)
141
- ARY2INTEGRAL(uint,NUM2UINT)
142
- ARY2INTEGRAL(byte,NUM2INT)
143
- ARY2INTEGRAL(ubyte,NUM2INT)
144
- ARY2INTEGRAL(short,NUM2INT)
145
- ARY2INTEGRAL(ushort,NUM2INT)
146
- ARY2INTEGRAL(boolean,NUM2INT)
147
- #undef ARY2INTEGRAL
148
-
149
- /* -------------------------------------------------------------------- */
150
- static inline int ary2cflt(arg, cary, maxlen)
151
- VALUE arg;
152
- float cary[];
153
- int maxlen;
154
- {
155
- int i;
156
- struct RArray* ary;
157
- ary = RARRAY(rb_Array(arg));
158
- if (maxlen < 1)
159
- maxlen = ary->len;
160
- else
161
- maxlen = maxlen < ary->len ? maxlen : ary->len;
162
- for (i=0; i < maxlen; i++)
163
- cary[i] = (float)NUM2DBL(rb_ary_entry((VALUE)ary,i));
164
- return i;
165
- }
166
-
167
- /* -------------------------------------------------------------------- */
168
- static inline int ary2cdbl(arg, cary, maxlen)
169
- VALUE arg;
170
- double cary[];
171
- int maxlen;
172
- {
173
- int i;
174
- struct RArray* ary;
175
- ary = RARRAY(rb_Array(arg));
176
- if (maxlen < 1)
177
- maxlen = ary->len;
178
- else
179
- maxlen = maxlen < ary->len ? maxlen : ary->len;
180
- for (i=0; i < maxlen; i++)
181
- cary[i] = NUM2DBL(rb_ary_entry((VALUE)ary,i));
182
- return i;
183
- }
184
-
185
- /* -------------------------------------------------------------------- */
186
- /* Array.flatten */
187
- static inline void mary2ary(src, ary)
188
- VALUE src;
189
- VALUE ary;
190
- {
191
- struct RArray* tmp_ary;
192
- int i;
193
- tmp_ary = RARRAY(rb_Array(src));
194
- for (i = 0; i < tmp_ary->len; i++)
195
- {
196
- if (TYPE(tmp_ary->ptr[i]) == T_ARRAY)
197
- mary2ary((VALUE)tmp_ary->ptr[i], ary);
198
- else
199
- rb_ary_push(ary, tmp_ary->ptr[i]);
200
- }
201
- }
202
-
203
- /* -------------------------------------------------------------------- */
204
- static inline void ary2cmat4x4dbl(ary, cary)
205
- VALUE ary;
206
- double cary[];
207
- {
208
- int i,j;
209
- RArray *ary_r,*ary_c;
210
- memset(cary, 0x0, sizeof(double[4*4]));
211
- ary_c = RARRAY(rb_Array(ary));
212
- if (TYPE(ary_c->ptr[0]) != T_ARRAY)
213
- ary2cdbl((VALUE)ary_c, cary, 16);
214
- else
215
- {
216
- for (i = 0; i < ary_c->len && i < 4; i++)
217
- {
218
- ary_r = RARRAY(rb_Array(ary_c->ptr[i]));
219
- for(j = 0; j < ary_r->len && j < 4; j++)
220
- cary[i*4+j] = (GLdouble)NUM2DBL(ary_r->ptr[j]);
221
- }
222
- }
223
- }
224
-
225
- static inline void ary2cmat4x4flt(ary, cary)
226
- VALUE ary;
227
- float cary[];
228
- {
229
- int i,j;
230
- RArray *ary_r,*ary_c;
231
- memset(cary, 0x0, sizeof(float[4*4]));
232
- ary_c = RARRAY(rb_Array(ary));
233
- if (TYPE(ary_c->ptr[0]) != T_ARRAY)
234
- ary2cflt((VALUE)ary_c, cary, 16);
235
- else
236
- {
237
- for (i = 0; i < ary_c->len && i < 4; i++)
238
- {
239
- ary_r = RARRAY(rb_Array(ary_c->ptr[i]));
240
- for(j = 0; j < ary_r->len && j < 4; j++)
241
- cary[i*4+j] = (GLfloat)NUM2DBL(ary_r->ptr[j]);
242
- }
243
- }
244
- }
245
-
246
105
  /* -------------------------------------------------------------------- */
247
106
 
248
107
  /* gets number of components for given format */
@@ -374,6 +233,91 @@ static inline int gltype_glformat_unit_size(GLenum type,GLenum format)
374
233
  }
375
234
  }
376
235
 
236
+ /* returns size(units) for given type of shader uniform var */
237
+ static inline int get_uniform_size(GLenum uniform_type)
238
+ {
239
+ int uniform_size = 0;
240
+
241
+ switch (uniform_type) {
242
+ case GL_FLOAT:
243
+ case GL_INT:
244
+ case GL_UNSIGNED_INT:
245
+ case GL_BOOL:
246
+ case GL_SAMPLER_1D:
247
+ case GL_SAMPLER_2D:
248
+ case GL_SAMPLER_3D:
249
+ case GL_SAMPLER_CUBE:
250
+ case GL_SAMPLER_1D_SHADOW:
251
+ case GL_SAMPLER_2D_SHADOW:
252
+ case GL_SAMPLER_2D_RECT_ARB:
253
+ case GL_SAMPLER_2D_RECT_SHADOW_ARB:
254
+ case GL_SAMPLER_1D_ARRAY_EXT:
255
+ case GL_SAMPLER_2D_ARRAY_EXT:
256
+ case GL_SAMPLER_BUFFER_EXT:
257
+ case GL_SAMPLER_1D_ARRAY_SHADOW_EXT:
258
+ case GL_SAMPLER_2D_ARRAY_SHADOW_EXT:
259
+ case GL_SAMPLER_CUBE_SHADOW_EXT:
260
+ case GL_INT_SAMPLER_1D_EXT:
261
+ case GL_INT_SAMPLER_2D_EXT:
262
+ case GL_INT_SAMPLER_3D_EXT:
263
+ case GL_INT_SAMPLER_CUBE_EXT:
264
+ case GL_INT_SAMPLER_2D_RECT_EXT:
265
+ case GL_INT_SAMPLER_1D_ARRAY_EXT:
266
+ case GL_INT_SAMPLER_2D_ARRAY_EXT:
267
+ case GL_INT_SAMPLER_BUFFER_EXT:
268
+ case GL_UNSIGNED_INT_SAMPLER_1D_EXT:
269
+ case GL_UNSIGNED_INT_SAMPLER_2D_EXT:
270
+ case GL_UNSIGNED_INT_SAMPLER_3D_EXT:
271
+ case GL_UNSIGNED_INT_SAMPLER_CUBE_EXT:
272
+ case GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT:
273
+ case GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT:
274
+ case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT:
275
+ case GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT:
276
+ uniform_size = 1;
277
+ break;
278
+ case GL_FLOAT_VEC2:
279
+ case GL_INT_VEC2:
280
+ case GL_UNSIGNED_INT_VEC2_EXT:
281
+ case GL_BOOL_VEC2:
282
+ uniform_size = 2;
283
+ break;
284
+ case GL_FLOAT_VEC3:
285
+ case GL_INT_VEC3:
286
+ case GL_UNSIGNED_INT_VEC3_EXT:
287
+ case GL_BOOL_VEC3:
288
+ uniform_size = 3;
289
+ break;
290
+ case GL_FLOAT_VEC4:
291
+ case GL_INT_VEC4:
292
+ case GL_UNSIGNED_INT_VEC4_EXT:
293
+ case GL_BOOL_VEC4:
294
+ case GL_FLOAT_MAT2:
295
+ uniform_size = 4;
296
+ break;
297
+ case GL_FLOAT_MAT2x3:
298
+ case GL_FLOAT_MAT3x2:
299
+ uniform_size = 6;
300
+ break;
301
+ case GL_FLOAT_MAT2x4:
302
+ case GL_FLOAT_MAT4x2:
303
+ uniform_size = 8;
304
+ break;
305
+ case GL_FLOAT_MAT3:
306
+ uniform_size = 9;
307
+ break;
308
+ case GL_FLOAT_MAT4x3:
309
+ case GL_FLOAT_MAT3x4:
310
+ uniform_size = 12;
311
+ break;
312
+ case GL_FLOAT_MAT4:
313
+ uniform_size = 16;
314
+ break;
315
+ default:
316
+ rb_raise(rb_eTypeError, "Unsupported uniform type '%i'",uniform_type);
317
+ }
318
+ return uniform_size;
319
+ }
320
+
377
321
  static inline int GetDataSize(GLenum type,GLenum format,int num)
378
322
  {
379
323
  int size;
@@ -397,7 +341,7 @@ static inline void CheckDataSize(GLenum type,GLenum format,int num,VALUE data)
397
341
 
398
342
  size = GetDataSize(type,format,num);
399
343
 
400
- if (RSTRING(data)->len < size)
344
+ if (RSTRING_LEN(data) < size)
401
345
  rb_raise(rb_eArgError, "Length of specified data doesn't correspond to format and type parameters passed. Calculated length: %i",size);
402
346
  }
403
347
 
@@ -448,68 +392,32 @@ static inline void *load_gl_function(const char *name,int raise)
448
392
  return func_ptr;
449
393
  }
450
394
 
451
- /* -------------------------------------------------------------------- */
395
+ static inline VALUE pack_array_or_pass_string(GLenum type,VALUE ary)
396
+ {
397
+ char *type_str;
398
+
399
+ if (TYPE(ary)==T_STRING)
400
+ return ary;
401
+
402
+ Check_Type(ary,T_ARRAY);
403
+
404
+ switch(type) {
405
+ case GL_FLOAT: type_str = "f*"; break;
406
+ case GL_DOUBLE: type_str = "d*"; break;
407
+ case GL_BYTE: type_str = "c*"; break;
408
+ case GL_SHORT: type_str = "s*"; break;
409
+ case GL_INT: type_str = "i*"; break;
410
+ case GL_UNSIGNED_BYTE: type_str = "C*"; break;
411
+ case GL_UNSIGNED_SHORT: type_str = "S*"; break;
412
+ case GL_UNSIGNED_INT: type_str = "I*"; break;
413
+ default:
414
+ rb_raise(rb_eTypeError,"Unknown type %i",type);
415
+ return Qnil; /* not reached */
416
+ }
452
417
 
453
- /* Macroset for defining simple functions, i.e. functions that take n arguments of
454
- the same type and pass them to GL API function without any additional processing.
455
-
456
- Some checking is implicit in _conversion_ argument - e.g. NUM2INT makes sure that
457
- user is really passing type that can be converted to INT, otherwire raises. */
458
-
459
- #define ARGLIST0 obj
460
- #define ARGLIST1 obj,arg1
461
- #define ARGLIST2 obj,arg1,arg2
462
- #define ARGLIST3 obj,arg1,arg2,arg3
463
- #define ARGLIST4 obj,arg1,arg2,arg3,arg4
464
- #define ARGLIST5 obj,arg1,arg2,arg3,arg4,arg5
465
- #define ARGLIST6 obj,arg1,arg2,arg3,arg4,arg5,arg6
466
-
467
- #define TYPELIST0(_ctype_) void
468
- #define TYPELIST1(_ctype_) _ctype_
469
- #define TYPELIST2(_ctype_) _ctype_,_ctype_
470
- #define TYPELIST3(_ctype_) _ctype_,_ctype_,_ctype_
471
- #define TYPELIST4(_ctype_) _ctype_,_ctype_,_ctype_,_ctype_
472
- #define TYPELIST5(_ctype_) _ctype_,_ctype_,_ctype_,_ctype_,_ctype_
473
- #define TYPELIST6(_ctype_) _ctype_,_ctype_,_ctype_,_ctype_,_ctype_,_ctype_
474
-
475
- #define FUNCPARAMS0(_ctype_,_conversion_)
476
- #define FUNCPARAMS1(_ctype_,_conversion_) (_ctype_)_conversion_(arg1)
477
- #define FUNCPARAMS2(_ctype_,_conversion_) (_ctype_)_conversion_(arg1),(_ctype_)_conversion_(arg2)
478
- #define FUNCPARAMS3(_ctype_,_conversion_) (_ctype_)_conversion_(arg1),(_ctype_)_conversion_(arg2),(_ctype_)_conversion_(arg3)
479
- #define FUNCPARAMS4(_ctype_,_conversion_) (_ctype_)_conversion_(arg1),(_ctype_)_conversion_(arg2),(_ctype_)_conversion_(arg3),(_ctype_)_conversion_(arg4)
480
- #define FUNCPARAMS5(_ctype_,_conversion_) (_ctype_)_conversion_(arg1),(_ctype_)_conversion_(arg2),(_ctype_)_conversion_(arg3),(_ctype_)_conversion_(arg4),(_ctype_)_conversion_(arg5)
481
- #define FUNCPARAMS6(_ctype_,_conversion_) (_ctype_)_conversion_(arg1),(_ctype_)_conversion_(arg2),(_ctype_)_conversion_(arg3),(_ctype_)_conversion_(arg4),(_ctype_)_conversion_(arg5),(_ctype_)_conversion_(arg6)
482
-
483
- #define GL_SIMPLE_FUNC(_name_,_numparams_,_ctype_,_conversion_) \
484
- static VALUE \
485
- gl_##_name_(ARGLIST##_numparams_) \
486
- VALUE ARGLIST##_numparams_; \
487
- { \
488
- gl##_name_(FUNCPARAMS##_numparams_(_ctype_,_conversion_)); \
489
- return Qnil; \
490
- }
491
-
492
- #define GL_SIMPLE_FUNC_LOAD(_name_,_numparams_,_ctype_,_conversion_) \
493
- static void (APIENTRY * fptr_gl##_name_)( TYPELIST##_numparams_(_ctype_) ); \
494
- static VALUE \
495
- gl_##_name_(ARGLIST##_numparams_) \
496
- VALUE ARGLIST##_numparams_; \
497
- { \
498
- LOAD_GL_FUNC(gl##_name_) \
499
- fptr_gl##_name_(FUNCPARAMS##_numparams_(_ctype_,_conversion_)); \
500
- return Qnil; \
501
- }
502
-
503
-
504
- #define GL_EXT_SIMPLE_FUNC_LOAD(_name_,_numparams_,_ctype_,_conversion_,_extensionname_) \
505
- static void (APIENTRY * fptr_gl##_name_)( TYPELIST##_numparams_(_ctype_) ); \
506
- static VALUE \
507
- gl_##_name_(ARGLIST##_numparams_) \
508
- VALUE ARGLIST##_numparams_; \
509
- { \
510
- LOAD_GL_EXT_FUNC(gl##_name_,_extensionname_) \
511
- fptr_gl##_name_(FUNCPARAMS##_numparams_(_ctype_,_conversion_)); \
512
- return Qnil; \
513
- }
418
+ return rb_funcall(ary,rb_intern("pack"),1,rb_str_new2(type_str));
419
+ }
420
+
421
+ /* -------------------------------------------------------------------- */
514
422
 
515
423
  #endif /* _COMMON_H_ */
@@ -0,0 +1,244 @@
1
+ /*
2
+ * Copyright (C) 2007 Jan Dvorak <jan.dvorak@kraxnet.cz>
3
+ *
4
+ * This program is distributed under the terms of the MIT license.
5
+ * See the included MIT-LICENSE file for the terms of this license.
6
+ *
7
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
8
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
9
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
10
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
11
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
12
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
13
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
14
+ */
15
+
16
+ /* Functions and macros for datatype conversion between Ruby and C */
17
+
18
+ /*
19
+ Fast inline conversion functions as a replacement for the ones in libruby.
20
+ FIXNUM_P is simple logical AND check so it comes first, TYPE() is simple function,
21
+ and specified in header file so it can be inlined. For conversion, FIX2LONG is
22
+ simple right shift, and RFLOAT()-> just pointer dereference. For converting
23
+ Fixnum and Float types (which accounts for 99.9% of things you would want to pass
24
+ to OpenGL), there is large performance boost as result.
25
+
26
+ Also ruby 'true' and 'false' are converted to GL_TRUE/GL_FALSE for compatibility, and
27
+ finally, we fallback to library functions for any other data types (and error handling).
28
+ */
29
+
30
+ #if RUBY_VERSION <190
31
+ #define FLOAT_VAL_ACCESS(val) RFLOAT(val)->value
32
+ #else
33
+ #define FLOAT_VAL_ACCESS(val) RFLOAT(val)->float_value
34
+ #endif
35
+
36
+ #define FASTCONV(_name_,_type_,_convfix_,_convfallback_) \
37
+ static inline _type_ _name_(val) \
38
+ VALUE val; \
39
+ { \
40
+ if (FIXNUM_P(val)) \
41
+ return (_type_) _convfix_(val); \
42
+ \
43
+ if (TYPE(val) == T_FLOAT) \
44
+ return (_type_)FLOAT_VAL_ACCESS(val); \
45
+ \
46
+ if ((val) == Qtrue) \
47
+ return (_type_)(GL_TRUE); \
48
+ \
49
+ if ((val) == Qfalse || (val) == Qnil) \
50
+ return (_type_)(GL_FALSE); \
51
+ \
52
+ return (_convfallback_(val)); \
53
+ }
54
+
55
+ FASTCONV(num2double,double,FIX2LONG,rb_num2dbl)
56
+ #if SIZEOF_INT < SIZEOF_LONG
57
+ /* For 64bit platforms with LP64 mode */
58
+ FASTCONV(num2int,long,FIX2LONG,rb_num2int)
59
+ FASTCONV(num2uint,unsigned long,FIX2ULONG,rb_num2uint)
60
+ #else
61
+ /* All other platforms */
62
+ FASTCONV(num2int,long,FIX2LONG,(int)NUM2LONG)
63
+ FASTCONV(num2uint,unsigned long,FIX2ULONG,(unsigned int)NUM2ULONG)
64
+ #endif
65
+
66
+ #undef NUM2DBL
67
+ #define NUM2DBL num2double
68
+
69
+ #undef NUM2INT
70
+ #define NUM2INT num2int
71
+
72
+ #undef NUM2UINT
73
+ #define NUM2UINT num2uint
74
+
75
+ #undef FASTCONV
76
+
77
+ /* For conversion between ruby and GL boolean values */
78
+ #define GLBOOL2RUBY(x) (x)==GL_TRUE? Qtrue :( (x)==GL_FALSE? Qfalse : INT2NUM((x)))
79
+ #define RUBYBOOL2GL(x) (x)==Qtrue? GL_TRUE : GL_FALSE
80
+
81
+ #define cond_GLBOOL2RUBY_FUNC(_name_,_type_,_conv_) \
82
+ static inline VALUE _name_(GLenum pname,_type_ value) \
83
+ { \
84
+ switch (pname) { \
85
+ case GL_DELETE_STATUS: \
86
+ case GL_LINK_STATUS: \
87
+ case GL_VALIDATE_STATUS: \
88
+ case GL_COMPILE_STATUS: \
89
+ case GL_MINMAX_SINK: \
90
+ case GL_HISTOGRAM_SINK: \
91
+ case GL_COORD_REPLACE: \
92
+ case GL_TEXTURE_COMPRESSED: \
93
+ case GL_GENERATE_MIPMAP: \
94
+ case GL_TEXTURE_RESIDENT: \
95
+ case GL_BUFFER_MAPPED: \
96
+ case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: \
97
+ case GL_VERTEX_ATTRIB_ARRAY_ENABLED: \
98
+ case GL_QUERY_RESULT_AVAILABLE: \
99
+ case GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB: \
100
+ case GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT: \
101
+ case GL_FENCE_STATUS_NV: \
102
+ case GL_TEXTURE_FLOAT_COMPONENTS_NV: \
103
+ case GL_SHADER_CONSISTENT_NV: \
104
+ case GL_TEXTURE_COMPARE_SGIX: \
105
+ case GLU_TESS_BOUNDARY_ONLY: \
106
+ case GLU_CULLING: \
107
+ case GLU_AUTO_LOAD_MATRIX: \
108
+ return GLBOOL2RUBY(value); \
109
+ default: \
110
+ return _conv_(value); \
111
+ } \
112
+ }
113
+
114
+ cond_GLBOOL2RUBY_FUNC(cond_GLBOOL2RUBY,GLint,INT2NUM)
115
+ cond_GLBOOL2RUBY_FUNC(cond_GLBOOL2RUBY_U,GLuint,UINT2NUM)
116
+ cond_GLBOOL2RUBY_FUNC(cond_GLBOOL2RUBY_LL,GLint64EXT,LL2NUM)
117
+ cond_GLBOOL2RUBY_FUNC(cond_GLBOOL2RUBY_ULL,GLuint64EXT,ULL2NUM)
118
+ cond_GLBOOL2RUBY_FUNC(cond_GLBOOL2RUBY_F,GLfloat,rb_float_new)
119
+ cond_GLBOOL2RUBY_FUNC(cond_GLBOOL2RUBY_D,GLdouble,rb_float_new)
120
+
121
+
122
+ /* For conversion between ruby array (or object that can be converted to array) and C array.
123
+ The C array has to be preallocated by calling function. */
124
+ #define ARY2CTYPE(_type_,_convert_) \
125
+ static inline int ary2c##_type_( arg, cary, maxlen ) \
126
+ VALUE arg; \
127
+ GL##_type_ cary[]; \
128
+ int maxlen; \
129
+ { \
130
+ int i; \
131
+ struct RArray* ary; \
132
+ ary = RARRAY(rb_Array(arg)); \
133
+ if (maxlen < 1) \
134
+ maxlen = ary->len; \
135
+ else \
136
+ maxlen = maxlen < ary->len ? maxlen : ary->len; \
137
+ for (i=0; i < maxlen; i++) \
138
+ cary[i] = (GL##_type_)_convert_(rb_ary_entry((VALUE)ary,i)); \
139
+ return i; \
140
+ }
141
+
142
+ ARY2CTYPE(int,NUM2INT)
143
+ ARY2CTYPE(uint,NUM2UINT)
144
+ ARY2CTYPE(byte,NUM2INT)
145
+ ARY2CTYPE(ubyte,NUM2INT)
146
+ ARY2CTYPE(short,NUM2INT)
147
+ ARY2CTYPE(ushort,NUM2INT)
148
+ ARY2CTYPE(boolean,NUM2INT)
149
+ ARY2CTYPE(float,NUM2DBL)
150
+ ARY2CTYPE(double,NUM2DBL)
151
+
152
+ #define ary2cflt ary2cfloat
153
+ #define ary2cdbl ary2cdouble
154
+
155
+ #undef ARY2CTYPE
156
+
157
+ /* Converts either array or object responding to #to_a to C-style array */
158
+ #define ARY2CMAT(_type_) \
159
+ static inline void ary2cmat##_type_(rary, cary, cols, rows, count) \
160
+ VALUE rary; \
161
+ _type_ cary[]; \
162
+ int cols,rows; \
163
+ { \
164
+ int i; \
165
+ \
166
+ rary = rb_Array(rary); \
167
+ rary = rb_funcall(rary,rb_intern("flatten"),0); \
168
+ \
169
+ if (RARRAY(rary)->len != cols*rows) \
170
+ rb_raise(rb_eArgError, "passed array/matrix must have %i*%i elements",cols,rows); \
171
+ \
172
+ for (i=0; i < cols*rows; i++) \
173
+ cary[i] = (_type_) NUM2DBL(rb_ary_entry(rary,i)); \
174
+ }
175
+
176
+ ARY2CMAT(double)
177
+ ARY2CMAT(float)
178
+ #undef ARY2CMAT
179
+
180
+ #define ARY2CMATCNT(_type_) \
181
+ static inline void ary2cmat##_type_##count(rary, cary, cols, rows) \
182
+ VALUE rary; \
183
+ _type_ cary[]; \
184
+ int cols,rows; \
185
+ { \
186
+ int i; \
187
+ \
188
+ rary = rb_Array(rary); \
189
+ rary = rb_funcall(rary,rb_intern("flatten"),0); \
190
+ \
191
+ if (RARRAY_LEN(rary)<1 || (RARRAY_LEN(rary) % (cols*rows) != 0)) {\
192
+ xfree(cary); \
193
+ rb_raise(rb_eArgError, "passed array/matrix must conatain n x (%i*%i) elements",cols,rows); \
194
+ } \
195
+ \
196
+ for (i=0; i < RARRAY_LEN(rary); i++) \
197
+ cary[i] = (_type_) NUM2DBL(rb_ary_entry(rary,i)); \
198
+ }
199
+
200
+ ARY2CMATCNT(double)
201
+ ARY2CMATCNT(float)
202
+ #undef ARY2CMATCNT
203
+
204
+
205
+ #define EMPTY
206
+ #define FREE(_x_) xfree(_x_);
207
+
208
+ #define RET_ARRAY_OR_SINGLE(_size_,_conv_,_params_) RET_ARRAY_OR_SINGLE_FUNC(_size_,_conv_,_params_,EMPTY)
209
+ #define RET_ARRAY_OR_SINGLE_FREE(_size_,_conv_,_params_) RET_ARRAY_OR_SINGLE_FUNC(_size_,_conv_,_params_,FREE(_params_))
210
+
211
+ #define RET_ARRAY_OR_SINGLE_FUNC(_size_,_conv_,_params_,_extra_) \
212
+ { \
213
+ int iter; \
214
+ VALUE return_array; \
215
+ if (_size_ == 1) { \
216
+ return_array = _conv_(_params_[0]); \
217
+ } else { \
218
+ return_array = rb_ary_new2(_size_); \
219
+ for(iter=0;iter<_size_;iter++) \
220
+ rb_ary_push(return_array, _conv_(_params_[iter])); \
221
+ } \
222
+ _extra_ \
223
+ CHECK_GLERROR \
224
+ return return_array; \
225
+ }
226
+
227
+ #define RET_ARRAY_OR_SINGLE_BOOL(_size_,_conv_,_enum_,_params_) RET_ARRAY_OR_SINGLE_BOOL_FUNC(_size_,_conv_,_enum_,_params_,EMPTY)
228
+ #define RET_ARRAY_OR_SINGLE_BOOL_FREE(_size_,_conv_,_enum_,_params_) RET_ARRAY_OR_SINGLE_BOOL_FUNC(_size_,_conv_,_enum_,_params_,FREE(_params_))
229
+
230
+ #define RET_ARRAY_OR_SINGLE_BOOL_FUNC(_size_,_conv_,_enum_,_params_,_extra_) \
231
+ { \
232
+ int iter; \
233
+ VALUE return_array; \
234
+ if (_size_ == 1) { \
235
+ return_array = _conv_(_enum_,_params_[0]); \
236
+ } else { \
237
+ return_array = rb_ary_new2(_size_); \
238
+ for(iter=0;iter<_size_;iter++) \
239
+ rb_ary_push(return_array, _conv_(_enum_,_params_[iter])); \
240
+ } \
241
+ _extra_ \
242
+ CHECK_GLERROR \
243
+ return return_array; \
244
+ }