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
15 | 15 | end |
16 | 16 | |
17 | 17 | group :test do |
18 | gem 'opengl', '~> 0.8' | |
19 | gem 'glu', '~> 8.0' | |
18 | gem 'opengl-bindings', '~> 1.0' | |
20 | 19 | gem 'test-unit', '~> 3.1' |
21 | 20 | end |
2 | 2 | require 'fox16' |
3 | 3 | begin |
4 | 4 | require 'opengl' |
5 | require 'glu' | |
6 | 5 | rescue LoadError |
7 | 6 | require 'fox16/missingdep' |
8 | 7 | 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 | |
11 | 10 | EOM |
12 | 11 | missingDependency(MSG) |
13 | 12 | end |
16 | 15 | |
17 | 16 | class GLTestWindow < Fox::FXMainWindow |
18 | 17 | include Fox |
18 | include OpenGL | |
19 | 19 | |
20 | 20 | # How often our timer will fire (in milliseconds) |
21 | 21 | TIMER_INTERVAL = 100 |
22 | 22 | |
23 | 23 | # Draws a simple box using the given corners |
24 | 24 | 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 | |
72 | 126 | end |
73 | 127 | |
74 | 128 | # Draw the GL scene |
86 | 140 | # Make context current |
87 | 141 | @glcanvas.makeCurrent() |
88 | 142 | |
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) | |
117 | 171 | drawBox(-1, -1, -1, 1, 1, 1) |
118 | 172 | |
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) | |
125 | 179 | 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) | |
131 | 185 | 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) | |
138 | 192 | 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) | |
145 | 199 | 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) | |
152 | 206 | 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) | |
159 | 213 | 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() | |
163 | 217 | |
164 | 218 | # Swap if it is double-buffered |
165 | 219 | if @glvisual.isDoubleBuffer |
173 | 227 | def initialize(app) |
174 | 228 | # Invoke the base class initializer |
175 | 229 | super(app, "OpenGL Test Application", :opts => DECOR_ALL, :width => 800, :height => 600) |
230 | ||
231 | OpenGL.load_lib | |
176 | 232 | |
177 | 233 | # Construct the main window elements |
178 | 234 | frame = FXHorizontalFrame.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y) |
206 | 262 | @glcanvas.connect(SEL_PAINT) { drawScene } |
207 | 263 | @glcanvas.connect(SEL_CONFIGURE) do |
208 | 264 | if @glcanvas.makeCurrent |
209 | GL.Viewport(0, 0, @glcanvas.width, @glcanvas.height) | |
265 | glViewport(0, 0, @glcanvas.width, @glcanvas.height) | |
210 | 266 | @glcanvas.makeNonCurrent |
211 | 267 | end |
212 | 268 | end |
6 | 6 | rescue LoadError |
7 | 7 | require 'fox16/missingdep' |
8 | 8 | 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 | |
12 | 11 | EOM |
13 | 12 | missingDependency(MSG) |
14 | 13 | end |
160 | 159 | def initialize(app) |
161 | 160 | # Initialize base class first |
162 | 161 | super(app, "OpenGL Example Application", :opts => DECOR_ALL, :width => 800, :height => 600) |
162 | ||
163 | OpenGL.load_lib | |
164 | GLU.load_lib | |
163 | 165 | |
164 | 166 | # Define message identifiers for this class |
165 | 167 |
8 | 8 | # A group of OpenGL objects |
9 | 9 | # |
10 | 10 | class FXGLGroup < FXGLObject |
11 | ||
11 | include OpenGL | |
12 | 12 | include Enumerable |
13 | 13 | |
14 | 14 | FLT_MAX = 1.0e+20 |
79 | 79 | # |
80 | 80 | def hit(viewer) |
81 | 81 | # GL.PushName(0xffffffff) |
82 | GL.PushName(1000000) | |
82 | glPushName(1000000) | |
83 | 83 | @list.each_with_index do |obj, i| |
84 | GL.LoadName(i) | |
84 | glLoadName(i) | |
85 | 85 | obj.hit(viewer) |
86 | 86 | end |
87 | GL.PopName | |
87 | glPopName | |
88 | 88 | end |
89 | 89 | |
90 | 90 | # |
8 | 8 | # OpenGL point object |
9 | 9 | # |
10 | 10 | class FXGLPoint < FXGLObject |
11 | include OpenGL | |
11 | 12 | |
12 | 13 | # Point position, in model coordinates (a 3-element array) |
13 | 14 | attr_accessor :pos |
46 | 47 | # Draw this point into _viewer_ (an FXGLViewer instance). |
47 | 48 | # |
48 | 49 | 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() | |
54 | 55 | end |
55 | 56 | |
56 | 57 | # |
57 | 58 | # Perform hit test for this point in _viewer_ (an FXGLViewer instance). |
58 | 59 | # |
59 | 60 | def hit(viewer) |
60 | GL::Begin(GL::POINTS) | |
61 | GL::Vertex(@pos) | |
62 | GL::End() | |
61 | glBegin(GL_POINTS) | |
62 | glVertex(@pos) | |
63 | glEnd() | |
63 | 64 | end |
64 | 65 | end |
65 | 66 | |
92 | 93 | def initialize(*args) |
93 | 94 | super() |
94 | 95 | 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) | |
97 | 98 | elsif args.length == 1 |
98 | @fm = args[0].fm | |
99 | @to = args[0].to | |
99 | @fm = args[0].fm | |
100 | @to = args[0].to | |
100 | 101 | 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]) | |
103 | 104 | end |
104 | 105 | end |
105 | 106 | |
119 | 120 | # Draw this line into _viewer_ (an FXGLViewer instance). |
120 | 121 | # |
121 | 122 | 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() | |
128 | 129 | end |
129 | 130 | |
130 | 131 | # |
131 | 132 | # Perform hit-test for this line in _viewer_ (an FXGLViewer instance). |
132 | 133 | # |
133 | 134 | 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() | |
138 | 139 | end |
139 | 140 | end |
140 | 141 | |
142 | 143 | # OpenGL cube object |
143 | 144 | # |
144 | 145 | class FXGLCube < FXGLShape |
146 | include OpenGL | |
145 | 147 | |
146 | 148 | # Cube width [Float] |
147 | 149 | attr_accessor :width |
172 | 174 | # |
173 | 175 | def initialize(*args) |
174 | 176 | 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, | |
176 | 178 | args[6], args[6]) |
177 | 179 | 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) | |
179 | 181 | end |
180 | 182 | @width = args[3] ? args[3] : 1.0 |
181 | 183 | @height = args[4] ? args[4] : 1.0 |
182 | 184 | @depth = args[5] ? args[5] : 1.0 |
183 | 185 | 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)) | |
186 | 188 | end |
187 | 189 | |
188 | 190 | # |
194 | 196 | zmin, zmax = -0.5*@depth, 0.5*@depth |
195 | 197 | |
196 | 198 | # 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() | |
204 | 206 | |
205 | 207 | # 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() | |
213 | 215 | |
214 | 216 | # 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() | |
222 | 224 | |
223 | 225 | # 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() | |
231 | 233 | |
232 | 234 | # 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() | |
240 | 242 | |
241 | 243 | # 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() | |
249 | 251 | end |
250 | 252 | end |
251 | 253 | |
253 | 255 | # OpenGL cone object |
254 | 256 | # |
255 | 257 | class FXGLCone < FXGLShape |
258 | include OpenGL | |
259 | include GLU | |
260 | ||
256 | 261 | # Cone fidelity |
257 | 262 | SLICES_NUMBER = 20 |
258 | 263 | STACKS_NUMBER = 20 |
292 | 297 | # |
293 | 298 | def initialize(*args) |
294 | 299 | 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) | |
296 | 301 | 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, | |
298 | 303 | args[5], args[5]) |
299 | 304 | end |
300 | 305 | @height = args[3] ? args[3] : 1.0 |
309 | 314 | # Draw this cone into _viewer_ (an FXGLViewer instance). |
310 | 315 | # |
311 | 316 | 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() | |
321 | 326 | end |
322 | 327 | end |
323 | 328 | |
325 | 330 | # OpenGL cylinder object |
326 | 331 | # |
327 | 332 | class FXGLCylinder < FXGLShape |
333 | include OpenGL | |
334 | include GLU | |
335 | ||
328 | 336 | # Cylinder fidelity |
329 | 337 | SLICES_NUMBER = 20 |
330 | 338 | STACKS_NUMBER = 20 |
364 | 372 | # |
365 | 373 | def initialize(*args) |
366 | 374 | 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) | |
368 | 376 | 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, | |
370 | 378 | args[5], args[5]) |
371 | 379 | end |
372 | 380 | @height = args[3] ? args[3] : 1.0 |
381 | 389 | # Draw this cylinder into _viewer_ (an FXGLViewer instance). |
382 | 390 | # |
383 | 391 | 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) | |
396 | 404 | end |
397 | 405 | end |
398 | 406 | |
400 | 408 | # OpenGL sphere object |
401 | 409 | # |
402 | 410 | class FXGLSphere < FXGLShape |
411 | include OpenGL | |
412 | include GLU | |
413 | ||
403 | 414 | # Sphere fidelity |
404 | 415 | SLICES_NUMBER = 20 |
405 | 416 | STACKS_NUMBER = 20 |
447 | 458 | # Draw this sphere into _viewer_ (an FXGLViewer instance). |
448 | 459 | # |
449 | 460 | 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) | |
454 | 465 | end |
455 | 466 | end |
456 | 467 | end |