Codebase list ruby-fxruby / 230fbc6
Migrate to opengl-bindings gem The opengl gem is deprecated since years and no longer maintained. opengl-bindings is the announced successor. Lars Kanis 3 years ago
5 changed file(s) with 293 addition(s) and 225 deletion(s). Raw diff Collapse all Expand all
1515 end
1616
1717 group :test do
18 gem 'opengl', '~> 0.8'
19 gem 'glu', '~> 8.0'
18 gem 'opengl-bindings', '~> 1.0'
2019 gem 'test-unit', '~> 3.1'
2120 end
22 require 'fox16'
33 begin
44 require 'opengl'
5 require 'glu'
65 rescue LoadError
76 require 'fox16/missingdep'
87 MSG = <<EOM
9 Sorry, this example depends on the opengl gems. Please execute:
10 gem install opengl glu
8 Sorry, this example depends on the opengl-bindings gems. Please execute:
9 gem install opengl-bindings
1110 EOM
1211 missingDependency(MSG)
1312 end
1615
1716 class GLTestWindow < Fox::FXMainWindow
1817 include Fox
18 include OpenGL
1919
2020 # How often our timer will fire (in milliseconds)
2121 TIMER_INTERVAL = 100
2222
2323 # Draws a simple box using the given corners
2424 def drawBox(xmin, ymin, zmin, xmax, ymax, zmax)
25 GL.Begin(GL::TRIANGLE_STRIP)
26 GL.Normal(0.0, 0.0, -1.0)
27 GL.Vertex(xmin, ymin, zmin)
28 GL.Vertex(xmin, ymax, zmin)
29 GL.Vertex(xmax, ymin, zmin)
30 GL.Vertex(xmax, ymax, zmin)
31 GL.End()
32
33 GL.Begin(GL::TRIANGLE_STRIP)
34 GL.Normal(1.0, 0.0, 0.0)
35 GL.Vertex(xmax, ymin, zmin)
36 GL.Vertex(xmax, ymax, zmin)
37 GL.Vertex(xmax, ymin, zmax)
38 GL.Vertex(xmax, ymax, zmax)
39 GL.End()
40
41 GL.Begin(GL::TRIANGLE_STRIP)
42 GL.Normal(0.0, 0.0, 1.0)
43 GL.Vertex(xmax, ymin, zmax)
44 GL.Vertex(xmax, ymax, zmax)
45 GL.Vertex(xmin, ymin, zmax)
46 GL.Vertex(xmin, ymax, zmax)
47 GL.End()
48
49 GL.Begin(GL::TRIANGLE_STRIP)
50 GL.Normal(-1.0, 0.0, 0.0)
51 GL.Vertex(xmin, ymin, zmax)
52 GL.Vertex(xmin, ymax, zmax)
53 GL.Vertex(xmin, ymin, zmin)
54 GL.Vertex(xmin, ymax, zmin)
55 GL.End()
56
57 GL.Begin(GL::TRIANGLE_STRIP)
58 GL.Normal(0.0, 1.0, 0.0)
59 GL.Vertex(xmin, ymax, zmin)
60 GL.Vertex(xmin, ymax, zmax)
61 GL.Vertex(xmax, ymax, zmin)
62 GL.Vertex(xmax, ymax, zmax)
63 GL.End()
64
65 GL.Begin(GL::TRIANGLE_STRIP)
66 GL.Normal(0.0, -1.0, 0.0)
67 GL.Vertex(xmax, ymin, zmax)
68 GL.Vertex(xmax, ymin, zmin)
69 GL.Vertex(xmin, ymin, zmax)
70 GL.Vertex(xmin, ymin, zmin)
71 GL.End()
25 glBegin(GL_TRIANGLE_STRIP)
26 glNormal3d(0.0, 0.0, -1.0)
27 glVertex3d(xmin, ymin, zmin)
28 glVertex3d(xmin, ymax, zmin)
29 glVertex3d(xmax, ymin, zmin)
30 glVertex3d(xmax, ymax, zmin)
31 glEnd()
32
33 glBegin(GL_TRIANGLE_STRIP)
34 glNormal3d(1.0, 0.0, 0.0)
35 glVertex3d(xmax, ymin, zmin)
36 glVertex3d(xmax, ymax, zmin)
37 glVertex3d(xmax, ymin, zmax)
38 glVertex3d(xmax, ymax, zmax)
39 glEnd()
40
41 glBegin(GL_TRIANGLE_STRIP)
42 glNormal3d(0.0, 0.0, 1.0)
43 glVertex3d(xmax, ymin, zmax)
44 glVertex3d(xmax, ymax, zmax)
45 glVertex3d(xmin, ymin, zmax)
46 glVertex3d(xmin, ymax, zmax)
47 glEnd()
48
49 glBegin(GL_TRIANGLE_STRIP)
50 glNormal3d(-1.0, 0.0, 0.0)
51 glVertex3d(xmin, ymin, zmax)
52 glVertex3d(xmin, ymax, zmax)
53 glVertex3d(xmin, ymin, zmin)
54 glVertex3d(xmin, ymax, zmin)
55 glEnd()
56
57 glBegin(GL_TRIANGLE_STRIP)
58 glNormal3d(0.0, 1.0, 0.0)
59 glVertex3d(xmin, ymax, zmin)
60 glVertex3d(xmin, ymax, zmax)
61 glVertex3d(xmax, ymax, zmin)
62 glVertex3d(xmax, ymax, zmax)
63 glEnd()
64
65 glBegin(GL_TRIANGLE_STRIP)
66 glNormal3d(0.0, -1.0, 0.0)
67 glVertex3d(xmax, ymin, zmax)
68 glVertex3d(xmax, ymin, zmin)
69 glVertex3d(xmin, ymin, zmax)
70 glVertex3d(xmin, ymin, zmin)
71 glEnd()
72 end
73
74 def gluPerspective(fovY, aspect, zNear, zFar )
75 fH = Math.tan( fovY / 360 * Math::PI ) * zNear;
76 fW = fH * aspect;
77
78 glFrustum( -fW, fW, -fH, fH, zNear, zFar );
79 end
80
81 # Define our own version of gluLookAt() to avoid dependency to deprecated GLU library
82 def gluLookAt(ex, ey, ez,
83 lx, ly, lz,
84 ux, uy, uz )
85 z0 = ex - lx
86 z1 = ey - ly
87 z2 = ez - lz
88 l = z0*z0+z1*z1+z2*z2
89 if l != 0 then
90 l = 1.0 / Math.sqrt(l)
91 z0 *= l
92 z1 *= l
93 z2 *= l
94 end
95
96 x0 = uy*z2-uz*z1
97 x1 = -ux*z2+uz*z0
98 x2 = ux*z1-uy*z0
99 l = x0*x0+x1*x1+x2*x2
100 if l != 0 then
101 l = 1.0 / Math.sqrt(l)
102 x0 *= l
103 x1 *= l
104 x2 *= l
105 end
106
107 y0 = z1*x2-z2*x1
108 y1 = -z0*x2+z2*x0
109 y2 = z0*x1-z1*x0
110 l = y0*y0+y1*y1+y2*y2
111 if l != 0 then
112 l = 1.0 / Math.sqrt(l)
113 y0 *= l
114 y1 *= l
115 y2 *= l
116 end
117
118 m4x4 = [
119 x0,y0,z0,0,
120 x1,y1,z1,0,
121 x2,y2,z2,0,
122 0, 0, 0,1,
123 ].pack("d*")
124 glMultMatrixd m4x4
125 glTranslated -ex,-ey,-ez
72126 end
73127
74128 # Draw the GL scene
86140 # Make context current
87141 @glcanvas.makeCurrent()
88142
89 GL.Viewport(0, 0, @glcanvas.width, @glcanvas.height)
90
91 GL.ClearColor(1.0, 1.0, 1.0, 1.0)
92 GL.Clear(GL::COLOR_BUFFER_BIT|GL::DEPTH_BUFFER_BIT)
93 GL.Enable(GL::DEPTH_TEST)
94
95 GL.Disable(GL::DITHER)
96
97 GL.MatrixMode(GL::PROJECTION)
98 GL.LoadIdentity()
99 GLU.Perspective(30.0, aspect, 1.0, 100.0)
100
101 GL.MatrixMode(GL::MODELVIEW)
102 GL.LoadIdentity()
103 GLU.LookAt(5.0, 10.0, 15.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
104
105 GL.ShadeModel(GL::SMOOTH)
106 GL.Light(GL::LIGHT0, GL::POSITION, lightPosition)
107 GL.Light(GL::LIGHT0, GL::AMBIENT, lightAmbient)
108 GL.Light(GL::LIGHT0, GL::DIFFUSE, lightDiffuse)
109 GL.Enable(GL::LIGHT0)
110 GL.Enable(GL::LIGHTING)
111
112 GL.Material(GL::FRONT, GL::AMBIENT, blueMaterial)
113 GL.Material(GL::FRONT, GL::DIFFUSE, blueMaterial)
114
115 GL.PushMatrix()
116 GL.Rotated(@angle, 0.0, 1.0, 0.0)
143 glViewport(0, 0, @glcanvas.width, @glcanvas.height)
144
145 glClearColor(1.0, 1.0, 1.0, 1.0)
146 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
147 glEnable(GL_DEPTH_TEST)
148
149 glDisable(GL_DITHER)
150
151 glMatrixMode(GL_PROJECTION)
152 glLoadIdentity()
153 gluPerspective(30.0, aspect, 1.0, 100.0)
154
155 glMatrixMode(GL_MODELVIEW)
156 glLoadIdentity()
157 gluLookAt(5.0, 10.0, 15.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
158
159 glShadeModel(GL_SMOOTH)
160 glLightfv(GL_LIGHT0, GL_POSITION, lightPosition.pack("f*"))
161 glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient.pack("f*"))
162 glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse.pack("f*"))
163 glEnable(GL_LIGHT0)
164 glEnable(GL_LIGHTING)
165
166 glMaterialfv(GL_FRONT, GL_AMBIENT, blueMaterial.pack("f*"))
167 glMaterialfv(GL_FRONT, GL_DIFFUSE, blueMaterial.pack("f*"))
168
169 glPushMatrix()
170 glRotated(@angle, 0.0, 1.0, 0.0)
117171 drawBox(-1, -1, -1, 1, 1, 1)
118172
119 GL.Material(GL::FRONT, GL::AMBIENT, redMaterial)
120 GL.Material(GL::FRONT, GL::DIFFUSE, redMaterial)
121
122 GL.PushMatrix()
123 GL.Translated(0.0, 1.75, 0.0)
124 GL.Rotated(@angle, 0.0, 1.0, 0.0)
173 glMaterialfv(GL_FRONT, GL_AMBIENT, redMaterial.pack("f*"))
174 glMaterialfv(GL_FRONT, GL_DIFFUSE, redMaterial.pack("f*"))
175
176 glPushMatrix()
177 glTranslated(0.0, 1.75, 0.0)
178 glRotated(@angle, 0.0, 1.0, 0.0)
125179 drawBox(-0.5, -0.5, -0.5, 0.5, 0.5, 0.5)
126 GL.PopMatrix()
127
128 GL.PushMatrix()
129 GL.Translated(0.0, -1.75, 0.0)
130 GL.Rotated(@angle, 0.0, 1.0, 0.0)
180 glPopMatrix()
181
182 glPushMatrix()
183 glTranslated(0.0, -1.75, 0.0)
184 glRotated(@angle, 0.0, 1.0, 0.0)
131185 drawBox(-0.5, -0.5, -0.5, 0.5, 0.5, 0.5)
132 GL.PopMatrix()
133
134 GL.PushMatrix()
135 GL.Rotated(90.0, 1.0, 0.0, 0.0)
136 GL.Translated(0.0, 1.75, 0.0)
137 GL.Rotated(@angle, 0.0, 1.0, 0.0)
186 glPopMatrix()
187
188 glPushMatrix()
189 glRotated(90.0, 1.0, 0.0, 0.0)
190 glTranslated(0.0, 1.75, 0.0)
191 glRotated(@angle, 0.0, 1.0, 0.0)
138192 drawBox(-0.5,-0.5,-0.5,0.5,0.5,0.5)
139 GL.PopMatrix()
140
141 GL.PushMatrix()
142 GL.Rotated(90.0, -1.0, 0.0, 0.0)
143 GL.Translated(0.0,1.75,0.0)
144 GL.Rotated(@angle, 0.0, 1.0, 0.0)
193 glPopMatrix()
194
195 glPushMatrix()
196 glRotated(90.0, -1.0, 0.0, 0.0)
197 glTranslated(0.0,1.75,0.0)
198 glRotated(@angle, 0.0, 1.0, 0.0)
145199 drawBox(-0.5,-0.5,-0.5,0.5,0.5,0.5)
146 GL.PopMatrix()
147
148 GL.PushMatrix()
149 GL.Rotated(90.0, 0.0, 0.0, 1.0)
150 GL.Translated(0.0,1.75,0.0)
151 GL.Rotated(@angle, 0.0, 1.0, 0.0)
200 glPopMatrix()
201
202 glPushMatrix()
203 glRotated(90.0, 0.0, 0.0, 1.0)
204 glTranslated(0.0,1.75,0.0)
205 glRotated(@angle, 0.0, 1.0, 0.0)
152206 drawBox(-0.5,-0.5,-0.5,0.5,0.5,0.5)
153 GL.PopMatrix()
154
155 GL.PushMatrix()
156 GL.Rotated(90.0, 0.0, 0.0, -1.0)
157 GL.Translated(0.0,1.75,0.0)
158 GL.Rotated(@angle, 0.0, 1.0, 0.0)
207 glPopMatrix()
208
209 glPushMatrix()
210 glRotated(90.0, 0.0, 0.0, -1.0)
211 glTranslated(0.0,1.75,0.0)
212 glRotated(@angle, 0.0, 1.0, 0.0)
159213 drawBox(-0.5,-0.5,-0.5,0.5,0.5,0.5)
160 GL.PopMatrix()
161
162 GL.PopMatrix()
214 glPopMatrix()
215
216 glPopMatrix()
163217
164218 # Swap if it is double-buffered
165219 if @glvisual.isDoubleBuffer
173227 def initialize(app)
174228 # Invoke the base class initializer
175229 super(app, "OpenGL Test Application", :opts => DECOR_ALL, :width => 800, :height => 600)
230
231 OpenGL.load_lib
176232
177233 # Construct the main window elements
178234 frame = FXHorizontalFrame.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
206262 @glcanvas.connect(SEL_PAINT) { drawScene }
207263 @glcanvas.connect(SEL_CONFIGURE) do
208264 if @glcanvas.makeCurrent
209 GL.Viewport(0, 0, @glcanvas.width, @glcanvas.height)
265 glViewport(0, 0, @glcanvas.width, @glcanvas.height)
210266 @glcanvas.makeNonCurrent
211267 end
212268 end
66 rescue LoadError
77 require 'fox16/missingdep'
88 MSG = <<EOM
9 Sorry, this example depends on the OpenGL extension. Please
10 check the Ruby Application Archives for an appropriate
11 download site.
9 Sorry, this example depends on the opengl-bindings gems. Please execute:
10 gem install opengl-bindings
1211 EOM
1312 missingDependency(MSG)
1413 end
160159 def initialize(app)
161160 # Initialize base class first
162161 super(app, "OpenGL Example Application", :opts => DECOR_ALL, :width => 800, :height => 600)
162
163 OpenGL.load_lib
164 GLU.load_lib
163165
164166 # Define message identifiers for this class
165167
88 # A group of OpenGL objects
99 #
1010 class FXGLGroup < FXGLObject
11
11 include OpenGL
1212 include Enumerable
1313
1414 FLT_MAX = 1.0e+20
7979 #
8080 def hit(viewer)
8181 # GL.PushName(0xffffffff)
82 GL.PushName(1000000)
82 glPushName(1000000)
8383 @list.each_with_index do |obj, i|
84 GL.LoadName(i)
84 glLoadName(i)
8585 obj.hit(viewer)
8686 end
87 GL.PopName
87 glPopName
8888 end
8989
9090 #
88 # OpenGL point object
99 #
1010 class FXGLPoint < FXGLObject
11 include OpenGL
1112
1213 # Point position, in model coordinates (a 3-element array)
1314 attr_accessor :pos
4647 # Draw this point into _viewer_ (an FXGLViewer instance).
4748 #
4849 def draw(viewer)
49 GL::Color(0.0, 0.0, 1.0)
50 GL::PointSize(HANDLE_SIZE)
51 GL::Begin(GL::POINTS)
52 GL::Vertex(@pos)
53 GL::End()
50 glColor(0.0, 0.0, 1.0)
51 glPointSize(HANDLE_SIZE)
52 glBegin(GL_POINTS)
53 glVertex(@pos)
54 glEnd()
5455 end
5556
5657 #
5758 # Perform hit test for this point in _viewer_ (an FXGLViewer instance).
5859 #
5960 def hit(viewer)
60 GL::Begin(GL::POINTS)
61 GL::Vertex(@pos)
62 GL::End()
61 glBegin(GL_POINTS)
62 glVertex(@pos)
63 glEnd()
6364 end
6465 end
6566
9293 def initialize(*args)
9394 super()
9495 if args.length == 0
95 @fm = FXGLPoint.new(-0.5, 0.0, 0.0)
96 @to = FXGLPoint.new( 0.5, 0.0, 0.0)
96 @fm = FXGLPoint.new(-0.5, 0.0, 0.0)
97 @to = FXGLPoint.new( 0.5, 0.0, 0.0)
9798 elsif args.length == 1
98 @fm = args[0].fm
99 @to = args[0].to
99 @fm = args[0].fm
100 @to = args[0].to
100101 else
101 @fm = FXGLPoint.new(args[0], args[1], args[2])
102 @to = FXGLPoint.new(args[3], args[4], args[5])
102 @fm = FXGLPoint.new(args[0], args[1], args[2])
103 @to = FXGLPoint.new(args[3], args[4], args[5])
103104 end
104105 end
105106
119120 # Draw this line into _viewer_ (an FXGLViewer instance).
120121 #
121122 def draw(viewer)
122 GL::Color(1.0, 0.0, 0.0)
123 GL::PointSize(HANDLE_SIZE)
124 GL::Begin(GL::LINES)
125 GL::Vertex(@fm.pos)
126 GL::Vertex(@to.pos)
127 GL::End()
123 glColor(1.0, 0.0, 0.0)
124 glPointSize(HANDLE_SIZE)
125 glBegin(GL_LINES)
126 glVertex(@fm.pos)
127 glVertex(@to.pos)
128 glEnd()
128129 end
129130
130131 #
131132 # Perform hit-test for this line in _viewer_ (an FXGLViewer instance).
132133 #
133134 def hit(viewer)
134 GL::Begin(GL::LINES)
135 GL::Vertex(@fm.pos)
136 GL::Vertex(@to.pos)
137 GL::End()
135 glBegin(GL_LINES)
136 glVertex(@fm.pos)
137 glVertex(@to.pos)
138 glEnd()
138139 end
139140 end
140141
142143 # OpenGL cube object
143144 #
144145 class FXGLCube < FXGLShape
146 include OpenGL
145147
146148 # Cube width [Float]
147149 attr_accessor :width
172174 #
173175 def initialize(*args)
174176 if args.length == 7
175 super(args[0], args[1], args[2], SHADING_SMOOTH|STYLE_SURFACE,
177 super(args[0], args[1], args[2], SHADING_SMOOTH|STYLE_SURFACE,
176178 args[6], args[6])
177179 else
178 super(args[0], args[1], args[2], SHADING_SMOOTH|STYLE_SURFACE)
180 super(args[0], args[1], args[2], SHADING_SMOOTH|STYLE_SURFACE)
179181 end
180182 @width = args[3] ? args[3] : 1.0
181183 @height = args[4] ? args[4] : 1.0
182184 @depth = args[5] ? args[5] : 1.0
183185 setRange(FXRangef.new(-0.5*@width, 0.5*@width,
184 -0.5*@height, 0.5*@height,
185 -0.5*@depth, 0.5*@depth))
186 -0.5*@height, 0.5*@height,
187 -0.5*@depth, 0.5*@depth))
186188 end
187189
188190 #
194196 zmin, zmax = -0.5*@depth, 0.5*@depth
195197
196198 # Draw low face
197 GL::Begin(GL::TRIANGLE_STRIP)
198 GL::Normal(0.0, 0.0, -1.0)
199 GL::Vertex(xmin, ymin, zmin)
200 GL::Vertex(xmin, ymax, zmin)
201 GL::Vertex(xmax, ymin, zmin)
202 GL::Vertex(xmax, ymax, zmin)
203 GL::End()
199 glBegin(GL_TRIANGLE_STRIP)
200 glNormal3d(0.0, 0.0, -1.0)
201 glVertex3d(xmin, ymin, zmin)
202 glVertex3d(xmin, ymax, zmin)
203 glVertex3d(xmax, ymin, zmin)
204 glVertex3d(xmax, ymax, zmin)
205 glEnd()
204206
205207 # Draw east face
206 GL::Begin(GL::TRIANGLE_STRIP)
207 GL::Normal(1.0, 0.0, 0.0)
208 GL::Vertex(xmax, ymin, zmin)
209 GL::Vertex(xmax, ymax, zmin)
210 GL::Vertex(xmax, ymin, zmax)
211 GL::Vertex(xmax, ymax, zmax)
212 GL::End()
208 glBegin(GL_TRIANGLE_STRIP)
209 glNormal3d(1.0, 0.0, 0.0)
210 glVertex3d(xmax, ymin, zmin)
211 glVertex3d(xmax, ymax, zmin)
212 glVertex3d(xmax, ymin, zmax)
213 glVertex3d(xmax, ymax, zmax)
214 glEnd()
213215
214216 # Draw high face
215 GL::Begin(GL::TRIANGLE_STRIP)
216 GL::Normal(0.0, 0.0, 1.0)
217 GL::Vertex(xmax, ymin, zmax)
218 GL::Vertex(xmax, ymax, zmax)
219 GL::Vertex(xmin, ymin, zmax)
220 GL::Vertex(xmin, ymax, zmax)
221 GL::End()
217 glBegin(GL_TRIANGLE_STRIP)
218 glNormal3d(0.0, 0.0, 1.0)
219 glVertex3d(xmax, ymin, zmax)
220 glVertex3d(xmax, ymax, zmax)
221 glVertex3d(xmin, ymin, zmax)
222 glVertex3d(xmin, ymax, zmax)
223 glEnd()
222224
223225 # Draw west face
224 GL::Begin(GL::TRIANGLE_STRIP)
225 GL::Normal(-1.0, 0.0, 0.0)
226 GL::Vertex(xmin, ymin, zmax)
227 GL::Vertex(xmin, ymax, zmax)
228 GL::Vertex(xmin, ymin, zmin)
229 GL::Vertex(xmin, ymax, zmin)
230 GL::End()
226 glBegin(GL_TRIANGLE_STRIP)
227 glNormal3d(-1.0, 0.0, 0.0)
228 glVertex3d(xmin, ymin, zmax)
229 glVertex3d(xmin, ymax, zmax)
230 glVertex3d(xmin, ymin, zmin)
231 glVertex3d(xmin, ymax, zmin)
232 glEnd()
231233
232234 # Draw north face
233 GL::Begin(GL::TRIANGLE_STRIP)
234 GL::Normal(0.0, 1.0, 0.0)
235 GL::Vertex(xmin, ymax, zmin)
236 GL::Vertex(xmin, ymax, zmax)
237 GL::Vertex(xmax, ymax, zmin)
238 GL::Vertex(xmax, ymax, zmax)
239 GL::End()
235 glBegin(GL_TRIANGLE_STRIP)
236 glNormal3d(0.0, 1.0, 0.0)
237 glVertex3d(xmin, ymax, zmin)
238 glVertex3d(xmin, ymax, zmax)
239 glVertex3d(xmax, ymax, zmin)
240 glVertex3d(xmax, ymax, zmax)
241 glEnd()
240242
241243 # Draw south face
242 GL::Begin(GL::TRIANGLE_STRIP)
243 GL::Normal(0.0, -1.0, 0.0)
244 GL::Vertex(xmin, ymin, zmax)
245 GL::Vertex(xmin, ymin, zmin)
246 GL::Vertex(xmax, ymin, zmax)
247 GL::Vertex(xmax, ymin, zmin)
248 GL::End()
244 glBegin(GL_TRIANGLE_STRIP)
245 glNormal3d(0.0, -1.0, 0.0)
246 glVertex3d(xmin, ymin, zmax)
247 glVertex3d(xmin, ymin, zmin)
248 glVertex3d(xmax, ymin, zmax)
249 glVertex3d(xmax, ymin, zmin)
250 glEnd()
249251 end
250252 end
251253
253255 # OpenGL cone object
254256 #
255257 class FXGLCone < FXGLShape
258 include OpenGL
259 include GLU
260
256261 # Cone fidelity
257262 SLICES_NUMBER = 20
258263 STACKS_NUMBER = 20
292297 #
293298 def initialize(*args)
294299 if args.length == 5
295 super(args[0], args[1], args[2], SHADING_SMOOTH|STYLE_SURFACE)
300 super(args[0], args[1], args[2], SHADING_SMOOTH|STYLE_SURFACE)
296301 elsif args.length == 6
297 super(args[0], args[1], args[2], SHADING_SMOOTH|STYLE_SURFACE,
302 super(args[0], args[1], args[2], SHADING_SMOOTH|STYLE_SURFACE,
298303 args[5], args[5])
299304 end
300305 @height = args[3] ? args[3] : 1.0
309314 # Draw this cone into _viewer_ (an FXGLViewer instance).
310315 #
311316 def drawshape(viewer)
312 quad = GLU::NewQuadric()
313 GLU::QuadricDrawStyle(quad, GLU::FILL)
314 GL::PushMatrix()
315 GL::Rotate(-90, 1, 0, 0)
316 GLU::Cylinder(quad, @radius, 0, @height, @slices, @stacks)
317 GLU::QuadricOrientation(quad, GLU::INSIDE)
318 GLU::Disk(quad, 0, @radius, @slices, @loops)
319 GLU::DeleteQuadric(quad)
320 GL::PopMatrix()
317 quad = gluNewQuadric()
318 gluQuadricDrawStyle(quad, GLU_FILL)
319 glPushMatrix()
320 glRotated(-90, 1, 0, 0)
321 gluCylinder(quad, @radius, 0, @height, @slices, @stacks)
322 gluQuadricOrientation(quad, GLU_INSIDE)
323 gluDisk(quad, 0, @radius, @slices, @loops)
324 gluDeleteQuadric(quad)
325 glPopMatrix()
321326 end
322327 end
323328
325330 # OpenGL cylinder object
326331 #
327332 class FXGLCylinder < FXGLShape
333 include OpenGL
334 include GLU
335
328336 # Cylinder fidelity
329337 SLICES_NUMBER = 20
330338 STACKS_NUMBER = 20
364372 #
365373 def initialize(*args)
366374 if args.length == 5
367 super(args[0], args[1], args[2], SHADING_SMOOTH|STYLE_SURFACE)
375 super(args[0], args[1], args[2], SHADING_SMOOTH|STYLE_SURFACE)
368376 else
369 super(args[0], args[1], args[2], SHADING_SMOOTH|STYLE_SURFACE,
377 super(args[0], args[1], args[2], SHADING_SMOOTH|STYLE_SURFACE,
370378 args[5], args[5])
371379 end
372380 @height = args[3] ? args[3] : 1.0
381389 # Draw this cylinder into _viewer_ (an FXGLViewer instance).
382390 #
383391 def drawshape(viewer)
384 quad = GLU::NewQuadric()
385 GLU::QuadricDrawStyle(quad, GLU::FILL)
386 GL::PushMatrix()
387 GL::Rotate(-90, 1, 0, 0)
388 GLU::Cylinder(quad, @radius, @radius, @height, @slices, @stacks)
389 GLU::QuadricOrientation(quad, GLU::INSIDE)
390 GLU::Disk(quad, 0, @radius, @slices, @loops)
391 GL::Translate(0, 0, @height)
392 GLU::QuadricOrientation(quad, GLU::OUTSIDE)
393 GLU::Disk(quad, 0, @radius, @slices, @loops)
394 GL::PopMatrix()
395 GLU::DeleteQuadric(quad)
392 quad = gluNewQuadric()
393 gluQuadricDrawStyle(quad, GLU_FILL)
394 glPushMatrix()
395 glRotated(-90, 1, 0, 0)
396 gluCylinder(quad, @radius, @radius, @height, @slices, @stacks)
397 gluQuadricOrientation(quad, GLU_INSIDE)
398 gluDisk(quad, 0, @radius, @slices, @loops)
399 glTranslated(0, 0, @height)
400 gluQuadricOrientation(quad, GLU_OUTSIDE)
401 gluDisk(quad, 0, @radius, @slices, @loops)
402 glPopMatrix()
403 gluDeleteQuadric(quad)
396404 end
397405 end
398406
400408 # OpenGL sphere object
401409 #
402410 class FXGLSphere < FXGLShape
411 include OpenGL
412 include GLU
413
403414 # Sphere fidelity
404415 SLICES_NUMBER = 20
405416 STACKS_NUMBER = 20
447458 # Draw this sphere into _viewer_ (an FXGLViewer instance).
448459 #
449460 def drawshape(viewer)
450 quad = GLU::NewQuadric()
451 GLU::QuadricDrawStyle(quad, GLU::FILL)
452 GLU::Sphere(quad, @radius, @slices, @stacks)
453 GLU::DeleteQuadric(quad)
461 quad = gluNewQuadric()
462 gluQuadricDrawStyle(quad, GLU_FILL)
463 gluSphere(quad, @radius, @slices, @stacks)
464 gluDeleteQuadric(quad)
454465 end
455466 end
456467 end