ruby-opengl 0.40.1 → 0.50.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. data/Rakefile +2 -2
  2. data/doc/build_install.txt +48 -28
  3. data/doc/extensions.txt +361 -0
  4. data/doc/history.txt +8 -2
  5. data/doc/requirements_and_design.txt +0 -13
  6. data/doc/roadmap.txt +11 -13
  7. data/doc/supplies/page_template.html +11 -5
  8. data/doc/thanks.txt +2 -4
  9. data/doc/tutorial.txt +1 -4
  10. data/examples/{nehe_lesson02.rb → NeHe/nehe_lesson02.rb} +0 -0
  11. data/examples/{nehe_lesson03.rb → NeHe/nehe_lesson03.rb} +0 -0
  12. data/examples/{nehe_lesson04.rb → NeHe/nehe_lesson04.rb} +0 -0
  13. data/examples/{nehe_lesson05.rb → NeHe/nehe_lesson05.rb} +0 -0
  14. data/examples/NeHe/nehe_lesson36.rb +303 -0
  15. data/examples/OrangeBook/3Dlabs-License.txt +33 -0
  16. data/examples/OrangeBook/brick.frag +36 -0
  17. data/examples/OrangeBook/brick.rb +388 -0
  18. data/examples/OrangeBook/brick.vert +41 -0
  19. data/examples/OrangeBook/particle.frag +17 -0
  20. data/examples/OrangeBook/particle.rb +424 -0
  21. data/examples/OrangeBook/particle.vert +38 -0
  22. data/examples/README +13 -83
  23. data/examples/RedBook/aaindex.rb +97 -0
  24. data/examples/RedBook/aapoly.rb +142 -0
  25. data/examples/RedBook/aargb.rb +119 -0
  26. data/examples/RedBook/accanti.rb +162 -0
  27. data/examples/RedBook/accpersp.rb +215 -0
  28. data/examples/RedBook/alpha.rb +123 -0
  29. data/examples/RedBook/alpha3D.rb +158 -0
  30. data/examples/RedBook/bezcurve.rb +105 -0
  31. data/examples/RedBook/bezmesh.rb +137 -0
  32. data/examples/RedBook/checker.rb +124 -0
  33. data/examples/RedBook/clip.rb +95 -0
  34. data/examples/RedBook/colormat.rb +135 -0
  35. data/examples/RedBook/cube.rb +69 -0
  36. data/examples/RedBook/depthcue.rb +99 -0
  37. data/examples/RedBook/dof.rb +205 -0
  38. data/examples/{legacy → RedBook}/double.rb +59 -58
  39. data/examples/{legacy → RedBook}/drawf.rb +47 -54
  40. data/examples/RedBook/feedback.rb +145 -0
  41. data/examples/RedBook/fog.rb +167 -0
  42. data/examples/RedBook/font.rb +151 -0
  43. data/examples/RedBook/hello.rb +79 -0
  44. data/examples/RedBook/image.rb +137 -0
  45. data/examples/{legacy → RedBook}/jitter.rb +60 -62
  46. data/examples/RedBook/lines.rb +128 -0
  47. data/examples/RedBook/list.rb +111 -0
  48. data/examples/RedBook/material.rb +275 -0
  49. data/examples/RedBook/mipmap.rb +156 -0
  50. data/examples/{legacy → RedBook}/model.rb +66 -72
  51. data/examples/{legacy → RedBook}/movelight.rb +67 -75
  52. data/examples/RedBook/pickdepth.rb +179 -0
  53. data/examples/{legacy → RedBook}/planet.rb +62 -66
  54. data/examples/RedBook/quadric.rb +158 -0
  55. data/examples/RedBook/robot.rb +115 -0
  56. data/examples/RedBook/select.rb +196 -0
  57. data/examples/RedBook/smooth.rb +95 -0
  58. data/examples/RedBook/stencil.rb +163 -0
  59. data/examples/RedBook/stroke.rb +167 -0
  60. data/examples/RedBook/surface.rb +166 -0
  61. data/examples/RedBook/teaambient.rb +132 -0
  62. data/examples/RedBook/teapots.rb +182 -0
  63. data/examples/RedBook/tess.rb +183 -0
  64. data/examples/RedBook/texbind.rb +147 -0
  65. data/examples/RedBook/texgen.rb +169 -0
  66. data/examples/RedBook/texturesurf.rb +128 -0
  67. data/examples/RedBook/varray.rb +159 -0
  68. data/examples/RedBook/wrap.rb +148 -0
  69. data/examples/misc/anisotropic.rb +194 -0
  70. data/examples/misc/font-glut.rb +46 -0
  71. data/examples/{plane.rb → misc/plane.rb} +0 -0
  72. data/examples/misc/readpixel.rb +65 -0
  73. data/examples/{smooth.rb → misc/smooth.rb} +0 -0
  74. data/examples/{test.rb → misc/test.rb} +0 -0
  75. data/ext/common/common.h +252 -70
  76. data/ext/common/gl-enums.h +6102 -7334
  77. data/ext/common/gl-types.h +47 -0
  78. data/ext/common/glu-enums.h +469 -0
  79. data/ext/gl/gl-1.0-1.1.c +842 -2464
  80. data/ext/gl/gl-1.2.c +217 -281
  81. data/ext/gl/gl-1.3.c +113 -133
  82. data/ext/gl/gl-1.4.c +98 -334
  83. data/ext/gl/gl-1.5.c +28 -34
  84. data/ext/gl/gl-2.0.c +26 -235
  85. data/ext/gl/gl-2.1.c +31 -124
  86. data/ext/gl/gl-enums.c +786 -631
  87. data/ext/gl/gl-ext-arb.c +66 -0
  88. data/ext/gl/gl-ext-ext.c +218 -0
  89. data/ext/gl/gl.c +138 -31
  90. data/ext/gl/mkrf_conf.rb +1 -0
  91. data/ext/glu/glu-enums.c +163 -0
  92. data/ext/glu/glu.c +1003 -1205
  93. data/ext/glu/mkrf_conf.rb +1 -0
  94. data/ext/glut/glut.c +1056 -1175
  95. data/lib/opengl.rb +90 -3
  96. data/test/tc_common.rb +26 -13
  97. data/test/tc_ext_arb.rb +73 -0
  98. data/test/tc_ext_ext.rb +74 -0
  99. data/test/tc_func_12.rb +8 -8
  100. data/test/tc_func_13.rb +17 -11
  101. data/test/tc_func_14.rb +8 -8
  102. data/test/tc_func_15.rb +190 -2
  103. data/test/tc_func_20.rb +36 -10
  104. data/test/tc_func_21.rb +445 -2
  105. data/test/tc_glu.rb +305 -0
  106. data/test/tc_misc.rb +1 -0
  107. metadata +84 -68
  108. data/doc/screenshots.txt +0 -23
  109. data/examples/legacy/COPYRIGHT +0 -8
  110. data/examples/legacy/aaindex.rb +0 -98
  111. data/examples/legacy/aapoly.rb +0 -153
  112. data/examples/legacy/aargb.rb +0 -139
  113. data/examples/legacy/accanti.rb +0 -159
  114. data/examples/legacy/accpersp.rb +0 -216
  115. data/examples/legacy/alpha.rb +0 -133
  116. data/examples/legacy/alpha3D.rb +0 -165
  117. data/examples/legacy/bezcurve.rb +0 -107
  118. data/examples/legacy/bezmesh.rb +0 -131
  119. data/examples/legacy/checker.rb +0 -121
  120. data/examples/legacy/clip.rb +0 -104
  121. data/examples/legacy/colormat.rb +0 -145
  122. data/examples/legacy/cube.rb +0 -73
  123. data/examples/legacy/depthcue.rb +0 -101
  124. data/examples/legacy/dof.rb +0 -212
  125. data/examples/legacy/feedback.rb +0 -152
  126. data/examples/legacy/fog.rb +0 -172
  127. data/examples/legacy/font-glut.rb +0 -41
  128. data/examples/legacy/font.rb +0 -158
  129. data/examples/legacy/hello.rb +0 -75
  130. data/examples/legacy/image.rb +0 -145
  131. data/examples/legacy/lines.rb +0 -135
  132. data/examples/legacy/list.rb +0 -120
  133. data/examples/legacy/material.rb +0 -290
  134. data/examples/legacy/mipmap.rb +0 -159
  135. data/examples/legacy/pickdepth.rb +0 -180
  136. data/examples/legacy/quadric.rb +0 -180
  137. data/examples/legacy/readpixel.rb +0 -59
  138. data/examples/legacy/robot.rb +0 -120
  139. data/examples/legacy/select.rb +0 -207
  140. data/examples/legacy/smooth.rb +0 -41
  141. data/examples/legacy/stencil.rb +0 -154
  142. data/examples/legacy/stroke.rb +0 -170
  143. data/examples/legacy/surface.rb +0 -170
  144. data/examples/legacy/teaambient.rb +0 -132
  145. data/examples/legacy/teapots.rb +0 -188
  146. data/examples/legacy/tess.rb +0 -222
  147. data/examples/legacy/texbind.rb +0 -157
  148. data/examples/legacy/texgen.rb +0 -171
  149. data/examples/legacy/texturesurf.rb +0 -128
  150. data/examples/legacy/varray.rb +0 -167
  151. data/examples/legacy/wrap.rb +0 -158
  152. data/lib/gl_prev.rb +0 -46
  153. data/lib/glu_prev.rb +0 -46
  154. data/lib/glut_prev.rb +0 -45
@@ -0,0 +1,33 @@
1
+ Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions
6
+ are met:
7
+
8
+ Redistributions of source code must retain the above copyright
9
+ notice, this list of conditions and the following disclaimer.
10
+
11
+ Redistributions in binary form must reproduce the above
12
+ copyright notice, this list of conditions and the following
13
+ disclaimer in the documentation and/or other materials provided
14
+ with the distribution.
15
+
16
+ Neither the name of 3Dlabs Inc. Ltd. nor the names of its
17
+ contributors may be used to endorse or promote products derived
18
+ from this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24
+ COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30
+ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
+ POSSIBILITY OF SUCH DAMAGE.
32
+
33
+
@@ -0,0 +1,36 @@
1
+ //
2
+ // Fragment shader for procedural bricks
3
+ //
4
+ // Authors: Dave Baldwin, Steve Koren, Randi Rost
5
+ // based on a shader by Darwyn Peachey
6
+ //
7
+ // Copyright (c) 2002-2004 3Dlabs Inc. Ltd.
8
+ //
9
+ // See 3Dlabs-License.txt for license information
10
+ //
11
+
12
+ uniform vec3 BrickColor, MortarColor;
13
+ uniform vec2 BrickSize;
14
+ uniform vec2 BrickPct;
15
+
16
+ varying vec2 MCposition;
17
+ varying float LightIntensity;
18
+
19
+ void main(void)
20
+ {
21
+ vec3 color;
22
+ vec2 position, useBrick;
23
+
24
+ position = MCposition / BrickSize;
25
+
26
+ if (fract(position.y * 0.5) > 0.5)
27
+ position.x += 0.5;
28
+
29
+ position = fract(position);
30
+
31
+ useBrick = step(position, BrickPct);
32
+
33
+ color = mix(MortarColor, BrickColor, useBrick.x * useBrick.y);
34
+ color *= LightIntensity;
35
+ gl_FragColor = vec4 (color, 1.0);
36
+ }
@@ -0,0 +1,388 @@
1
+ # Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions
6
+ # are met:
7
+ #
8
+ # Redistributions of source code must retain the above copyright
9
+ # notice, this list of conditions and the following disclaimer.
10
+ #
11
+ # Redistributions in binary form must reproduce the above
12
+ # copyright notice, this list of conditions and the following
13
+ # disclaimer in the documentation and/or other materials provided
14
+ # with the distribution.
15
+ #
16
+ # Neither the name of 3Dlabs Inc. Ltd. nor the names of its
17
+ # contributors may be used to endorse or promote products derived
18
+ # from this software without specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23
+ # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24
+ # COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25
+ # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26
+ # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27
+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
+ # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30
+ # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
+ # POSSIBILITY OF SUCH DAMAGE.
32
+ # ===========================================================================
33
+ #
34
+ #
35
+ # The source of the shaders itself are in plain text files. Files ending in
36
+ # .vert are vertex shaders, and files ending in .frag are fragment shaders.
37
+
38
+ require 'opengl'
39
+ include Gl,Glu,Glut
40
+
41
+ $rotl = 1 * Math::PI / 180
42
+ $last_time = 0
43
+
44
+ $fXDiff = 206
45
+ $fYDiff = 16
46
+ $fZDiff = 10
47
+ $xLastIncr = 0
48
+ $yLastIncr = 0
49
+ $fXInertia = -0.5
50
+ $fYInertia = 0
51
+ $fXInertiaOld = 0
52
+ $fYInertiaOld = 0
53
+ $fScale = 1.0
54
+ $ftime = 0
55
+ $xLast = -1
56
+ $yLast = -1
57
+ $bmModifiers = 0
58
+ $rotate = true
59
+
60
+ INERTIA_THRESHOLD = 1.0
61
+ INERTIA_FACTOR = 0.5
62
+ SCALE_FACTOR = 0.01
63
+ SCALE_INCREMENT = 0.5
64
+ TIMER_FREQUENCY_MILLIS = 20
65
+
66
+
67
+ $gleModel = [:cube, :teapot,:torus,:sphere]
68
+ $clearColor = [[0,0,0,1], [0.2,0.2,0.3,1], [0.7,0.7,0.7,1]]
69
+
70
+ def drawCube
71
+ size = 1.0
72
+ scale = 0.2
73
+ delta = 0.1
74
+
75
+ v = [
76
+ [ size, size, size * scale + delta ],
77
+ [ size, size, -size * scale + delta ],
78
+ [ size, -size, -size * scale ],
79
+ [ size, -size, size * scale ],
80
+ [-size, size, size * scale + delta ],
81
+ [-size, size, -size * scale + delta ],
82
+ [-size, -size, -size * scale ],
83
+ [-size, -size, size * scale ]
84
+ ]
85
+
86
+ cube = [
87
+ [ [1,0,0], v[3],v[2],v[1],v[0] ], # normal, vertices
88
+ [ [-1,0,0], v[6],v[7],v[4],v[5] ],
89
+ [ [0,0,-1], v[2],v[6],v[5],v[1] ],
90
+ [ [0,0,1], v[7],v[3],v[0],v[4] ],
91
+ [ [0,1,0], v[4],v[0],v[1],v[5] ],
92
+ [ [0,-1,0], v[6],v[2],v[3],v[7] ]
93
+ ]
94
+
95
+ glBegin(GL_QUADS)
96
+ cube.each do |side|
97
+ glNormal3fv(side[0])
98
+
99
+ glTexCoord2f(1,1)
100
+ glVertex3fv(side[1])
101
+ glTexCoord2f(0,1)
102
+ glVertex3fv(side[2])
103
+ glTexCoord2f(0,0)
104
+ glVertex3fv(side[3])
105
+ glTexCoord2f(1,0)
106
+ glVertex3fv(side[4])
107
+ end
108
+ glEnd()
109
+ end
110
+
111
+ def nextClearColor
112
+ glClearColor($clearColor[0][0],
113
+ $clearColor[0][1],
114
+ $clearColor[0][2],
115
+ $clearColor[0][3])
116
+ $clearColor << $clearColor.shift # rotate
117
+ end
118
+
119
+
120
+ play = lambda do
121
+ this_time = glutGet(GLUT_ELAPSED_TIME)
122
+
123
+ $rotl+=(this_time - $last_time) * -0.001
124
+ $last_time = this_time
125
+
126
+ glutPostRedisplay()
127
+ end
128
+
129
+ display = lambda do
130
+ glLoadIdentity()
131
+ glTranslatef(0.0, 0.0, -5.0)
132
+
133
+ glRotatef($fYDiff, 1,0,0)
134
+ glRotatef($fXDiff, 0,1,0)
135
+ glRotatef($fZDiff, 0,0,1)
136
+
137
+ glScalef($fScale, $fScale, $fScale)
138
+
139
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
140
+
141
+ case $gleModel[0]
142
+ when :teapot :
143
+ glutSolidTeapot(0.6)
144
+ when :torus :
145
+ glutSolidTorus(0.2, 0.6, 64, 64)
146
+ when :sphere :
147
+ glutSolidSphere(0.6, 64, 64)
148
+ when :cube :
149
+ drawCube()
150
+ end
151
+ glFlush()
152
+ glutSwapBuffers()
153
+ end
154
+
155
+ key = lambda do |key,x,y|
156
+ case(key)
157
+ when ?b
158
+ nextClearColor()
159
+ when ?q, 27 # esc
160
+ exit(0)
161
+ when ?t
162
+ $gleModel << $gleModel.shift # rotate the array
163
+ when 32 # spacebar
164
+ $rotate = !$rotate
165
+
166
+ if ($rotate==false)
167
+ $fXInertiaOld = $fXInertia
168
+ $fYInertiaOld = $fYInertia
169
+ else
170
+ $fXInertia = $fXInertiaOld
171
+ $fYInertia = $fYInertiaOld
172
+
173
+ # To prevent confusion, force some rotation
174
+ if ($fXInertia == 0 && $fYInertia == 0)
175
+ $fXInertia = -0.5
176
+ end
177
+ end
178
+ when ?+
179
+ $fScale += SCALE_INCREMENT
180
+ when ?-
181
+ $fScale -= SCALE_INCREMENT
182
+ else
183
+ puts "Keyboard commands:\n"
184
+ puts "b - Toggle among background clear colors"
185
+ puts "q, <esc> - Quit"
186
+ puts "t - Toggle among models to render"
187
+ puts "? - Help"
188
+ puts "<home> - reset zoom and rotation"
189
+ puts "<space> or <click> - stop rotation"
190
+ puts "<+>, <-> or <ctrl + drag> - zoom model"
191
+ puts "<arrow keys> or <drag> - rotate model\n"
192
+ end
193
+ end
194
+
195
+ reshape = lambda do |w,h|
196
+ vp = 0.8
197
+ aspect = w.to_f/h.to_f
198
+
199
+ glViewport(0, 0, w, h)
200
+ glMatrixMode(GL_PROJECTION)
201
+ glLoadIdentity()
202
+
203
+ glFrustum(-vp, vp, -vp / aspect, vp / aspect, 3, 10)
204
+
205
+ glMatrixMode(GL_MODELVIEW)
206
+ glLoadIdentity()
207
+ glTranslatef(0.0, 0.0, -5.0)
208
+ end
209
+
210
+ motion = lambda do |x,y|
211
+ if ($xLast != -1 || $yLast != -1)
212
+ $xLastIncr = x - $xLast
213
+ $yLastIncr = y - $yLast
214
+ if ($bmModifiers & GLUT_ACTIVE_CTRL != 0)
215
+ if ($xLast != -1)
216
+ $fZDiff += $xLastIncr
217
+ $fScale += $yLastIncr*SCALE_FACTOR
218
+ end
219
+ else
220
+ if ($xLast != -1)
221
+ $fXDiff += $xLastIncr
222
+ $fYDiff += $yLastIncr
223
+ end
224
+ end
225
+ end
226
+ $xLast = x
227
+ $yLast = y
228
+ end
229
+
230
+ mouse = lambda do |button,state,x,y|
231
+ $bmModifiers = glutGetModifiers()
232
+ if (button == GLUT_LEFT_BUTTON)
233
+ if (state == GLUT_UP)
234
+ $xLast = -1
235
+ $yLast = -1
236
+ if $xLastIncr > INERTIA_THRESHOLD
237
+ $fXInertia = ($xLastIncr - INERTIA_THRESHOLD)*INERTIA_FACTOR
238
+ end
239
+ if -$xLastIncr > INERTIA_THRESHOLD
240
+ $fXInertia = ($xLastIncr + INERTIA_THRESHOLD)*INERTIA_FACTOR
241
+ end
242
+
243
+ if $yLastIncr > INERTIA_THRESHOLD
244
+ $fYInertia = ($yLastIncr - INERTIA_THRESHOLD)*INERTIA_FACTOR
245
+ end
246
+ if -$yLastIncr > INERTIA_THRESHOLD
247
+ $fYInertia = ($yLastIncr + INERTIA_THRESHOLD)*INERTIA_FACTOR
248
+ end
249
+ else
250
+ $fXInertia = 0
251
+ $fYInertia = 0
252
+ end
253
+ $xLastIncr = 0
254
+ $yLastIncr = 0
255
+ end
256
+ end
257
+
258
+ special = lambda do |key,x,y|
259
+ case key
260
+ when GLUT_KEY_HOME:
261
+ $fXDiff = 0
262
+ $fYDiff = 35
263
+ $fZDiff = 0
264
+ $xLastIncr = 0
265
+ $yLastIncr = 0
266
+ $fXInertia = -0.5
267
+ $fYInertia = 0
268
+ $fScale = 1.0
269
+ when GLUT_KEY_LEFT:
270
+ $fXDiff -= 1
271
+ when GLUT_KEY_RIGHT:
272
+ $fXDiff += 1
273
+ when GLUT_KEY_UP:
274
+ $fYDiff -= 1
275
+ when GLUT_KEY_DOWN:
276
+ $fYDiff += 1
277
+ end
278
+ end
279
+
280
+ timer = lambda do |value|
281
+ $ftime += 0.01
282
+ if $rotate
283
+ $fXDiff += $fXInertia
284
+ $fYDiff += $fYInertia
285
+ end
286
+ glutTimerFunc(TIMER_FREQUENCY_MILLIS , timer, 0)
287
+ end
288
+
289
+ def printOpenGLError
290
+ glErr = glGetError()
291
+ if (glErr != GL_NO_ERROR)
292
+ puts "glError - #{gluErrorString(glErr)}"
293
+ raise
294
+ end
295
+ end
296
+
297
+ def getUniLoc(program, name)
298
+ loc = glGetUniformLocation(program, name)
299
+
300
+ if (loc == -1)
301
+ puts "No such uniform named #{name}"
302
+ end
303
+ printOpenGLError()
304
+ return loc
305
+ end
306
+
307
+ def installBrickShaders(vs_fname,fs_fname)
308
+ # Create a vertex shader object and a fragment shader object
309
+ brickVS = glCreateShader(GL_VERTEX_SHADER)
310
+ brickFS = glCreateShader(GL_FRAGMENT_SHADER)
311
+
312
+ # Load source code strings into shaders
313
+ glShaderSource(brickVS, File.read(vs_fname))
314
+ glShaderSource(brickFS, File.read(fs_fname))
315
+
316
+ # Compile the brick vertex shader, and print out
317
+ # the compiler log file.
318
+ glCompileShader(brickVS)
319
+ printOpenGLError()
320
+ vertCompiled = glGetShaderiv(brickVS, GL_COMPILE_STATUS)
321
+ puts "Shader InfoLog:\n#{glGetShaderInfoLog(brickVS)}\n"
322
+
323
+ # Compile the brick fragment shader, and print out
324
+ # the compiler log file.
325
+ glCompileShader(brickFS)
326
+ printOpenGLError()
327
+ fragCompiled = glGetShaderiv(brickFS, GL_COMPILE_STATUS)
328
+ puts "Shader InfoLog:\n#{glGetShaderInfoLog(brickFS)}\n"
329
+
330
+ return false if (vertCompiled == 0 || fragCompiled == 0)
331
+ # Create a program object and attach the two compiled shaders
332
+ brickProg = glCreateProgram()
333
+ glAttachShader(brickProg,brickVS)
334
+ glAttachShader(brickProg,brickFS)
335
+ # Link the program object and print out the info log
336
+ glLinkProgram(brickProg)
337
+ printOpenGLError()
338
+ linked = glGetProgramiv(brickProg,GL_LINK_STATUS)
339
+ puts "Program InfoLog:\n#{glGetProgramInfoLog(brickProg)}\n"
340
+ return false if linked==0
341
+
342
+ # Install program object as part of current state
343
+ glUseProgram(brickProg)
344
+
345
+ # Set up initial uniform values
346
+ glUniform3f(getUniLoc(brickProg, "BrickColor"), 1.0, 0.3, 0.2)
347
+ glUniform3f(getUniLoc(brickProg, "MortarColor"), 0.85, 0.86, 0.84)
348
+ glUniform2f(getUniLoc(brickProg, "BrickSize"), 0.30, 0.15)
349
+ glUniform2f(getUniLoc(brickProg, "BrickPct"), 0.90, 0.85)
350
+ glUniform3f(getUniLoc(brickProg, "LightPosition"), 0.0, 0.0, 4.0)
351
+
352
+ return true
353
+ end
354
+
355
+ # Main
356
+
357
+ glutInit()
358
+ glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE)
359
+ glutInitWindowPosition(100,100)
360
+ glutInitWindowSize(500, 500)
361
+ glutCreateWindow( "3Dlabs Brick Shader")
362
+
363
+ glutIdleFunc(play)
364
+ glutDisplayFunc(display)
365
+ glutKeyboardFunc(key)
366
+ glutReshapeFunc(reshape)
367
+ glutMotionFunc(motion)
368
+ glutMouseFunc(mouse)
369
+ glutSpecialFunc(special)
370
+ glutTimerFunc(TIMER_FREQUENCY_MILLIS , timer, 0)
371
+
372
+ # Make sure that OpenGL 2.0 is supported by the driver
373
+ if Gl.is_available?(2.0)==false
374
+ major,minor,*rest = glGetString(GL_VERSION).split(/\.| /)
375
+ puts "GL_VERSION major=#{major} minor=#{minor}"
376
+ puts "Support for OpenGL 2.0 is required for this demo...exiting"
377
+ exit(1)
378
+ end
379
+
380
+ glDepthFunc(GL_LESS)
381
+ glEnable(GL_DEPTH_TEST)
382
+
383
+ nextClearColor()
384
+
385
+ key.call('?', 0, 0)
386
+
387
+ success = installBrickShaders("brick.vert","brick.frag")
388
+ glutMainLoop() if success == true