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
@@ -16,25 +16,28 @@
16
16
  #include "../common/common.h"
17
17
 
18
18
  /* OpenGL 1.4 functions */
19
- GL_SIMPLE_FUNC_LOAD(BlendFuncSeparate,4,GLenum,NUM2INT)
20
- GL_SIMPLE_FUNC_LOAD(FogCoordf,1,GLfloat,NUM2DBL)
21
- GL_SIMPLE_FUNC_LOAD(FogCoordd,1,GLdouble,NUM2DBL)
22
- GL_SIMPLE_FUNC_LOAD(SecondaryColor3b,3,GLbyte,NUM2INT)
23
- GL_SIMPLE_FUNC_LOAD(SecondaryColor3d,3,GLdouble,NUM2DBL)
24
- GL_SIMPLE_FUNC_LOAD(SecondaryColor3f,3,GLfloat,NUM2DBL)
25
- GL_SIMPLE_FUNC_LOAD(SecondaryColor3i,3,GLint,NUM2INT)
26
- GL_SIMPLE_FUNC_LOAD(SecondaryColor3s,3,GLshort,NUM2INT)
27
- GL_SIMPLE_FUNC_LOAD(SecondaryColor3ub,3,GLubyte,NUM2INT)
28
- GL_SIMPLE_FUNC_LOAD(SecondaryColor3ui,3,GLuint,NUM2UINT)
29
- GL_SIMPLE_FUNC_LOAD(SecondaryColor3us,3,GLushort,NUM2INT)
30
- GL_SIMPLE_FUNC_LOAD(WindowPos2d,2,GLdouble,NUM2DBL)
31
- GL_SIMPLE_FUNC_LOAD(WindowPos2f,2,GLfloat,NUM2DBL)
32
- GL_SIMPLE_FUNC_LOAD(WindowPos2i,2,GLint,NUM2INT)
33
- GL_SIMPLE_FUNC_LOAD(WindowPos2s,2,GLshort,NUM2INT)
34
- GL_SIMPLE_FUNC_LOAD(WindowPos3d,3,GLdouble,NUM2DBL)
35
- GL_SIMPLE_FUNC_LOAD(WindowPos3f,3,GLfloat,NUM2DBL)
36
- GL_SIMPLE_FUNC_LOAD(WindowPos3i,3,GLint,NUM2INT)
37
- GL_SIMPLE_FUNC_LOAD(WindowPos3s,3,GLshort,NUM2INT)
19
+
20
+ GL_FUNC_LOAD_4(BlendFuncSeparate,GLvoid, GLenum,GLenum,GLenum,GLenum, "1.4")
21
+ GL_FUNC_LOAD_1(FogCoordf,GLvoid, GLfloat, "1.4")
22
+ GL_FUNC_LOAD_1(FogCoordd,GLvoid, GLdouble, "1.4")
23
+ GL_FUNC_LOAD_2(PointParameteri,GLvoid, GLenum,GLint, "1.4")
24
+ GL_FUNC_LOAD_2(PointParameterf,GLvoid, GLenum,GLfloat, "1.4")
25
+ GL_FUNC_LOAD_3(SecondaryColor3b,GLvoid, GLbyte,GLbyte,GLbyte, "1.4")
26
+ GL_FUNC_LOAD_3(SecondaryColor3d,GLvoid, GLdouble,GLdouble,GLdouble, "1.4")
27
+ GL_FUNC_LOAD_3(SecondaryColor3f,GLvoid, GLfloat,GLfloat,GLfloat, "1.4")
28
+ GL_FUNC_LOAD_3(SecondaryColor3i,GLvoid, GLint,GLint,GLint, "1.4")
29
+ GL_FUNC_LOAD_3(SecondaryColor3s,GLvoid, GLshort,GLshort,GLshort, "1.4")
30
+ GL_FUNC_LOAD_3(SecondaryColor3ub,GLvoid, GLubyte,GLubyte,GLubyte, "1.4")
31
+ GL_FUNC_LOAD_3(SecondaryColor3ui,GLvoid, GLuint,GLuint,GLuint, "1.4")
32
+ GL_FUNC_LOAD_3(SecondaryColor3us,GLvoid, GLushort,GLushort,GLushort, "1.4")
33
+ GL_FUNC_LOAD_2(WindowPos2d,GLvoid, GLdouble,GLdouble, "1.4")
34
+ GL_FUNC_LOAD_2(WindowPos2f,GLvoid, GLfloat,GLfloat, "1.4")
35
+ GL_FUNC_LOAD_2(WindowPos2i,GLvoid, GLint,GLint, "1.4")
36
+ GL_FUNC_LOAD_2(WindowPos2s,GLvoid, GLshort,GLshort, "1.4")
37
+ GL_FUNC_LOAD_3(WindowPos3d,GLvoid, GLdouble,GLdouble,GLdouble, "1.4")
38
+ GL_FUNC_LOAD_3(WindowPos3f,GLvoid, GLfloat,GLfloat,GLfloat, "1.4")
39
+ GL_FUNC_LOAD_3(WindowPos3i,GLvoid, GLint,GLint,GLint, "1.4")
40
+ GL_FUNC_LOAD_3(WindowPos3s,GLvoid, GLshort,GLshort,GLshort, "1.4")
38
41
 
39
42
  static void (APIENTRY * fptr_glFogCoordfv)(GLfloat *);
40
43
  static VALUE
@@ -42,10 +45,11 @@ gl_FogCoordfv(obj,arg1)
42
45
  VALUE obj,arg1;
43
46
  {
44
47
  GLfloat coord;
45
- LOAD_GL_FUNC(glFogCoordfv)
48
+ LOAD_GL_FUNC(glFogCoordfv,"1.4")
46
49
  Check_Type(arg1,T_ARRAY);
47
50
  ary2cflt(arg1,&coord,1);
48
51
  fptr_glFogCoordfv(&coord);
52
+ CHECK_GLERROR
49
53
  return Qnil;
50
54
  }
51
55
 
@@ -55,10 +59,11 @@ gl_FogCoorddv(obj,arg1)
55
59
  VALUE obj,arg1;
56
60
  {
57
61
  GLdouble coord;
58
- LOAD_GL_FUNC(glFogCoorddv)
62
+ LOAD_GL_FUNC(glFogCoorddv,"1.4")
59
63
  Check_Type(arg1,T_ARRAY);
60
64
  ary2cdbl(arg1,&coord,1);
61
65
  fptr_glFogCoorddv(&coord);
66
+ CHECK_GLERROR
62
67
  return Qnil;
63
68
  }
64
69
 
@@ -70,18 +75,20 @@ VALUE obj,arg1,arg2,arg3;
70
75
  {
71
76
  GLenum type;
72
77
  GLsizei stride;
73
- LOAD_GL_FUNC(glFogCoordPointer)
78
+ LOAD_GL_FUNC(glFogCoordPointer,"1.4")
74
79
  type = (GLenum)NUM2INT(arg1);
75
80
  stride = (GLsizei)NUM2UINT(arg2);
76
81
  if (CheckBufferBinding(GL_ARRAY_BUFFER_BINDING)) {
77
82
  g_FogCoord_ptr = arg3;
78
83
  fptr_glFogCoordPointer(type, stride, (const GLvoid*)NUM2INT(arg3));
79
84
  } else {
80
- Check_Type(arg3, T_STRING);
81
- rb_str_freeze(arg3);
82
- g_FogCoord_ptr = arg3;
83
- fptr_glFogCoordPointer(type, stride, (const GLvoid*)RSTRING(arg3)->ptr);
85
+ VALUE data;
86
+ data = pack_array_or_pass_string(GL_UNSIGNED_BYTE,arg3);
87
+ rb_str_freeze(data);
88
+ g_FogCoord_ptr = data;
89
+ fptr_glFogCoordPointer(type, stride, (const GLvoid*)RSTRING_PTR(data));
84
90
  }
91
+ CHECK_GLERROR
85
92
  return Qnil;
86
93
  }
87
94
 
@@ -94,7 +101,7 @@ VALUE obj,arg1,arg2,arg3;
94
101
  GLint *ary1;
95
102
  GLsizei *ary2;
96
103
  int len1,len2;
97
- LOAD_GL_FUNC(glMultiDrawArrays)
104
+ LOAD_GL_FUNC(glMultiDrawArrays,"1.4")
98
105
  len1 = RARRAY(arg2)->len;
99
106
  len2 = RARRAY(arg3)->len;
100
107
  if (len1!=len2)
@@ -107,6 +114,7 @@ VALUE obj,arg1,arg2,arg3;
107
114
  fptr_glMultiDrawArrays(mode,ary1,ary2,len1);
108
115
  xfree(ary1);
109
116
  xfree(ary2);
117
+ CHECK_GLERROR
110
118
  return Qnil;
111
119
  }
112
120
 
@@ -125,7 +133,7 @@ VALUE obj;
125
133
  RArray *ary;
126
134
  int i;
127
135
  VALUE args[4];
128
- LOAD_GL_FUNC(glMultiDrawElements)
136
+ LOAD_GL_FUNC(glMultiDrawElements,"1.4")
129
137
  switch (rb_scan_args(argc, argv, "31", &args[0], &args[1], &args[2],&args[3])) {
130
138
  default:
131
139
  case 3:
@@ -139,8 +147,10 @@ VALUE obj;
139
147
  counts = ALLOC_N(GLsizei,size);
140
148
  indices = ALLOC_N(GLvoid*,size);
141
149
  for (i=0;i<size;i++) {
142
- indices[i] = RSTRING(ary->ptr[i])->ptr;
143
- counts[i] = RSTRING(ary->ptr[i])->len;
150
+ VALUE data;
151
+ data = pack_array_or_pass_string(type,ary->ptr[i]);
152
+ indices[i] = RSTRING_PTR(data);
153
+ counts[i] = RSTRING_LEN(data);
144
154
  }
145
155
  fptr_glMultiDrawElements(mode,counts,type,indices,size);
146
156
  xfree(counts);
@@ -169,20 +179,7 @@ VALUE obj;
169
179
  xfree(indices);
170
180
  break;
171
181
  }
172
- return Qnil;
173
- }
174
-
175
- static void (APIENTRY * fptr_glPointParameterf)(GLenum,GLfloat);
176
- static VALUE
177
- gl_PointParameterf(obj,arg1,arg2)
178
- VALUE obj,arg1,arg2;
179
- {
180
- GLenum pname;
181
- GLfloat param;
182
- LOAD_GL_FUNC(glPointParameterf)
183
- pname = (GLenum)NUM2INT(arg1);
184
- param = (GLfloat)NUM2INT(arg2);
185
- fptr_glPointParameterf(pname,param);
182
+ CHECK_GLERROR
186
183
  return Qnil;
187
184
  }
188
185
 
@@ -194,7 +191,7 @@ VALUE obj,arg1,arg2;
194
191
  GLenum pname;
195
192
  GLfloat params[3] = {0.0,0.0,0.0};
196
193
  GLint size;
197
- LOAD_GL_FUNC(glPointParameterfv)
194
+ LOAD_GL_FUNC(glPointParameterfv,"1.4")
198
195
  pname = (GLenum)NUM2INT(arg1);
199
196
  Check_Type(arg2,T_ARRAY);
200
197
  if (pname==GL_POINT_DISTANCE_ATTENUATION)
@@ -203,20 +200,7 @@ VALUE obj,arg1,arg2;
203
200
  size = 1;
204
201
  ary2cflt(arg2,params,size);
205
202
  fptr_glPointParameterfv(pname,params);
206
- return Qnil;
207
- }
208
-
209
- static void (APIENTRY * fptr_glPointParameteri)(GLenum,GLint);
210
- static VALUE
211
- gl_PointParameteri(obj,arg1,arg2)
212
- VALUE obj,arg1,arg2;
213
- {
214
- GLenum pname;
215
- GLint param;
216
- LOAD_GL_FUNC(glPointParameteri)
217
- pname = (GLenum)NUM2INT(arg1);
218
- param = (GLint)NUM2INT(arg2);
219
- fptr_glPointParameteri(pname,param);
203
+ CHECK_GLERROR
220
204
  return Qnil;
221
205
  }
222
206
 
@@ -228,7 +212,7 @@ VALUE obj,arg1,arg2;
228
212
  GLenum pname;
229
213
  GLint params[3] = {0.0,0.0,0.0};
230
214
  GLint size;
231
- LOAD_GL_FUNC(glPointParameteriv)
215
+ LOAD_GL_FUNC(glPointParameteriv,"1.4")
232
216
  pname = (GLenum)NUM2INT(arg1);
233
217
  Check_Type(arg2,T_ARRAY);
234
218
  if (pname==GL_POINT_DISTANCE_ATTENUATION)
@@ -237,52 +221,31 @@ VALUE obj,arg1,arg2;
237
221
  size = 1;
238
222
  ary2cint(arg2,params,size);
239
223
  fptr_glPointParameteriv(pname,params);
224
+ CHECK_GLERROR
240
225
  return Qnil;
241
226
  }
242
227
 
243
- #define GLSECONDARYCOLOR_VFUNC(_type_) \
244
- static VALUE \
245
- gl_SecondaryColor##_type_##v(argc,argv,obj) \
246
- int argc; \
247
- VALUE *argv; \
248
- VALUE obj; \
228
+ #define GLSECONDARYCOLOR_VFUNC(_name_,_type_,_conv_) \
229
+ static void (APIENTRY * fptr_gl##_name_)(_type_ *); \
230
+ VALUE gl_##_name_(VALUE obj,VALUE arg1) \
249
231
  { \
250
- int num; \
251
- VALUE args[3]; \
252
- RArray *ary; \
253
- switch (num = rb_scan_args(argc, argv, "12", &args[0], &args[1], &args[2])) { \
254
- case 1: \
255
- if (TYPE(args[0]) == T_ARRAY) { \
256
- ary = RARRAY(args[0]); \
257
- switch (ary->len) { \
258
- case 3: \
259
- gl_SecondaryColor3##_type_(obj,ary->ptr[0],ary->ptr[1],ary->ptr[2]); \
260
- break; \
261
- default: \
262
- rb_raise(rb_eArgError, "array length:%d", num); \
263
- } \
264
- } \
265
- else \
266
- rb_raise(rb_eArgError, "array length:%d", num); \
267
- break; \
268
- case 3: \
269
- gl_SecondaryColor3##_type_(obj,args[0], args[1], args[2]); \
270
- break; \
271
- default: \
272
- rb_raise(rb_eArgError, "too many arguments"); \
273
- break; \
274
- } \
232
+ _type_ cary[3] = {0,0,0}; \
233
+ LOAD_GL_FUNC(gl##_name_,"1.4") \
234
+ Check_Type(arg1,T_ARRAY); \
235
+ _conv_(arg1,cary,3); \
236
+ fptr_gl##_name_(cary); \
237
+ CHECK_GLERROR \
275
238
  return Qnil; \
276
239
  }
277
240
 
278
- GLSECONDARYCOLOR_VFUNC(b)
279
- GLSECONDARYCOLOR_VFUNC(d)
280
- GLSECONDARYCOLOR_VFUNC(f)
281
- GLSECONDARYCOLOR_VFUNC(i)
282
- GLSECONDARYCOLOR_VFUNC(s)
283
- GLSECONDARYCOLOR_VFUNC(ui)
284
- GLSECONDARYCOLOR_VFUNC(ub)
285
- GLSECONDARYCOLOR_VFUNC(us)
241
+ GLSECONDARYCOLOR_VFUNC(SecondaryColor3bv,GLbyte,ary2cbyte)
242
+ GLSECONDARYCOLOR_VFUNC(SecondaryColor3dv,GLdouble,ary2cdbl)
243
+ GLSECONDARYCOLOR_VFUNC(SecondaryColor3fv,GLfloat,ary2cflt)
244
+ GLSECONDARYCOLOR_VFUNC(SecondaryColor3iv,GLint,ary2cint)
245
+ GLSECONDARYCOLOR_VFUNC(SecondaryColor3sv,GLshort,ary2cshort)
246
+ GLSECONDARYCOLOR_VFUNC(SecondaryColor3uiv,GLuint,ary2cuint)
247
+ GLSECONDARYCOLOR_VFUNC(SecondaryColor3ubv,GLubyte,ary2cubyte)
248
+ GLSECONDARYCOLOR_VFUNC(SecondaryColor3usv,GLushort,ary2cushort)
286
249
  #undef GLSECONDARYCOLOR_VFUNC
287
250
 
288
251
  extern VALUE g_SecondaryColor_ptr;
@@ -294,7 +257,7 @@ VALUE obj,arg1,arg2,arg3,arg4;
294
257
  GLint size;
295
258
  GLenum type;
296
259
  GLsizei stride;
297
- LOAD_GL_FUNC(glSecondaryColorPointer)
260
+ LOAD_GL_FUNC(glSecondaryColorPointer,"1.4")
298
261
  size = (GLint)NUM2INT(arg1);
299
262
  type = (GLenum)NUM2INT(arg2);
300
263
  stride = (GLsizei)NUM2UINT(arg3);
@@ -302,59 +265,37 @@ VALUE obj,arg1,arg2,arg3,arg4;
302
265
  g_SecondaryColor_ptr = arg4;
303
266
  fptr_glSecondaryColorPointer(size,type, stride, (const GLvoid*)NUM2INT(arg4));
304
267
  } else {
305
- Check_Type(arg4, T_STRING);
306
- rb_str_freeze(arg4);
307
- g_SecondaryColor_ptr = arg4;
308
- fptr_glSecondaryColorPointer(size,type, stride, (const GLvoid*)RSTRING(arg4)->ptr);
268
+ VALUE data;
269
+ data = pack_array_or_pass_string(type,arg4);
270
+ rb_str_freeze(data);
271
+ g_SecondaryColor_ptr = data;
272
+ fptr_glSecondaryColorPointer(size,type, stride, (const GLvoid*)RSTRING_PTR(data));
309
273
  }
274
+ CHECK_GLERROR
310
275
  return Qnil;
311
276
  }
312
277
 
313
- #define GLWINDOWPOS_VFUNC(_type_) \
314
- static VALUE \
315
- gl_WindowPos##_type_##v(argc,argv,obj) \
316
- int argc; \
317
- VALUE *argv; \
318
- VALUE obj; \
278
+ #define GLWINDOWPOS_VFUNC(_name_,_type_,_size_,_conv_) \
279
+ static void (APIENTRY * fptr_gl##_name_)(_type_ *); \
280
+ VALUE gl_##_name_(VALUE obj,VALUE arg1) \
319
281
  { \
320
- int num; \
321
- VALUE args[3]; \
322
- RArray *ary; \
323
- switch (num = rb_scan_args(argc, argv, "12", &args[0], &args[1], &args[2])) { \
324
- case 1: \
325
- if (TYPE(args[0]) == T_ARRAY) { \
326
- ary = RARRAY(args[0]); \
327
- switch (ary->len) { \
328
- case 2: \
329
- gl_WindowPos2##_type_(obj,ary->ptr[0],ary->ptr[1]); \
330
- break; \
331
- case 3: \
332
- gl_WindowPos3##_type_(obj,ary->ptr[0],ary->ptr[1],ary->ptr[2]); \
333
- break; \
334
- default: \
335
- rb_raise(rb_eArgError, "array length:%d", num); \
336
- } \
337
- } \
338
- else \
339
- rb_raise(rb_eArgError, "array length:%d", num); \
340
- break; \
341
- case 2: \
342
- gl_WindowPos2##_type_(obj,args[0], args[1]); \
343
- break; \
344
- case 3: \
345
- gl_WindowPos3##_type_(obj,args[0], args[1], args[2]); \
346
- break; \
347
- default: \
348
- rb_raise(rb_eArgError, "too many arguments"); \
349
- break; \
350
- } \
282
+ _type_ cary[3] = {0,0,0}; \
283
+ LOAD_GL_FUNC(gl##_name_,"1.4") \
284
+ Check_Type(arg1,T_ARRAY); \
285
+ _conv_(arg1,cary,_size_); \
286
+ fptr_gl##_name_(cary); \
287
+ CHECK_GLERROR \
351
288
  return Qnil; \
352
289
  }
353
290
 
354
- GLWINDOWPOS_VFUNC(d)
355
- GLWINDOWPOS_VFUNC(f)
356
- GLWINDOWPOS_VFUNC(i)
357
- GLWINDOWPOS_VFUNC(s)
291
+ GLWINDOWPOS_VFUNC(WindowPos2dv,GLdouble,2,ary2cdbl)
292
+ GLWINDOWPOS_VFUNC(WindowPos2fv,GLfloat,2,ary2cflt)
293
+ GLWINDOWPOS_VFUNC(WindowPos2iv,GLint,2,ary2cint)
294
+ GLWINDOWPOS_VFUNC(WindowPos2sv,GLshort,2,ary2cshort)
295
+ GLWINDOWPOS_VFUNC(WindowPos3dv,GLdouble,3,ary2cdbl)
296
+ GLWINDOWPOS_VFUNC(WindowPos3fv,GLfloat,3,ary2cflt)
297
+ GLWINDOWPOS_VFUNC(WindowPos3iv,GLint,3,ary2cint)
298
+ GLWINDOWPOS_VFUNC(WindowPos3sv,GLshort,3,ary2cshort)
358
299
  #undef GLWINDOWPOS_VFUNC
359
300
 
360
301
 
@@ -380,6 +321,14 @@ void gl_init_functions_1_4(VALUE module)
380
321
  rb_define_module_function(module, "glSecondaryColor3ub", gl_SecondaryColor3ub, 3);
381
322
  rb_define_module_function(module, "glSecondaryColor3ui", gl_SecondaryColor3ui, 3);
382
323
  rb_define_module_function(module, "glSecondaryColor3us", gl_SecondaryColor3us, 3);
324
+ rb_define_module_function(module, "glSecondaryColor3bv", gl_SecondaryColor3bv, 1);
325
+ rb_define_module_function(module, "glSecondaryColor3dv", gl_SecondaryColor3dv, 1);
326
+ rb_define_module_function(module, "glSecondaryColor3fv", gl_SecondaryColor3fv, 1);
327
+ rb_define_module_function(module, "glSecondaryColor3iv", gl_SecondaryColor3iv, 1);
328
+ rb_define_module_function(module, "glSecondaryColor3sv", gl_SecondaryColor3sv, 1);
329
+ rb_define_module_function(module, "glSecondaryColor3ubv", gl_SecondaryColor3ubv, 1);
330
+ rb_define_module_function(module, "glSecondaryColor3uiv", gl_SecondaryColor3uiv, 1);
331
+ rb_define_module_function(module, "glSecondaryColor3usv", gl_SecondaryColor3usv, 1);
383
332
  rb_define_module_function(module, "glSecondaryColorPointer", gl_SecondaryColorPointer, 4);
384
333
  rb_define_module_function(module, "glWindowPos2d", gl_WindowPos2d, 2);
385
334
  rb_define_module_function(module, "glWindowPos2f", gl_WindowPos2f, 2);
@@ -389,23 +338,12 @@ void gl_init_functions_1_4(VALUE module)
389
338
  rb_define_module_function(module, "glWindowPos3f", gl_WindowPos3f, 3);
390
339
  rb_define_module_function(module, "glWindowPos3i", gl_WindowPos3i, 3);
391
340
  rb_define_module_function(module, "glWindowPos3s", gl_WindowPos3s, 3);
392
-
393
- /* Additional Functions */
394
- rb_define_module_function(module, "glSecondaryColor3bv", gl_SecondaryColorbv, -1);
395
- rb_define_module_function(module, "glSecondaryColor3dv", gl_SecondaryColordv, -1);
396
- rb_define_module_function(module, "glSecondaryColor3fv", gl_SecondaryColorfv, -1);
397
- rb_define_module_function(module, "glSecondaryColor3iv", gl_SecondaryColoriv, -1);
398
- rb_define_module_function(module, "glSecondaryColor3sv", gl_SecondaryColorsv, -1);
399
- rb_define_module_function(module, "glSecondaryColor3ubv", gl_SecondaryColorubv, -1);
400
- rb_define_module_function(module, "glSecondaryColor3uiv", gl_SecondaryColoruiv, -1);
401
- rb_define_module_function(module, "glSecondaryColor3usv", gl_SecondaryColorusv, -1);
402
-
403
- rb_define_module_function(module, "glWindowPos2dv", gl_WindowPosdv, -1);
404
- rb_define_module_function(module, "glWindowPos2fv", gl_WindowPosfv, -1);
405
- rb_define_module_function(module, "glWindowPos2iv", gl_WindowPosiv, -1);
406
- rb_define_module_function(module, "glWindowPos2sv", gl_WindowPossv, -1);
407
- rb_define_module_function(module, "glWindowPos3dv", gl_WindowPosdv, -1);
408
- rb_define_module_function(module, "glWindowPos3fv", gl_WindowPosfv, -1);
409
- rb_define_module_function(module, "glWindowPos3iv", gl_WindowPosiv, -1);
410
- rb_define_module_function(module, "glWindowPos3sv", gl_WindowPossv, -1);
341
+ rb_define_module_function(module, "glWindowPos2dv", gl_WindowPos2dv, 1);
342
+ rb_define_module_function(module, "glWindowPos2fv", gl_WindowPos2fv, 1);
343
+ rb_define_module_function(module, "glWindowPos2iv", gl_WindowPos2iv, 1);
344
+ rb_define_module_function(module, "glWindowPos2sv", gl_WindowPos2sv, 1);
345
+ rb_define_module_function(module, "glWindowPos3dv", gl_WindowPos3dv, 1);
346
+ rb_define_module_function(module, "glWindowPos3fv", gl_WindowPos3fv, 1);
347
+ rb_define_module_function(module, "glWindowPos3iv", gl_WindowPos3iv, 1);
348
+ rb_define_module_function(module, "glWindowPos3sv", gl_WindowPos3sv, 1);
411
349
  }
@@ -17,76 +17,15 @@
17
17
 
18
18
  /* OpenGL 1.5 functions */
19
19
 
20
- GL_SIMPLE_FUNC_LOAD(EndQuery,1,GLenum,NUM2INT)
21
-
22
- static void (APIENTRY * fptr_glGenQueries)(GLsizei,GLuint *);
23
- static VALUE
24
- gl_GenQueries(obj,arg1)
25
- VALUE obj,arg1;
26
- {
27
- GLsizei n;
28
- GLuint *queries;
29
- RArray *ret;
30
- int i;
31
- LOAD_GL_FUNC(glGenQueries)
32
- n = (GLsizei)NUM2UINT(arg1);
33
- queries = ALLOC_N(GLuint, n);
34
- fptr_glGenQueries(n, queries);
35
- ret = RARRAY(rb_ary_new2(n));
36
- for (i = 0; i < n; i++)
37
- rb_ary_push((VALUE)ret, INT2NUM(queries[i]));
38
- xfree(queries);
39
- return (VALUE)ret;
40
- }
41
-
42
- static void (APIENTRY * fptr_glDeleteQueries)(GLsizei,GLuint *);
43
- static VALUE
44
- gl_DeleteQueries(obj,arg1)
45
- VALUE obj,arg1;
46
- {
47
- GLsizei n;
48
- GLuint *queries;
49
- LOAD_GL_FUNC(glDeleteQueries)
50
- if (TYPE(arg1)==T_ARRAY) {
51
- n = RARRAY(arg1)->len;
52
- queries = ALLOC_N(GLuint,n);
53
- ary2cuint(arg1,queries,n);
54
- fptr_glDeleteQueries( n, queries);
55
- xfree(queries);
56
- } else {
57
- GLuint query;
58
- query = NUM2INT(arg1);
59
- fptr_glDeleteQueries( 1, &query);
60
- }
61
- return Qnil;
62
- }
63
-
64
- static GLboolean (APIENTRY * fptr_glIsQuery)(GLuint);
65
- static VALUE
66
- gl_IsQuery(obj,arg1)
67
- VALUE obj,arg1;
68
- {
69
- GLuint query;
70
- GLboolean ret;
71
- LOAD_GL_FUNC(glIsQuery)
72
- query = (GLuint)NUM2UINT(arg1);
73
- ret = fptr_glIsQuery(query);
74
- return INT2NUM(ret);
75
- }
76
-
77
- static void (APIENTRY * fptr_glBeginQuery)(GLenum,GLuint);
78
- static VALUE
79
- gl_BeginQuery(obj,arg1,arg2)
80
- VALUE obj,arg1,arg2;
81
- {
82
- GLenum target;
83
- GLuint id;
84
- LOAD_GL_FUNC(glBeginQuery)
85
- target = (GLenum)NUM2INT(arg1);
86
- id = (GLuint)NUM2UINT(arg2);
87
- fptr_glBeginQuery(target,id);
88
- return Qnil;
89
- }
20
+ GL_FUNC_LOAD_1(EndQuery,GLvoid, GLenum, "1.5")
21
+ GL_FUNC_LOAD_1(IsQuery,GLboolean, GLuint, "1.5")
22
+ GL_FUNC_LOAD_2(BeginQuery,GLvoid, GLenum,GLuint, "1.5")
23
+ GL_FUNC_LOAD_2(BindBuffer,GLvoid, GLenum,GLuint, "1.5")
24
+ GL_FUNC_LOAD_1(IsBuffer,GLboolean, GLuint, "1.5")
25
+ GL_FUNC_GENOBJECTS_LOAD(GenQueries,"1.5")
26
+ GL_FUNC_DELETEOBJECTS_LOAD(DeleteQueries,"1.5")
27
+ GL_FUNC_GENOBJECTS_LOAD(GenBuffers,"1.5")
28
+ GL_FUNC_DELETEOBJECTS_LOAD(DeleteBuffers,"1.5")
90
29
 
91
30
  static void (APIENTRY * fptr_glGetQueryiv)(GLenum,GLenum,GLint *);
92
31
  static VALUE
@@ -96,14 +35,12 @@ VALUE obj,arg1,arg2;
96
35
  GLenum target;
97
36
  GLenum pname;
98
37
  GLint params = 0;
99
- VALUE retary;
100
- LOAD_GL_FUNC(glGetQueryiv)
38
+ LOAD_GL_FUNC(glGetQueryiv,"1.5")
101
39
  target = (GLenum)NUM2INT(arg1);
102
40
  pname = (GLenum)NUM2INT(arg2);
103
41
  fptr_glGetQueryiv(target,pname,&params);
104
- retary = rb_ary_new2(1);
105
- rb_ary_push(retary, INT2NUM(params));
106
- return retary;
42
+ CHECK_GLERROR
43
+ return RETCONV_GLint(params);
107
44
  }
108
45
 
109
46
  static void (APIENTRY * fptr_glGetQueryObjectiv)(GLuint,GLenum,GLint *);
@@ -114,101 +51,28 @@ VALUE obj,arg1,arg2;
114
51
  GLuint id;
115
52
  GLenum pname;
116
53
  GLint params = 0;
117
- VALUE retary;
118
- LOAD_GL_FUNC(glGetQueryObjectiv)
54
+ LOAD_GL_FUNC(glGetQueryObjectiv,"1.5")
119
55
  id = (GLuint)NUM2UINT(arg1);
120
56
  pname = (GLenum)NUM2INT(arg2);
121
57
  fptr_glGetQueryObjectiv(id,pname,&params);
122
- retary = rb_ary_new2(1);
123
- rb_ary_push(retary,INT2NUM(params));
124
- return retary;
58
+ CHECK_GLERROR
59
+ return cond_GLBOOL2RUBY(pname,params);
125
60
  }
126
61
 
127
62
  static void (APIENTRY * fptr_glGetQueryObjectuiv)(GLuint,GLenum,GLuint *);
128
63
  static VALUE
129
- gl_GetQueryObjectuiv(obj,arg1,arg2,arg3)
130
- VALUE obj,arg1,arg2,arg3;
64
+ gl_GetQueryObjectuiv(obj,arg1,arg2)
65
+ VALUE obj,arg1,arg2;
131
66
  {
132
67
  GLuint id;
133
68
  GLenum pname;
134
69
  GLuint params = 0;
135
- VALUE retary;
136
- LOAD_GL_FUNC(glGetQueryObjectuiv)
70
+ LOAD_GL_FUNC(glGetQueryObjectuiv,"1.5")
137
71
  id = (GLuint)NUM2UINT(arg1);
138
72
  pname = (GLenum)NUM2INT(arg2);
139
73
  fptr_glGetQueryObjectuiv(id,pname,&params);
140
- retary = rb_ary_new2(1);
141
- rb_ary_push(retary,INT2NUM(params));
142
- return retary;
143
- }
144
-
145
- static void (APIENTRY * fptr_glBindBuffer)(GLenum,GLuint);
146
- static VALUE
147
- gl_BindBuffer(obj,arg1,arg2)
148
- VALUE obj,arg1,arg2;
149
- {
150
- GLenum target;
151
- GLuint buffer;
152
- LOAD_GL_FUNC(glBindBuffer)
153
- target = (GLenum)NUM2INT(arg1);
154
- buffer = (GLenum)NUM2INT(arg2);
155
- fptr_glBindBuffer(target,buffer);
156
- return Qnil;
157
- }
158
-
159
- static void (APIENTRY * fptr_glDeleteBuffers)(GLsizei,GLuint *);
160
- static VALUE
161
- gl_DeleteBuffers(obj,arg1)
162
- VALUE obj,arg1;
163
- {
164
- GLsizei n;
165
- GLuint *buffers;
166
- LOAD_GL_FUNC(glDeleteBuffers)
167
- if (TYPE(arg1)==T_ARRAY) {
168
- n = RARRAY(arg1)->len;
169
- buffers = ALLOC_N(GLuint,n);
170
- ary2cuint(arg1,buffers,n);
171
- fptr_glDeleteBuffers(n, buffers);
172
- xfree(buffers);
173
- } else {
174
- GLuint buffer;
175
- buffer = NUM2INT(arg1);
176
- fptr_glDeleteBuffers(1, &buffer);
177
- }
178
- return Qnil;
179
- }
180
-
181
- static void (APIENTRY * fptr_glGenBuffers)(GLsizei,GLuint *);
182
- static VALUE
183
- gl_GenBuffers(obj,arg1)
184
- VALUE obj,arg1;
185
- {
186
- GLsizei n;
187
- GLuint *buffers;
188
- RArray *ret;
189
- int i;
190
- LOAD_GL_FUNC(glGenBuffers)
191
- n = (GLsizei)NUM2UINT(arg1);
192
- buffers = ALLOC_N(GLuint, n);
193
- fptr_glGenBuffers(n, buffers);
194
- ret = RARRAY(rb_ary_new2(n));
195
- for (i = 0; i < n; i++)
196
- rb_ary_push((VALUE)ret, INT2NUM(buffers[i]));
197
- xfree(buffers);
198
- return (VALUE)ret;
199
- }
200
-
201
- static GLboolean (APIENTRY * fptr_glIsBuffer)(GLuint);
202
- static VALUE
203
- gl_IsBuffer(obj,arg1)
204
- VALUE obj,arg1;
205
- {
206
- GLuint buffer;
207
- GLboolean ret;
208
- LOAD_GL_FUNC(glIsBuffer)
209
- buffer = (GLuint)NUM2UINT(arg1);
210
- ret = fptr_glIsBuffer(buffer);
211
- return INT2NUM(ret);
74
+ CHECK_GLERROR
75
+ return cond_GLBOOL2RUBY_U(pname,params);
212
76
  }
213
77
 
214
78
  static void (APIENTRY * fptr_glBufferData)(GLenum,GLsizeiptr,GLvoid *,GLenum);
@@ -219,17 +83,18 @@ VALUE obj,arg1,arg2,arg3,arg4;
219
83
  GLenum target;
220
84
  GLsizeiptr size;
221
85
  GLenum usage;
222
- LOAD_GL_FUNC(glBufferData)
86
+ LOAD_GL_FUNC(glBufferData,"1.5")
223
87
  target = (GLenum)NUM2INT(arg1);
224
88
  size = (GLsizeiptr)NUM2INT(arg2);
225
89
  usage = (GLenum)NUM2INT(arg4);
226
90
  if (TYPE(arg3) == T_STRING) {
227
- fptr_glBufferData(target,size,(GLvoid *)RSTRING(arg3)->ptr,usage);
91
+ fptr_glBufferData(target,size,(GLvoid *)RSTRING_PTR(arg3),usage);
228
92
  } else if (NIL_P(arg3)) {
229
93
  fptr_glBufferData(target,size,NULL,usage);
230
94
  } else {
231
95
  Check_Type(arg3,T_STRING); /* force exception */
232
96
  }
97
+ CHECK_GLERROR
233
98
  return Qnil;
234
99
  }
235
100
 
@@ -241,12 +106,13 @@ VALUE obj,arg1,arg2,arg3,arg4;
241
106
  GLenum target;
242
107
  GLintptr offset;
243
108
  GLsizeiptr size;
244
- LOAD_GL_FUNC(glBufferSubData)
109
+ LOAD_GL_FUNC(glBufferSubData,"1.5")
245
110
  target = (GLenum)NUM2INT(arg1);
246
111
  offset = (GLintptr)NUM2INT(arg2);
247
112
  size = (GLsizeiptr)NUM2INT(arg3);
248
113
  Check_Type(arg4,T_STRING);
249
- fptr_glBufferSubData(target,offset,size,(GLvoid *)RSTRING(arg4)->ptr);
114
+ fptr_glBufferSubData(target,offset,size,(GLvoid *)RSTRING_PTR(arg4));
115
+ CHECK_GLERROR
250
116
  return Qnil;
251
117
  }
252
118
 
@@ -259,12 +125,13 @@ VALUE obj,arg1,arg2,arg3;
259
125
  GLintptr offset;
260
126
  GLsizeiptr size;
261
127
  VALUE data;
262
- LOAD_GL_FUNC(glGetBufferSubData)
128
+ LOAD_GL_FUNC(glGetBufferSubData,"1.5")
263
129
  target = (GLenum)NUM2INT(arg1);
264
130
  offset = (GLintptr)NUM2INT(arg2);
265
131
  size = (GLsizeiptr)NUM2INT(arg3);
266
132
  data = allocate_buffer_with_string(size);
267
- fptr_glGetBufferSubData(target,offset,size,(GLvoid *)RSTRING(data)->ptr);
133
+ fptr_glGetBufferSubData(target,offset,size,(GLvoid *)RSTRING_PTR(data));
134
+ CHECK_GLERROR
268
135
  return data;
269
136
  }
270
137
 
@@ -276,14 +143,12 @@ VALUE obj,arg1,arg2;
276
143
  GLenum target;
277
144
  GLenum value;
278
145
  GLint data = 0;
279
- VALUE retary;
280
- LOAD_GL_FUNC(glGetBufferParameteriv)
146
+ LOAD_GL_FUNC(glGetBufferParameteriv,"1.5")
281
147
  target = (GLenum)NUM2INT(arg1);
282
148
  value = (GLenum)NUM2INT(arg2);
283
149
  fptr_glGetBufferParameteriv(target,value,&data);
284
- retary = rb_ary_new2(1);
285
- rb_ary_push(retary,INT2NUM(data));
286
- return retary;
150
+ CHECK_GLERROR
151
+ return cond_GLBOOL2RUBY(value,data);
287
152
  }
288
153
 
289
154
  static GLvoid * (APIENTRY * fptr_glMapBuffer)(GLenum,GLenum);
@@ -296,16 +161,18 @@ VALUE obj,arg1,arg2;
296
161
  GLint size = 0;
297
162
  VALUE data;
298
163
  GLvoid *buffer_ptr = NULL;
299
- LOAD_GL_FUNC(glMapBuffer)
300
- LOAD_GL_FUNC(glGetBufferParameteriv)
164
+ LOAD_GL_FUNC(glMapBuffer,"1.5")
165
+ LOAD_GL_FUNC(glGetBufferParameteriv,"1.5")
301
166
  target = (GLenum)NUM2INT(arg1);
302
167
  access = (GLenum)NUM2INT(arg2);
303
168
  fptr_glGetBufferParameteriv(target,GL_BUFFER_SIZE,&size);
169
+ CHECK_GLERROR
304
170
  buffer_ptr = fptr_glMapBuffer(target,access);
171
+ CHECK_GLERROR
305
172
  if (buffer_ptr==NULL || size<=0)
306
173
  return Qnil;
307
174
  data = allocate_buffer_with_string(size);
308
- memcpy(RSTRING(data)->ptr, buffer_ptr, size);
175
+ memcpy(RSTRING_PTR(data), buffer_ptr, size);
309
176
  return data;
310
177
  }
311
178
 
@@ -316,10 +183,11 @@ VALUE obj,arg1;
316
183
  {
317
184
  GLenum target;
318
185
  GLboolean ret;
319
- LOAD_GL_FUNC(glUnmapBuffer)
186
+ LOAD_GL_FUNC(glUnmapBuffer,"1.5")
320
187
  target = (GLenum)NUM2INT(arg1);
321
188
  ret = fptr_glUnmapBuffer(target);
322
- return INT2NUM(ret);
189
+ CHECK_GLERROR
190
+ return GLBOOL2RUBY(ret);
323
191
  }
324
192
 
325
193
  static void (APIENTRY * fptr_glGetBufferPointerv)(GLenum,GLenum,GLvoid **);
@@ -327,8 +195,9 @@ static VALUE
327
195
  gl_GetBufferPointerv(obj,arg1,arg2,arg3)
328
196
  VALUE obj,arg1,arg2,arg3;
329
197
  {
330
- LOAD_GL_FUNC(glGetBufferPointerv)
198
+ LOAD_GL_FUNC(glGetBufferPointerv,"1.5")
331
199
  rb_raise(rb_eArgError, "glGetBufferPointerv not implemented");
200
+ CHECK_GLERROR
332
201
  return Qnil;
333
202
  }
334
203