source: trunk/Include/abgl.ab @ 435

Last change on this file since 435 was 300, checked in by dai, 16 years ago

trunkディレクトリを作成。bin、Include、TestCaseをtrunkに移動した。
標準ライブラリのビルドバッチを追加。

File size: 52.4 KB
Line 
1#ifndef _INC_ABGL
2#define _INC_ABGL
3
4#require <GL/gl.sbp>
5#require <GL/glu.sbp>
6
7Enum VertexFormatsf
8    PositionOnly
9    PositionColoered
10End Enum
11
12Enum VertexFormatsd
13    PositionOnly
14    PositionColoered
15End Enum
16
17NameSpace CustomVertexf
18    Type PositionOnly
19        x As GLfloat
20        y As GLfloat
21        z As GLfloat
22    Public
23    End Type
24
25    Type PositionColoered
26    Public
27        x As GLfloat
28        y As GLfloat
29        z As GLfloat
30        r As GLfloat
31        g As GLfloat
32        b As GLfloat
33        a As GLfloat
34    End Type
35End NameSpace
36
37NameSpace CustomVertexd
38    Type PositionOnly
39    Public
40        x As GLdouble
41        y As GLdouble
42        z As GLdouble
43    End Type
44
45    Type PositionColoered
46    Public
47        x As GLdouble
48        y As GLdouble
49        z As GLdouble
50        r As GLdouble
51        g As GLdouble
52        b As GLdouble
53        a As GLdouble
54    End Type
55End NameSpace
56
57Class VertexBuffer
58Public
59    Sub VertexBuffer()
60    End Sub
61    Sub ~VertexBuffer()
62    End Sub
63
64Public
65    Function Size() As GLuint
66        Return 0
67    End Function
68    Function Lock() As VoidPtr
69        Return NULL
70    End Function
71    Sub Unlock()
72    End Sub
73End Class
74
75Type XY_FLOAT
76    x As GLfloat
77    y As GLfloat
78End Type
79
80Type XY_DOUBLE
81    x As GLdouble
82    y As GLdouble
83End Type
84
85Class Vector2f
86Public /* constructor */
87    Sub Vector2f()
88        This.X=0.0 As GLfloat
89        This.Y=0.0 As GLfloat
90    End Sub
91    Sub Vector2f(x As GLfloat, y As GLfloat)
92        This.X=x
93        This.Y=y
94    End Sub
95    Sub Vector2f(Vec As Vector2d)
96        This.X=Vec.X As GLfloat
97        This.Y=Vec.Y As GLfloat
98    End Sub
99
100Public /* destructor */
101    Sub ~Vector2f()
102    End Sub
103
104Public /* property */
105    Function X() As GLfloat
106        Return xy.x
107    End Function
108    Function Y() As GLfloat
109        Return xy.y
110    End Function
111    Sub X(x As GLfloat)
112        xy.x=x
113    End Sub
114    Sub Y(y As GLfloat)
115        xy.y=y
116    End Sub
117
118Public /* operator */
119    Sub Operator = (ByRef SrcVec As Vector2f)
120        This.X=SrcVec.X
121        This.Y=SrcVec.Y
122    End Sub
123    Function Operator + (SrcVec As Vector2f) As Vector2f
124        Return Add(This,SrcVec)
125    End Function
126    Function Operator - (SrcVec As Vector2f) As Vector2f
127        Return Substract(This,SrcVec)
128    End Function
129/*  Function Operator * (SrcVec As Vector2f) As GLfloat
130        Return Dot(This,SrcVec)
131    End Function*/
132    Function Operator * (Src As GLint) As Vector2f
133        Dim ret As Vector2f(This.X*Src,This.Y*Src)
134        Return ret
135    End Function
136    Function Operator * (Src As GLfloat) As Vector2f
137        Dim ret As Vector2f(This.X*Src,This.Y*Src)
138        Return ret
139    End Function
140    Function Operator * (Src As GLdouble) As Vector2f
141        Dim ret As Vector2f(This.X*Src As GLfloat,This.Y*Src As GLfloat)
142        Return ret
143    End Function
144    Function Operator / (Src As GLint) As Vector2f
145        Dim ret As Vector2f(This.X/Src,This.Y/Src)
146        Return ret
147    End Function
148    Function Operator / (Src As GLfloat) As Vector2f
149        Dim ret As Vector2f(This.X/Src,This.Y/Src)
150        Return ret
151    End Function
152    Function Operator / (Src As GLdouble) As Vector2f
153        Dim ret As Vector2f(This.X/Src,This.Y/Src)
154        Return ret
155    End Function
156
157    Function Operator == (Vec As Vector2f) As Boolean
158        If This.X=Vec.X and This.Y=Vec.Y Then
159            Return True
160        Else
161            Return False
162        End If
163    End Function
164
165Public /* method */
166    Function Add(SrcVec1 As Vector2f, SrcVec2 As Vector2f) As Vector2f
167        Dim ret As Vector2f(SrcVec1.X+SrcVec2.X,SrcVec1.Y+SrcVec2.Y)
168        Return ret
169    End Function
170    Function Distance(SrcVec1 As Vector2f, SrcVec2 As Vector2f) As GLfloat
171        Dim ret As Vector2f
172        ret=SrcVec1-SrcVec2
173        Return ret.Magnitude
174    End Function
175    Function Dot(SrcVec1 As Vector2f, SrcVec2 As Vector2f) As GLfloat
176        Return (SrcVec1.X*SrcVec2.X)+(SrcVec1.Y*SrcVec2.Y)
177    End Function
178    Function Empty() As Vector2f
179        Return New Vector2f()
180    End Function
181    Function Magnitude() As GLfloat
182        Return Math.Sqrt(This.X^2+This.Y^2) As GLfloat
183    End Function
184    Sub Normalize()
185        Dim ret As Vector2f(This.X/This.Magnitude,This.Y/This.Magnitude)
186        This = ret
187    End Sub
188    Function NormalizedVector() As Vector2f
189        Dim ret As Vector2f(This.X/This.Magnitude,This.Y/This.Magnitude)
190        Return ret
191    End Function
192    Function Substract(SrcVec1 As Vector2f, SrcVec2 As Vector2f) As Vector2f
193        Dim ret As Vector2f(SrcVec1.X-SrcVec2.X,SrcVec1.Y-SrcVec2.Y)
194        Return ret
195    End Function
196    Sub Reverse()
197        Dim ret As Vector2f(-This.X,-This.Y)
198        This = ret
199    End Sub
200    Function ReversedVector() As Vector2f
201        Dim ret As Vector2f(-This.X,-This.Y)
202        Return ret
203    End Function
204
205Public /* Object Class Override */
206    Override Function Equals( object As Object ) As Boolean
207        If This.GetHashCode() = object.GetHashCode() Then
208            Return True
209        Else
210            Return False
211        End If
212    End Function
213    Override Function ToString() As String
214        Return GetType().Name
215    End Function
216
217Protected /* Data */
218    xy As XY_FLOAT
219End Class
220
221Class Vector2d
222Public /* constructor */
223    Sub Vector2d()
224        This.X=0.0 As GLdouble
225        This.Y=0.0 As GLdouble
226    End Sub
227    Sub Vector2d(x As GLdouble, y As GLdouble)
228        xy.x=x
229        xy.y=y
230    End Sub
231    Sub Vector2d(Vec As Vector2f)
232        This.X=Vec.X As GLdouble
233        This.Y=Vec.Y As GLdouble
234    End Sub
235
236Public /* destructor */
237    Sub ~Vector2d()
238    End Sub
239
240Public /* property */
241    Function X() As GLdouble
242        Return xy.x
243    End Function
244    Function Y() As GLdouble
245        Return xy.y
246    End Function
247    Sub X(x As GLdouble)
248        xy.x=x
249    End Sub
250    Sub Y(y As GLdouble)
251        xy.y=y
252    End Sub
253
254Public /* operator */
255    Sub Operator = (ByRef SrcVec As Vector2d)
256        This.X=SrcVec.X
257        This.Y=SrcVec.Y
258    End Sub
259    Function Operator + (SrcVec As Vector2d) As Vector2d
260        Return Add(This,SrcVec)
261    End Function
262    Function Operator - (SrcVec As Vector2d) As Vector2d
263        Return Substract(This,SrcVec)
264    End Function
265/*  Function Operator * (SrcVec As Vector2d) As GLdouble
266        Return Dot(This,SrcVec)
267    End Function*/
268    Function Operator * (Src As GLint) As Vector2d
269        Dim ret As Vector2d(This.X*Src,SrcVec.Y*Src)
270        Return ret
271    End Function
272    Function Operator * (Src As GLfloat) As Vector2d
273        Dim ret As Vector2d(This.X*Src,SrcVec.Y*Src)
274        Return ret
275    End Function
276    Function Operator * (Src As GLdouble) As Vector2d
277        Dim ret As Vector2d(This.X*Src,SrcVec.Y*Src)
278        Return ret
279    End Function
280    Function Operator / (Src As GLint) As Vector2d
281        Dim ret As Vector2d(This.X/Src,SrcVec.Y/Src)
282        Return ret
283    End Function
284    Function Operator / (Src As GLfloat) As Vector2d
285        Dim ret As Vector2d(This.X/Src,SrcVec.Y/Src)
286        Return ret
287    End Function
288    Function Operator / (Src As GLdouble) As Vector2d
289        Dim ret As Vector2d(This.X/Src,SrcVec.Y/Src)
290        Return ret
291    End Function
292
293    Function Operator == (Vec As Vector2d) As Boolean
294        If This.X=Vec.X and This.Y=Vec.Y Then
295            Return True
296        Else
297            Return False
298        End If
299    End Function
300
301
302Public /* method */
303    Function Add(SrcVec1 As Vector2d, SrcVec2 As Vector2d) As Vector2d
304        Dim ret As Vector2d(SrcVec1.X+SrcVec2.X,SrcVec1.Y+SrcVec2.Y)
305        Return ret
306    End Function
307    Function Distance(SrcVec1 As Vector2d, SrcVec2 As Vector2d) As GLdouble
308        Dim ret As Vector2d
309        ret=SrcVec1-SrcVec2
310        Return ret.Magnitude
311    End Function
312    Function Dot(SrcVec1 As Vector2d, SrcVec2 As Vector2d) As GLdouble
313        Return SrcVec1.X*SrcVec2.X+SrcVec1.Y*SrcVec2.Y
314    End Function
315    Function Empty() As Vector2d
316        Return New Vector2d()
317    End Function
318    Function Magnitude() As GLdouble
319        Return Math.Sqrt(This.X^2+This.Y^2) As GLdouble
320    End Function
321    Sub Normalize()
322        Dim ret As Vector2d(This.X/This.Magnitude,This.Y/This.Magnitude)
323        This = ret
324    End Sub
325    Function NormalizedVector() As Vector2d
326        Dim ret As Vector2d(This.X/This.Magnitude,This.Y/This.Magnitude)
327        Return ret
328    End Function
329    Function Substract(SrcVec1 As Vector2d, SrcVec2 As Vector2d) As Vector2d
330        Dim ret As Vector2d(SrcVec1.X-SrcVec2.X,SrcVec1.Y-SrcVec2.Y)
331        Return ret
332    End Function
333    Sub Reverse()
334        Dim ret As Vector2d(-This.X,-This.Y)
335        This = ret
336    End Sub
337    Function ReversedVector() As Vector2d
338        Dim ret As Vector2d(-This.X,-This.Y)
339        Return ret
340    End Function
341
342Public /* Object Class Override */
343    Override Function Equals( object As Object ) As Boolean
344        If This.GetHashCode() = object.GetHashCode() Then
345            Return True
346        Else
347            Return False
348        End If
349    End Function
350    Override Function ToString() As String
351        Return GetType().Name
352    End Function
353
354Public /* Data */
355    xz As XY_DOUBLE
356End Class
357
358
359Type XYZ_FLOAT
360    x As GLfloat
361    y As GLfloat
362    z As GLfloat
363End Type
364
365Type XYZ_DOUBLE
366    x As GLdouble
367    y As GLdouble
368    z As GLdouble
369End Type
370
371Class Vector3f
372Public /* constructor */
373    Sub Vector3f()
374        This.X=0.0 As GLfloat
375        This.Y=0.0 As GLfloat
376        This.Z=0.0 As GLfloat
377    End Sub
378    Sub Vector3f(x As GLfloat, y As GLfloat, z As GLfloat)
379        xyz.x=x
380        xyz.y=y
381        xyz.z=z
382    End Sub
383    Sub Vector3f(Vec As Vector3d)
384        This.X=Vec.X As GLfloat
385        This.Y=Vec.Y As GLfloat
386        This.Z=Vec.Z As GLfloat
387    End Sub
388
389Public /* destructor */
390    Sub ~Vector3f()
391    End Sub
392
393Public /* property */
394    Function X() As GLfloat
395        Return xyz.x
396    End Function
397    Function Y() As GLfloat
398        Return xyz.y
399    End Function
400    Function Z() As GLfloat
401        Return xyz.z
402    End Function
403    Sub X(x As GLfloat)
404        xyz.x=x
405    End Sub
406    Sub Y(y As GLfloat)
407        xyz.y=y
408    End Sub
409    Sub Z(z As GLfloat)
410        xyz.z=z
411    End Sub
412
413Public /* operator */
414    Sub Operator = (ByRef SrcVec As Vector3f)
415        This.X=SrcVec.X
416        This.Y=SrcVec.Y
417    End Sub
418    Function Operator + (SrcVec As Vector3f) As Vector3f
419        Return Add(This,SrcVec)
420    End Function
421    Function Operator - (SrcVec As Vector3f) As Vector3f
422        Return Substract(This,SrcVec)
423    End Function
424/*  Function Operator * (SrcVec As Vector3f) As GLfloat
425        Return Dot(This,SrcVec)
426    End Function*/
427    Function Operator ^ (SrcVec As Vector3f) As Vector3f
428        Return Cross(This,SrcVec)
429    End Function
430
431    Function Operator * (Src As GLint) As Vector3f
432        Dim ret As Vector3f(This.X*Src,This.Y*Src,This.Z*Src)
433        Return ret
434    End Function
435    Function Operator * (Src As GLfloat) As Vector3f
436        Dim ret As Vector3f(This.X*Src,This.Y*Src,This.Z*Src)
437        Return ret
438    End Function
439    Function Operator * (Src As GLdouble) As Vector3f
440        Dim ret As Vector3f(This.X*Src,This.Y*Src,This.Z*Src)
441        Return ret
442    End Function
443    Function Operator / (Src As GLint) As Vector3f
444        Dim ret As Vector3f(This.X/Src,This.Y/Src,This.Z/Src)
445        Return ret
446    End Function
447    Function Operator / (Src As GLfloat) As Vector3f
448        Dim ret As Vector3f(This.X/Src,This.Y/Src,This.Z/Src)
449        Return ret
450    End Function
451    Function Operator / (Src As GLdouble) As Vector3f
452        Dim ret As Vector3f(This.X/Src,This.Y/Src,This.Z/Src)
453        Return ret
454    End Function
455
456    Function Operator == (Vec As Vector3f) As Boolean
457        If This.X=Vec.X and This.Y=Vec.Y and This.Z=Vec.Z Then
458            Return True
459        Else
460            Return False
461        End If
462    End Function
463
464Public /* method */
465    Function Add(SrcVec1 As Vector3f, SrcVec2 As Vector3f) As Vector3f
466        Dim ret As Vector3f(SrcVec1.X+SrcVec2.X,SrcVec1.Y+SrcVec2.Y,SrcVec1.Z+SrcVec2.Z)
467        Return ret
468    End Function
469    Function Cross(SrcVec1 As Vector3f, SrcVec2 As Vector3f) As Vector3f
470        Dim ret As Vector3f(SrcVec1.Y*SrcVec2.Z-SrcVec1.Z*SrcVec2.Y,SrcVec1.Z*SrcVec2.X-SrcVec1.X*SrcVec2.Z,SrcVec1.X*SrcVec2.Y-SrcVec1.Y*SrcVec2.X)
471        Return ret
472    End Function
473    Function Distance(SrcVec1 As Vector3f, SrcVec2 As Vector3f) As GLfloat
474        Dim ret As Vector3f
475        ret=SrcVec1-SrcVec2
476        Return ret.Magnitude
477    End Function
478    Function Dot(SrcVec1 As Vector3f, SrcVec2 As Vector3f) As GLfloat
479        Return SrcVec1.X*SrcVec2.X+SrcVec1.Y*SrcVec2.Y+SrcVec1.Z*SrcVec2.Z
480    End Function
481    Function Empty() As Vector3f
482        Return New Vector3f()
483    End Function
484    Function Magnitude() As GLfloat
485        Return Math.Sqrt(This.X^2+This.Y^2+This.Z^2) As GLfloat
486    End Function
487    Sub Normalize()
488        Dim ret As Vector3f(This.X/This.Magnitude,This.Y/This.Magnitude,This.Z/This.Magnitude)
489        This = ret
490    End Sub
491    Function NormalizedVector() As Vector3f
492        Dim ret As Vector3f(This.X/This.Magnitude,This.Y/This.Magnitude,This.Z/This.Magnitude)
493        Return ret
494    End Function
495    Function Substract(SrcVec1 As Vector3f, SrcVec2 As Vector3f) As Vector3f
496        Dim ret As Vector3f(SrcVec1.X-SrcVec2.X,SrcVec1.Y-SrcVec2.Y,SrcVec1.Z-SrcVec2.Z)
497        Return ret
498    End Function
499    Sub Reverse()
500        Dim ret As Vector3f(-This.X,-This.Y,-This.Z)
501        This = ret
502    End Sub
503    Function ReversedVector() As Vector3f
504        Dim ret As Vector3f(-This.X,-This.Y,-This.Z)
505        Return ret
506    End Function
507
508Public /* Object Class Override */
509    Override Function Equals( object As Object ) As Boolean
510        If This.GetHashCode() = object.GetHashCode() Then
511            Return True
512        Else
513            Return False
514        End If
515    End Function
516    Override Function ToString() As String
517        Return GetType().Name
518    End Function
519
520Public /* Data */
521    xyz As XYZ_FLOAT
522End Class
523
524Class Vector3d
525Public /* constructor */
526    Sub Vector3d()
527        This.X=0.0 As GLdouble
528        This.Y=0.0 As GLdouble
529        This.Z=0.0 As GLdouble
530    End Sub
531    Sub Vector3d(x As GLdouble, y As GLdouble, z As GLdouble)
532        xyz.x=x
533        xyz.y=y
534        xyz.z=z
535    End Sub
536    Sub Vector3d(Vec As Vector3f)
537        This.X=Vec.X As GLdouble
538        This.Y=Vec.Y As GLdouble
539        This.Z=Vec.Z As GLdouble
540    End Sub
541
542Public /* destructor */
543    Sub ~Vector3d()
544    End Sub
545
546
547Public /* property */
548    Function X() As GLdouble
549        Return xyz.x
550    End Function
551    Function Y() As GLdouble
552        Return xyz.y
553    End Function
554    Function Z() As GLdouble
555        Return xyz.z
556    End Function
557    Sub X(x As GLdouble)
558        xyz.x=x
559    End Sub
560    Sub Y(y As GLdouble)
561        xyz.y=y
562    End Sub
563    Sub Z(z As GLdouble)
564        xyz.z=z
565    End Sub
566
567
568Public /* operator */
569    Sub Operator = (ByRef SrcVec As Vector3d)
570        This.X=SrcVec.X
571        This.Y=SrcVec.Y
572    End Sub
573    Function Operator + (SrcVec As Vector3d) As Vector3d
574        Return Add(This,SrcVec)
575    End Function
576    Function Operator - (SrcVec As Vector3d) As Vector3d
577        Return Substract(This,SrcVec)
578    End Function
579/*  Function Operator * (SrcVec As Vector3d) As GLdouble
580        Return Dot(This,SrcVec)
581    End Function*/
582    Function Operator ^ (SrcVec As Vector3d) As Vector3d
583        Return Cross(This,SrcVec)
584    End Function
585
586    Function Operator * (Src As GLint) As Vector3d
587        Dim ret As Vector3d(This.X*Src,This.Y*Src,This.Z*Src)
588        Return ret
589    End Function
590    Function Operator * (Src As GLfloat) As Vector3d
591        Dim ret As Vector3d(This.X*Src,This.Y*Src,This.Z*Src)
592        Return ret
593    End Function
594    Function Operator * (Src As GLdouble) As Vector3d
595        Dim ret As Vector3d(This.X*Src,This.Y*Src,This.Z*Src)
596        Return ret
597    End Function
598    Function Operator / (Src As GLint) As Vector3d
599        Dim ret As Vector3d(This.X/Src,This.Y/Src,This.Z/Src)
600        Return ret
601    End Function
602    Function Operator / (Src As GLfloat) As Vector3d
603        Dim ret As Vector3d(This.X/Src,This.Y/Src,This.Z/Src)
604        Return ret
605    End Function
606    Function Operator / (Src As GLdouble) As Vector3d
607        Dim ret As Vector3d(This.X/Src,This.Y/Src,This.Z/Src)
608        Return ret
609    End Function
610
611    Function Operator == (Vec As Vector3d) As Boolean
612        If This.X=Vec.X and This.Y=Vec.Y and This.Z=Vec.Z Then
613            Return True
614        Else
615            Return False
616        End If
617    End Function
618
619
620Public /* method */
621    Function Add(SrcVec1 As Vector3d, SrcVec2 As Vector3d) As Vector3d
622        Dim ret As Vector3d(SrcVec1.X+SrcVec2.X,SrcVec1.Y+SrcVec2.Y,SrcVec1.Z+SrcVec2.Z)
623        Return ret
624    End Function
625    Function Cross(SrcVec1 As Vector3d, SrcVec2 As Vector3d) As Vector3d
626        Dim ret As Vector3d(SrcVec1.Y*SrcVec2.Z-SrcVec1.Z*SrcVec2.Y,SrcVec1.Z*SrcVec2.X-SrcVec1.X*SrcVec2.Z,SrcVec1.X*SrcVec2.Y-SrcVec1.Y*SrcVec2.X)
627        Return ret
628    End Function
629    Function Distance(SrcVec1 As Vector3d, SrcVec2 As Vector3d) As GLdouble
630        Dim ret As Vector3d
631        ret=SrcVec1-SrcVec2
632        Return ret.Magnitude
633    End Function
634    Function Dot(SrcVec1 As Vector3d, SrcVec2 As Vector3d) As GLdouble
635        Return SrcVec1.X*SrcVec2.X+SrcVec1.Y*SrcVec2.Y+SrcVec1.Z*SrcVec2.Z
636    End Function
637    Function Empty() As Vector3d
638        Dim ret As Vector3d()
639        Return ret
640    End Function
641    Function Magnitude() As GLdouble
642        Return Math.Sqrt(This.X^2+This.Y^2+This.Z^2) As GLdouble
643    End Function
644    Sub Normalize()
645        Dim ret As Vector3d(This.X/This.Magnitude,This.Y/This.Magnitude,This.Z/This.Magnitude)
646        This = ret
647    End Sub
648    Function NormalizedVector() As Vector3d
649        Dim ret As Vector3d(This.X/This.Magnitude,This.Y/This.Magnitude,This.Z/This.Magnitude)
650        Return ret
651    End Function
652    Function Substract(SrcVec1 As Vector3d, SrcVec2 As Vector3d) As Vector3d
653        Dim ret As Vector3d(SrcVec1.X-SrcVec2.X,SrcVec1.Y-SrcVec2.Y,SrcVec1.Z-SrcVec2.Z)
654        Return ret
655    End Function
656    Sub Reverse()
657        Dim ret As Vector3d(-This.X,-This.Y,-This.Z)
658        This = ret
659    End Sub
660    Function ReversedVector() As Vector3d
661        Dim ret As Vector3d(-This.X,-This.Y,-This.Z)
662        Return ret
663    End Function
664
665Public /* Object Class Override */
666    Override Function Equals( object As Object ) As Boolean
667        If This.GetHashCode() = object.GetHashCode() Then
668            Return True
669        Else
670            Return False
671        End If
672    End Function
673    Override Function ToString() As String
674        Return GetType().Name
675    End Function
676
677Public /* Data */
678    xyz As XYZ_DOUBLE
679End Class
680
681NameSpace Matrix
682    Class Matrix3x3f
683    End Class
684
685    Class Matrix3x3d
686    End Class
687
688    Class Matrix4x4f
689    End Class
690
691    Class Matrix4x4d
692    End Class
693End NameSpace
694
695Type RGB_FLOAT
696    r As GLfloat
697    g As GLfloat
698    b As GLfloat
699End Type
700
701Type RGB_DOUBLE
702    r As GLdouble
703    g As GLdouble
704    b As GLdouble
705End Type
706
707Class Color3f
708Public /* constructor */
709    Sub Color3f(r As GLfloat, g As GLfloat, b As GLfloat)
710        rgb.r = r
711        rgb.g = g
712        rgb.b = b
713    End Sub
714    Sub Color3f(color As Color3d)
715        rgba.r = color.R As GLfloat
716        rgba.g = color.G As GLfloat
717        rgba.b = color.B As GLfloat
718    End Sub
719
720Public /* destructor */
721    Sub ~Color3f()
722    End Sub
723
724Public /* property */
725    Function R() As GLfloat
726        Return rgb.r
727    End Function
728    Function G() As GLfloat
729        Return rgb.g
730    End Function
731    Function B() As GLfloat
732        Return rgb.b
733    End Function
734    Sub R(r As GLfloat)
735        rgb.r = r
736    End Sub
737    Sub G(g As GLfloat)
738        rgb.g = g
739    End Sub
740    Sub B(b As GLfloat)
741        rgb.b = b
742    End Sub
743
744Public /* operator */
745    Sub operator = (c As Color3f)
746        This.R=c.R
747        This.G=c.G
748        This.B=c.B
749    End Sub
750
751Public /* method */
752    ' HSBを求める式はhttp://ofo.jp/osakana/cgtips/hsb.phtmlを参考にした
753    ' Drawwing\Color.abをさらに参考にしました。
754    Function GetHue() As GLfloat
755        Dim max As GLfloat, min As GLfloat, d As GLfloat
756        max = Math.Max(Math.Max(rgb.r, rgb.g), rgb.b)
757        min = Math.Min(Math.Min(rgb.r, rgb.g), rgb.b)
758        d = max - min
759        If rgb.g = max Then
760            Return ((rgb.b - rgb.r) As Double / d * 60.0 + 120.0) As GLfloat
761        ElseIf rgb.b = max Then
762            Return ((rgb.r - rgb.g) As Double / d * 60.0 + 240.0) As GLfloat
763        ElseIf rgb.g < rgb.b Then
764            Return ((rgb.g - rgb.b) As Double / d * 60.0 + 360.0) As GLfloat
765        Else
766            Return ((rgb.g - rgb.b) As Double / d * 60.0) As GLfloat
767        EndIf
768    End Function
769
770    Function GetSaturation() As GLfloat
771        Dim max As GLfloat, min As GLfloat
772        max = Math.Max(Math.Max(rgb.r, rgb.g), rgb.b)
773        min = Math.Min(Math.Min(rgb.r, rgb.g), rgb.b)
774        Return (max - min) / max
775    End Function
776
777    Function GetVolue() As GLfloat
778        Dim max As GLfloat
779        max = Math.Max(Math.Max(rgb.r, rgb.g), rgb.b)
780        Return max
781    End Function
782
783Public /* static method */
784    Static Function FromRGB(r As GLubyte, g As GLubyte, b As GLubyte) As Color3f
785        Dim ret As Color3f((r As GLfloat)/255.0 As GLfloat,(g As GLfloat)/255.0 As GLfloat,(b As GLfloat)/255.0 As GLfloat)
786        Return ret
787    End Function
788    Static Function FromCOLORREF(c As COLORREF) As Color3f
789        Dim ret As Color3f((c and &hff) As GLfloat/255,(c>>8 and &hff) As GLfloat/255,(c>>16 and &hff) As GLfloat/255)
790        Return ret
791    End Function
792    Static Function FromHSV(h As GLfloat, s As GLfloat, v As GLfloat) As Color3f
793        Dim r As GLfloat
794        Dim g As GLfloat
795        Dim b As GLfloat
796        If h<0 Then h+=360.0
797        If h>360.0 Then h-=360.0
798        Select Case (h/60) As Long
799            Case 0
800                r=v
801                g=v*(1-s*(1-(h/60-(h/60) As Long)))
802                b=v*(1-s)
803            Case 1
804                r=v*(1-s*(h/60-(h/60) As Long))
805                g=v
806                b=v*(1-s)
807            Case 2
808                r=v*(1-s)
809                g=v
810                b=v*(1-s*(1-(h/60-(h/60) As Long)))
811            Case 3
812                r=v*(1-s)
813                g=v*(1-s*(h/60-(h/60) As Long))
814                b=v
815            Case 4
816                r=v*(1-s*(1-(h/60-(h/60) As Long)))
817                g=v*(1-s)
818                b=v
819            Case 5
820                r=v
821                g=v*(1-s)
822                b=v*(1-s*(h/60-(h/60) As Long))
823            Case 6
824                r=v
825                g=v*(1-s*(1-(h/60-(h/60) As Long)))
826                b=v*(1-s)
827        End Select
828
829        Dim ret As Color3f(r,g,b)
830        Return ret
831    End Function
832
833Public
834    rgb As RGB_FLOAT
835End Class
836
837Class Color3d
838Public /* constructor */
839    Sub Color3d(r As GLdouble, g As GLdouble, b As GLdouble)
840        rgb.r = r
841        rgb.g = g
842        rgb.b = b
843    End Sub
844    Sub Color3d(color As Color3f)
845        rgba.r = color.R As GLdouble
846        rgba.g = color.G As GLdouble
847        rgba.b = color.B As GLdouble
848    End Sub
849
850Public /* destructor */
851    Sub ~Color3d()
852    End Sub
853
854Public /* property */
855    Function R() As GLdouble
856        Return rgb.r
857    End Function
858    Function G() As GLdouble
859        Return rgb.g
860    End Function
861    Function B() As GLdouble
862        Return rgb.b
863    End Function
864    Sub R(r As GLdouble)
865        rgb.r = r
866    End Sub
867    Sub G(g As GLdouble)
868        rgb.g = g
869    End Sub
870    Sub B(b As GLdouble)
871        rgb.b = b
872    End Sub
873
874Public /* method */
875    ' HSBを求める式はhttp://ofo.jp/osakana/cgtips/hsb.phtmlを参考にした
876    ' Drawwing\Color.abをさらに参考にしました。
877    Function GetHue() As GLdouble
878        Dim max As GLdouble, min As GLdouble, d As GLdouble
879        max = Math.Max(Math.Max(rgb.r, rgb.g), rgb.b)
880        min = Math.Min(Math.Min(rgb.r, rgb.g), rgb.b)
881        d = max - min
882        If rgb.g = max Then
883            Return ((rgb.b - rgb.r) As Double / d * 60.0 + 120.0) As GLfloat
884        ElseIf rgb.b = max Then
885            Return ((rgb.r - rgb.g) As Double / d * 60.0 + 240.0) As GLfloat
886        ElseIf rgb.g < rgb.b Then
887            Return ((rgb.g - rgb.b) As Double / d * 60.0 + 360.0) As GLfloat
888        Else
889            Return ((rgb.g - rgb.b) As Double / d * 60.0) As GLfloat
890        EndIf
891    End Function
892
893    Function GetSaturation() As GLdouble
894        Dim max As GLdouble, min As GLdouble
895        max = Math.Max(Math.Max(rgb.r, rgb.g), rgb.b)
896        min = Math.Min(Math.Min(rgb.r, rgb.g), rgb.b)
897        Return (max - min) / max
898    End Function
899
900    Function GetVolue() As GLdouble
901        Dim max As GLdouble
902        max = Math.Max(Math.Max(rgb.r, rgb.g), rgb.b)
903        Return max
904    End Function
905
906Public /* static method */
907    Static Function FromRGB(r As GLubyte, g As GLubyte, b As GLubyte) As Color3d
908        Dim ret As Color3d(r/255,g/255,b/255)
909        Return ret
910    End Function
911    Static Function FromCOLORREF(c As COLORREF) As Color3d
912        Dim ret As Color3d((c and &hff)/255,(c>>8 and &hff)/255,(c>>16 and &hff)/255)
913        Return ret
914    End Function
915    Static Function FromHSV(h As GLdouble, s As GLdouble, v As GLdouble) As Color3d
916        Dim r As GLdouble
917        Dim g As GLdouble
918        Dim b As GLfloat
919        If h<0 Then h+=360.0
920        If h>360.0 Then h-=360.0
921        Select Case (h/60) As Long
922            Case 0
923                r=v
924                g=v*(1-s*(1-(h/60-(h/60) As Long)))
925                b=v*(1-s)
926            Case 1
927                r=v*(1-s*(h/60-(h/60) As Long))
928                g=v
929                b=v*(1-s)
930            Case 2
931                r=v*(1-s)
932                g=v
933                b=v*(1-s*(1-(h/60-(h/60) As Long)))
934            Case 3
935                r=v*(1-s)
936                g=v*(1-s*(h/60-(h/60) As Long))
937                b=v
938            Case 4
939                r=v*(1-s*(1-(h/60-(h/60) As Long)))
940                g=v*(1-s)
941                b=v
942            Case 5
943                r=v
944                g=v*(1-s)
945                b=v*(1-s*(h/60-(h/60) As Long))
946            Case 6
947                r=v
948                g=v*(1-s*(1-(h/60-(h/60) As Long)))
949                b=v*(1-s)
950        End Select
951
952        Dim ret As Color3d(r,g,b)
953        Return ret
954    End Function
955Public
956    rgb As RGB_DOUBLE
957End Class
958
959Type RGBA_FLOAT
960    r As GLfloat
961    g As GLfloat
962    b As GLfloat
963    a As GLfloat
964End Type
965
966Type RGBA_DOUBLE
967    r As GLdouble
968    g As GLdouble
969    b As GLdouble
970    a As GLdouble
971End Type
972
973Class Color4f
974Public /* constructor */
975    Sub Color4f(r As GLfloat, g As GLfloat, b As GLfloat, a As GLfloat)
976        rgba.r = r
977        rgba.g = g
978        rgba.b = b
979        rgba.a = a
980    End Sub
981    Sub Color4f(color As Color4d)
982        rgba.r = color.R As GLfloat
983        rgba.g = color.G As GLfloat
984        rgba.b = color.B As GLfloat
985        rgba.a = color.A As GLfloat
986    End Sub
987
988Public /* destructor */
989    Sub ~Color4f()
990    End Sub
991
992Public /* property */
993    Function R() As GLfloat
994        Return rgba.r
995    End Function
996    Function G() As GLfloat
997        Return rgba.g
998    End Function
999    Function B() As GLfloat
1000        Return rgba.b
1001    End Function
1002    Function A() As GLfloat
1003        Return rgba.a
1004    End Function
1005    Sub R(r As GLfloat)
1006        rgba.r = r
1007    End Sub
1008    Sub G(g As GLfloat)
1009        rgba.g = g
1010    End Sub
1011    Sub B(b As GLfloat)
1012        rgba.b = b
1013    End Sub
1014    Sub A(a As GLfloat)
1015        rgba.a = a
1016    End Sub
1017
1018Public /* operator */
1019    Sub operator = (ByRef c As Color4f)
1020        This.R=c.R
1021        This.G=c.G
1022        This.B=c.B
1023        This.A=c.A
1024    End Sub
1025
1026Public /* method */
1027    ' HSBを求める式はhttp://ofo.jp/osakana/cgtips/hsb.phtmlを参考にした
1028    ' Drawwing\Color.abをさらに参考にしました。
1029    Function GetHue() As GLfloat
1030        Dim max As GLfloat, min As GLfloat, d As GLfloat
1031        max = Math.Max(Math.Max(rgb.r, rgb.g), rgb.b)
1032        min = Math.Min(Math.Min(rgb.r, rgb.g), rgb.b)
1033        d = max - min
1034        If rgb.g = max Then
1035            Return ((rgb.b - rgb.r) As Double / d * 60.0 + 120.0) As GLfloat
1036        ElseIf rgb.b = max Then
1037            Return ((rgb.r - rgb.g) As Double / d * 60.0 + 240.0) As GLfloat
1038        ElseIf rgb.g < rgb.b Then
1039            Return ((rgb.g - rgb.b) As Double / d * 60.0 + 360.0) As GLfloat
1040        Else
1041            Return ((rgb.g - rgb.b) As Double / d * 60.0) As GLfloat
1042        EndIf
1043    End Function
1044
1045    Function GetSaturation() As GLfloat
1046        Dim max As GLfloat, min As GLfloat
1047        max = Math.Max(Math.Max(rgb.r, rgb.g), rgb.b)
1048        min = Math.Min(Math.Min(rgb.r, rgb.g), rgb.b)
1049        Return (max - min) / max
1050    End Function
1051
1052    Function GetVolue() As GLfloat
1053        Dim max As GLfloat
1054        max = Math.Max(Math.Max(rgb.r, rgb.g), rgb.b)
1055        Return max
1056    End Function
1057
1058Public /* static method */
1059    Static Function FromRGB(r As GLubyte, g As GLubyte, b As GLubyte) As Color4f
1060        Dim ret As Color4f(r/255,g/255,b/255,1.0)
1061        Return ret
1062    End Function
1063    Static Function FromArgb(a As GLubyte, r As GLubyte, g As GLubyte, b As GLubyte) As Color4f
1064        Dim ret As Color4f(r/255,g/255,b/255,a/255)
1065        Return ret
1066    End Function
1067    Static Function FromCOLORREF(c As COLORREF) As Color4f
1068        Dim ret As Color4f((c and &hff)/255,(c>>8 and &hff)/255,(c>>16 and &hff)/255,1.0)
1069        Return ret
1070    End Function
1071    Static Function FromHSV(h As GLfloat, s As GLfloat, v As GLfloat, a As GLfloat) As Color4f
1072        Dim r As GLfloat
1073        Dim g As GLfloat
1074        Dim b As GLfloat
1075        If h<0 Then h+=360.0
1076        If h>360.0 Then h-=360.0
1077        Select Case (h/60) As Long
1078            Case 0
1079                r=v
1080                g=v*(1-s*(1-(h/60-(h/60) As Long)))
1081                b=v*(1-s)
1082            Case 1
1083                r=v*(1-s*(h/60-(h/60) As Long))
1084                g=v
1085                b=v*(1-s)
1086            Case 2
1087                r=v*(1-s)
1088                g=v
1089                b=v*(1-s*(1-(h/60-(h/60) As Long)))
1090            Case 3
1091                r=v*(1-s)
1092                g=v*(1-s*(h/60-(h/60) As Long))
1093                b=v
1094            Case 4
1095                r=v*(1-s*(1-(h/60-(h/60) As Long)))
1096                g=v*(1-s)
1097                b=v
1098            Case 5
1099                r=v
1100                g=v*(1-s)
1101                b=v*(1-s*(h/60-(h/60) As Long))
1102            Case 6
1103                r=v
1104                g=v*(1-s*(1-(h/60-(h/60) As Long)))
1105                b=v*(1-s)
1106        End Select
1107
1108        Dim ret As Color4f(r,g,b,a)
1109        Return ret
1110    End Function
1111
1112Public
1113    rgba As RGBA_FLOAT
1114End Class
1115
1116Class Color4d
1117
1118Public /* constructor */
1119    Sub Color4d(r As GLdouble, g As GLdouble, b As GLdouble, a As GLdouble)
1120        rgba.r = r
1121        rgba.g = g
1122        rgba.b = b
1123        rgba.a = a
1124    End Sub
1125    Sub Color4d(color As Color4f)
1126        rgba.r = color.R As GLdouble
1127        rgba.g = color.G As GLdouble
1128        rgba.b = color.B As GLdouble
1129        rgba.a = color.A As GLdouble
1130    End Sub
1131
1132Public /* destructor */
1133    Sub ~Color4d()
1134    End Sub
1135
1136Public /* property */
1137    Function R() As GLdouble
1138        Return rgba.r
1139    End Function
1140    Function G() As GLdouble
1141        Return rgba.g
1142    End Function
1143    Function B() As GLdouble
1144        Return rgba.b
1145    End Function
1146    Function A() As GLdouble
1147        Return rgba.a
1148    End Function
1149    Sub R(r As GLdouble)
1150        rgba.r = r
1151    End Sub
1152    Sub G(g As GLdouble)
1153        rgba.g = g
1154    End Sub
1155    Sub B(b As GLdouble)
1156        rgba.b = b
1157    End Sub
1158    Sub A(a As GLdouble)
1159        rgba.a = a
1160    End Sub
1161
1162Public /* operator */
1163    Sub operator = (ByRef c As Color4d)
1164        This.R=c.R
1165        This.G=c.G
1166        This.B=c.B
1167        This.A=c.A
1168    End Sub
1169
1170Public /* method */
1171    ' HSBを求める式はhttp://ofo.jp/osakana/cgtips/hsb.phtmlを参考にした
1172    ' Drawwing\Color.abをさらに参考にしました。
1173    Function GetHue() As GLfloat
1174        Dim max As GLfloat, min As GLfloat, d As GLfloat
1175        max = Math.Max(Math.Max(rgb.r, rgb.g), rgb.b)
1176        min = Math.Min(Math.Min(rgb.r, rgb.g), rgb.b)
1177        d = max - min
1178        If rgb.g = max Then
1179            Return ((rgb.b - rgb.r) As Double / d * 60.0 + 120.0) As GLdouble
1180        ElseIf rgb.b = max Then
1181            Return ((rgb.r - rgb.g) As Double / d * 60.0 + 240.0) As GLdouble
1182        ElseIf rgb.g < rgb.b Then
1183            Return ((rgb.g - rgb.b) As Double / d * 60.0 + 360.0) As GLdouble
1184        Else
1185            Return ((rgb.g - rgb.b) As Double / d * 60.0) As GLdouble
1186        EndIf
1187    End Function
1188
1189    Function GetSaturation() As GLdouble
1190        Dim max As GLdouble, min As GLdouble
1191        max = Math.Max(Math.Max(rgb.r, rgb.g), rgb.b)
1192        min = Math.Min(Math.Min(rgb.r, rgb.g), rgb.b)
1193        Return (max - min) / max
1194    End Function
1195
1196    Function GetVolue() As GLdouble
1197        Dim max As GLdouble
1198        max = Math.Max(Math.Max(rgb.r, rgb.g), rgb.b)
1199        Return max
1200    End Function
1201
1202Public /* static method */
1203    Static Function FromRGB(r As GLubyte, g As GLubyte, b As GLubyte) As Color4d
1204        Dim ret As Color4d(r/255,g/255,b/255,1.0)
1205        Return ret
1206    End Function
1207    Static Function FromArgb(a As GLubyte, r As GLubyte, g As GLubyte, b As GLubyte) As Color4d
1208        Dim ret As Color4d(r/255,g/255,b/255,a/255)
1209        Return ret
1210    End Function
1211    Static Function FromCOLORREF(c As COLORREF) As Color4d
1212        Dim ret As Color4d((c and &hff)/255,(c>>8 and &hff)/255,(c>>16 and &hff)/255,1.0)
1213        Return ret
1214    End Function
1215    Static Function FromHSV(h As GLdouble, s As GLdouble, v As GLdouble, a As GLdouble) As Color4d
1216        Dim r As GLdouble
1217        Dim g As GLdouble
1218        Dim b As GLdouble
1219        Dim a As GLdouble
1220        If h<0 Then h+=360.0
1221        If h>360.0 Then h-=360.0
1222        Select Case (h/60) As Long
1223            Case 0
1224                r=v
1225                g=v*(1-s*(1-(h/60-(h/60) As Long)))
1226                b=v*(1-s)
1227            Case 1
1228                r=v*(1-s*(h/60-(h/60) As Long))
1229                g=v
1230                b=v*(1-s)
1231            Case 2
1232                r=v*(1-s)
1233                g=v
1234                b=v*(1-s*(1-(h/60-(h/60) As Long)))
1235            Case 3
1236                r=v*(1-s)
1237                g=v*(1-s*(h/60-(h/60) As Long))
1238                b=v
1239            Case 4
1240                r=v*(1-s*(1-(h/60-(h/60) As Long)))
1241                g=v*(1-s)
1242                b=v
1243            Case 5
1244                r=v
1245                g=v*(1-s)
1246                b=v*(1-s*(h/60-(h/60) As Long))
1247            Case 6
1248                r=v
1249                g=v*(1-s*(1-(h/60-(h/60) As Long)))
1250                b=v*(1-s)
1251        End Select
1252
1253        Dim ret As Color4f(r,g,b,a)
1254        Return ret
1255    End Function
1256
1257Public
1258    rgba As RGBA_DOUBLE
1259End Class
1260
1261
1262Class Light
1263Private
1264    Const Number As GLenum
1265
1266Public
1267    Sub Enabled(enabled As GLboolean)
1268        If enabled Then
1269            glEnable(Number)
1270        Else
1271            glDisable(Number)
1272        End If
1273    End Sub
1274    Function Enabled() As GLboolean
1275        Dim lighting As GLboolean
1276        glGetBooleanv(Number,VarPtr(lighting))
1277        Return lighting
1278    End Function
1279
1280Public /* constructor */
1281    Sub Light(num As GLenum)
1282        Number=num
1283    End Sub
1284
1285Public
1286    Sub SetAmbient(red As GLfloat, green As GLfloat, blue As GLfloat, alpha As GLfloat)
1287        Dim amb[3] As GLfloat
1288        amb[0]=red
1289        amb[1]=green
1290        amb[2]=blue
1291        amb[3]=alpha
1292        glLightfv(Number,GL_AMBIENT,amb)
1293    End Sub
1294    Sub SetAmbient(ByRef color As Color4f)
1295        Dim amb[3] As GLfloat
1296        amb[0]=color.R
1297        amb[1]=color.G
1298        amb[2]=color.B
1299        amb[3]=color.A
1300        glLightfv(Number,GL_AMBIENT,amb)
1301    End Sub
1302    Sub SetAmbient(amb As *GLfloat)
1303        glLightfv(Number,GL_AMBIENT,amb)
1304    End Sub
1305
1306    Sub SetDiffuse(red As GLfloat, green As GLfloat, blue As GLfloat, alpha As GLfloat)
1307        Dim dif[3] As GLfloat
1308        dif[0]=red
1309        dif[1]=green
1310        dif[2]=blue
1311        dif[3]=alpha
1312        glLightfv(Number,GL_DIFFUSE,dif)
1313    End Sub
1314    Sub SetDiffuse(ByRef color As Color4f)
1315        Dim dif[3] As GLfloat
1316        amb[0]=color.R
1317        amb[1]=color.G
1318        amb[2]=color.B
1319        amb[3]=color.A
1320        glLightfv(Number,GL_DIFFUSE,dif)
1321    End Sub
1322    Sub SetDiffuse(dif As *GLfloat)
1323        glLightfv(Number,GL_DIFFUSE,dif)
1324    End Sub
1325
1326    Sub SetSpecular(red As GLfloat, green As GLfloat, blue As GLfloat, alpha As GLfloat)
1327        Dim spc[3] As GLfloat
1328        spc[0]=red
1329        spc[1]=green
1330        spc[2]=blue
1331        spc[3]=alpha
1332        glLightfv(Number,GL_SPECULAR,spc)
1333    End Sub
1334    Sub SetSpecular(ByRef color As Color4f)
1335        Dim spc[3] As GLfloat
1336        amb[0]=color.R
1337        amb[1]=color.G
1338        amb[2]=color.B
1339        amb[3]=color.A
1340        glLightfv(Number,GL_SPECULAR,spc)
1341    End Sub
1342    Sub SetSpecular(spc As *GLfloat)
1343        glLightfv(Number,GL_SPECULAR,spc)
1344    End Sub
1345
1346    Sub SetPosition(pos As *GLfloat)
1347        glLightfv(Number,GL_POSITION,pos)
1348    End Sub
1349End Class
1350
1351Class LightsCollection
1352Public
1353    Function Item() As Light
1354        Return
1355    End Function
1356End Class
1357
1358Class MaterialManager
1359Public
1360    Sub Ambient(red As GLfloat, green As GLfloat, blue As GLfloat, alpha As GLfloat)
1361        Dim face As GLenum
1362        glGetIntegerv(GL_COLOR_MATERIAL_FACE,VarPtr(face))
1363        Dim amb[3] As GLfloat
1364        amb[0]=red
1365        amb[1]=green
1366        amb[2]=blue
1367        amb[3]=alpha
1368        glMaterialfv(face,GL_AMBIENT,amb)
1369    End Sub
1370    Sub Ambient(ByRef color As Color4f)
1371        Dim face As GLenum
1372        glGetIntegerv(GL_COLOR_MATERIAL_FACE,VarPtr(face))
1373        Dim amb[3] As GLfloat
1374        amb[0]=color.R
1375        amb[1]=color.G
1376        amb[2]=color.B
1377        amb[3]=color.A
1378        glMaterialfv(face,GL_AMBIENT,amb)
1379    End Sub
1380    Sub Ambient(amb As *GLfloat)
1381        glMaterialfv(face,GL_AMBIENT,amb)
1382    End Sub
1383
1384    Sub Diffuse(red As GLfloat, green As GLfloat, blue As GLfloat, alpha As GLfloat)
1385        Dim face As GLenum
1386        glGetIntegerv(GL_COLOR_MATERIAL_FACE,VarPtr(face))
1387        Dim dif[3] As GLfloat
1388        dif[0]=red
1389        dif[1]=green
1390        dif[2]=blue
1391        dif[3]=alpha
1392        glMaterialfv(face,GL_DIFFUSE,dif)
1393    End Sub
1394    Sub Diffuse(ByRef color As Color4f)
1395        Dim face As GLenum
1396        glGetIntegerv(GL_COLOR_MATERIAL_FACE,VarPtr(face))
1397        Dim dif[3] As GLfloat
1398        dif[0]=color.R
1399        dif[1]=color.G
1400        dif[2]=color.B
1401        dif[3]=color.A
1402        glMaterialfv(face,GL_DIFFUSE,dif)
1403    End Sub
1404    Sub Diffuse(dif As *GLfloat)
1405        glMaterialfv(face,GL_DIFFUSE,dif)
1406    End Sub
1407
1408    Sub Specular(red As GLfloat, green As GLfloat, blue As GLfloat, alpha As GLfloat)
1409        Dim face As GLenum
1410        glGetIntegerv(GL_COLOR_MATERIAL_FACE,VarPtr(face))
1411        Dim spc[3] As GLfloat
1412        spc[0]=red
1413        spc[1]=green
1414        spc[2]=blue
1415        spc[3]=alpha
1416        glMaterialfv(face,GL_SPECULAR,spc)
1417    End Sub
1418    Sub Specular(ByRef color As Color4f)
1419        Dim face As GLenum
1420        glGetIntegerv(GL_COLOR_MATERIAL_FACE,VarPtr(face))
1421        Dim spc[3] As GLfloat
1422        spc[0]=color.R
1423        spc[1]=color.G
1424        spc[2]=color.B
1425        spc[3]=color.A
1426        glMaterialfv(face,GL_SPECULAR,spc)
1427    End Sub
1428    Sub Specular(spc As *GLfloat)
1429        glMaterialfv(face,GL_SPECULAR,spc)
1430    End Sub
1431
1432    Sub Shininess(shin As GLfloat)
1433        Dim face As GLenum
1434        glGetIntegerv(GL_COLOR_MATERIAL_FACE,VarPtr(face))
1435        glMaterialf(face,GL_SHININESS,shin)
1436    End Sub
1437
1438    Sub Emission(red As GLfloat, green As GLfloat, blue As GLfloat, alpha As GLfloat)
1439        Dim face As GLenum
1440        glGetIntegerv(GL_COLOR_MATERIAL_FACE,VarPtr(face))
1441        Dim ems[3] As GLfloat
1442        ems[0]=red
1443        ems[1]=green
1444        ems[2]=blue
1445        ems[3]=alpha
1446        glMaterialfv(face,GL_EMISSION,ems)
1447    End Sub
1448End Class
1449
1450Class ModelViewMatrix
1451Public
1452    Sub LoadIdentity()
1453        Dim mode As GLenum
1454        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode) As *Long)
1455        If mode<>GL_MODELVIEW Then glMatrixMode(GL_MODELVIEW)
1456        glLoadIdentity()
1457        If mode<>GL_MODELVIEW Then glMatrixMode(mode)
1458    End Sub
1459    Sub LookAt(eyex As GLdouble, eyey As GLdouble, eyez As GLdouble, centerx As GLdouble, centery As GLdouble, centerz As GLdouble, upx As GLdouble, upy As GLdouble, upz As GLdouble)
1460        Dim mode As GLenum
1461        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode))
1462        If mode<>GL_MODELVIEW Then glMatrixMode(GL_MODELVIEW)
1463        gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz)
1464        If mode<>GL_MODELVIEW Then glMatrixMode(mode)
1465    End Sub
1466    Sub RotateX(angle As GLdouble)
1467        Dim mode As GLenum
1468        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode) As *Long)
1469        If mode<>GL_MODELVIEW Then glMatrixMode(GL_MODELVIEW)
1470        glRotated(angle, 1.0 As GLdouble, 0.0 As GLdouble, 0.0 As GLdouble)
1471        If mode<>GL_MODELVIEW Then glMatrixMode(mode)
1472    End Sub
1473    Sub RotateX(angle As GLfloat)
1474        Dim mode As GLenum
1475        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode))
1476        If mode<>GL_MODELVIEW Then glMatrixMode(GL_MODELVIEW)
1477        glRotatef(angle, 1.0 As GLfloat, 0.0 As GLfloat, 0.0 As GLfloat)
1478        If mode<>GL_MODELVIEW Then glMatrixMode(mode)
1479    End Sub
1480    Sub RotateY(angle As GLdouble)
1481        Dim mode As GLenum
1482        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode) As *Long)
1483        If mode<>GL_MODELVIEW Then glMatrixMode(GL_MODELVIEW)
1484        glRotated(angle, 0.0 As GLdouble, 1.0 As GLdouble, 0.0 As GLdouble)
1485        If mode<>GL_MODELVIEW Then glMatrixMode(mode)
1486    End Sub
1487    Sub RotateY(angle As GLfloat)
1488        Dim mode As GLenum
1489        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode))
1490        If mode<>GL_MODELVIEW Then glMatrixMode(GL_MODELVIEW)
1491        glRotatef(angle, 0.0 As GLfloat, 1.0 As GLfloat, 0.0 As GLfloat)
1492        If mode<>GL_MODELVIEW Then glMatrixMode(mode)
1493    End Sub
1494    Sub RotateZ(angle As GLdouble)
1495        Dim mode As GLenum
1496        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode))
1497        If mode<>GL_MODELVIEW Then glMatrixMode(GL_MODELVIEW)
1498        glRotated(angle, 0.0 As GLdouble, 0.0 As GLdouble, 1.0 As GLdouble)
1499        If mode<>GL_MODELVIEW Then glMatrixMode(mode)
1500    End Sub
1501    Sub RotateZ(angle As GLfloat)
1502        Dim mode As GLenum
1503        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode))
1504        If mode<>GL_MODELVIEW Then glMatrixMode(GL_MODELVIEW)
1505        glRotatef(angle, 0.0 As GLfloat, 0.0 As GLfloat, 1.0 As GLfloat)
1506        If mode<>GL_MODELVIEW Then glMatrixMode(mode)
1507    End Sub
1508    Sub Scale(x As GLdouble, y As GLdouble, z As GLdouble)
1509        Dim mode As GLenum
1510        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode))
1511        If mode<>GL_MODELVIEW Then glMatrixMode(GL_MODELVIEW)
1512        glScaled(x, y, z)
1513        If mode<>GL_MODELVIEW Then glMatrixMode(mode)
1514    End Sub
1515    Sub Scale(x As GLfloat, y As GLfloat, z As GLfloat)
1516        Dim mode As GLenum
1517        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode))
1518        If mode<>GL_MODELVIEW Then glMatrixMode(GL_MODELVIEW)
1519        glScalef(x, y, z)
1520        If mode<>GL_MODELVIEW Then glMatrixMode(mode)
1521    End Sub
1522    Sub Translate(x As GLdouble, y As GLdouble, z As GLdouble)
1523        Dim mode As GLenum
1524        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode) As *GLint)
1525        If mode<>GL_MODELVIEW Then glMatrixMode(GL_MODELVIEW)
1526        glTranslated(x, y, z)
1527        If mode<>GL_MODELVIEW Then glMatrixMode(mode)
1528    End Sub
1529    Sub Translate(x As GLfloat, y As GLfloat, z As GLfloat)
1530        Dim mode As GLenum
1531        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode) As *Long)
1532        If mode<>GL_MODELVIEW Then glMatrixMode(GL_MODELVIEW)
1533        glTranslatef(x, y, z)
1534        If mode<>GL_MODELVIEW Then glMatrixMode(mode)
1535    End Sub
1536End Class
1537
1538Class ProjectionMatrix
1539Public
1540    Sub LoadIdentity()
1541        Dim mode As GLenum
1542        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode) As *Long)
1543        If mode<>GL_PROJECTION Then glMatrixMode(GL_PROJECTION)
1544        glLoadIdentity()
1545        If mode<>GL_PROJECTION Then glMatrixMode(mode)
1546    End Sub
1547    Sub Ortho2D(left As GLdouble, right As GLdouble, bottom As GLdouble, top As GLdouble)
1548        Dim mode As GLenum
1549        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode) As *Long)
1550        If mode<>GL_PROJECTION Then glMatrixMode(GL_PROJECTION)
1551        gluOrtho2D(left, right, bottom, top)
1552        If mode<>GL_PROJECTION Then glMatrixMode(mode)
1553    End Sub
1554    Sub Ortho3D(left As GLdouble, right As GLdouble, bottom As GLdouble, top As GLdouble, zNear As GLdouble, zFar As GLdouble)
1555        Dim mode As GLenum
1556        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode))
1557        If mode<>GL_PROJECTION Then glMatrixMode(GL_PROJECTION)
1558        glOrtho(left, right, bottom, top, zNear, zFar)
1559        If mode<>GL_PROJECTION Then glMatrixMode(mode)
1560    End Sub
1561    Sub Frustum(left As GLdouble, right As GLdouble, bottom As GLdouble, top As GLdouble, zNear As GLdouble, zFar As GLdouble)
1562        Dim mode As GLenum
1563        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode))
1564        If mode<>GL_PROJECTION Then glMatrixMode(GL_PROJECTION)
1565        glFrustum(left, right, bottom, top, zNear, zFar)
1566        If mode<>GL_PROJECTION Then glMatrixMode(mode)
1567    End Sub
1568    Sub Perspective(fovy As GLdouble, aspect As GLdouble, zNear As GLdouble, zFar As GLdouble)
1569        Dim mode As GLenum
1570        glGetIntegerv(GL_MATRIX_MODE,VarPtr(mode) As *Long)
1571        If mode<>GL_PROJECTION Then glMatrixMode(GL_PROJECTION)
1572        gluPerspective(fovy, aspect, zNear, zFar)
1573        If mode<>GL_PROJECTION Then glMatrixMode(mode)
1574    End Sub
1575End Class
1576
1577Class TransformMatrix
1578Public
1579    Projection As ProjectionMatrix
1580    ModelView As ModelViewMatrix
1581
1582Public
1583    Sub Transform()
1584        Projection=New ProjectionMatrix
1585        ModelView=New ModelViewMatrix
1586    End Sub
1587End Class
1588
1589Class LightModelManager
1590Public
1591    Function Ambient () As Color4f
1592        Dim amb As Color4f
1593        glGetFloatv(GL_LIGHT_MODEL_AMBIENT,VarPtr(amb.rgba))
1594        Return amb
1595    End Function
1596    Sub Ambient(amb As Color4f)
1597        glLightModelfv(GL_LIGHT_MODEL_AMBIENT,VarPtr(amb.rgba))
1598    End Sub
1599
1600    Function LocalView() As GLboolean
1601        Dim local As GLboolean
1602        glGetBooleanv(GL_LIGHT_MODEL_LOCAL_VIEW,VarPtr(local))
1603        Return local
1604    End Function
1605    Sub LocalView(enable As GLboolean)
1606        If enable Then
1607            glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEW,GL_TRUE)
1608        Else
1609            glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEW,GL_FALSE)
1610        End If
1611    End Sub
1612
1613    Function TwoSide() As GLboolean
1614        Dim local As GLboolean
1615        glGetBooleanv(GL_LIGHT_MODEL_TWO_SIDE,VarPtr(local))
1616        Return local
1617    End Function
1618    Sub TwoSide(enable As GLboolean)
1619        If enable Then
1620            glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE)
1621        Else
1622            glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_FALSE)
1623        End If
1624    End Sub
1625End Class
1626
1627Class RenderStateManager
1628Public /* Composiotion */
1629    LightModel As LightModelManager
1630
1631Public
1632    Sub RenderStateManager()
1633        LightModel = New LightModelManager()
1634    End Sub
1635    Function AlphaTestEnable() As GLboolean
1636        Dim alpha As GLboolean
1637        glGetBooleanv(GL_ALPHA_TEST,VarPtr(alpha))
1638        Return alpha
1639    End Function
1640    Sub AlphaTestEnable(enable As GLboolean)
1641        If enable Then
1642            glEnable(GL_ALPHA_TEST)
1643        Else
1644            glDisable(GL_ALPHA_TEST)
1645        End If
1646    End Sub
1647
1648    Function AlphaFunction() As GLenum
1649        Dim func As GLenum
1650        glGetIntegerv(GL_ALPHA_TEST_FUNC,VarPtr(func))
1651        Return func
1652    End Function
1653    Sub AlphaFunction(func As GLenum)
1654        Dim ref As GLclampf
1655        glGetFloatv(GL_ALPHA_TEST_REF,VarPtr(ref))
1656        glAlphaFunc(func,ref)
1657    End Sub
1658
1659    Function BlendEnable() As GLboolean
1660        Dim blend As GLboolean
1661        glGetBooleanv(GL_BLEND,VarPtr(blend))
1662        Return blend
1663    End Function
1664    Sub BlendEnable(enable As GLboolean)
1665        If enable Then
1666            glEnable(GL_BLEND)
1667        Else
1668            glDisable(GL_BLEND)
1669        End If
1670    End Sub
1671
1672    Function BlendDestinationFactor() As GLenum
1673        Dim dfactor As GLenum
1674        glGetIntegerv(GL_BLEND_DST,VarPtr(dfactor))
1675        Return dfactor
1676    End Function
1677    Sub BlendDestinationFactor(dfactor As GLenum)
1678        Dim sfactor As GLenum
1679        glGetIntegerv(GL_BLEND_SRC,VarPtr(sfactor))
1680        glBlendFunc(sfactor,dfactor)
1681    End Sub
1682
1683    Function BlendSourceFactor() As GLenum
1684        Dim sfactor As GLenum
1685        glGetIntegerv(GL_BLEND_SRC,VarPtr(sfactor))
1686        Return sfactor
1687    End Function
1688    Sub BlendSourceFactor(sfactor As GLenum)
1689        Dim dfactor As GLenum
1690        glGetIntegerv(GL_BLEND_DST,VarPtr(dfactor))
1691        glBlendFunc(sfactor,dfactor)
1692    End Sub
1693
1694    Function CullFaceEnable() As GLboolean
1695        Dim cull As GLboolean
1696        glGetBooleanv(GL_CULL_FACE,VarPtr(cull))
1697        Return cull
1698    End Function
1699    Sub CullFaceEnable(enable As GLboolean)
1700        If enable Then
1701            glEnable(GL_CULL_FACE)
1702        Else
1703            glDisable(GL_CULL_FACE)
1704        End If
1705    End Sub
1706
1707    Function CullFaceMode () As GLenum
1708        Dim mode As GLenum
1709        glGetIntegerv(GL_CULL_FACE_MODE,VarPtr(mode))
1710        Return mode
1711    End Function
1712    Sub CullFaceMode(mode As GLenum)
1713        glCullFace(mode)
1714    End Sub
1715
1716    Function DepthTestEnable () As GLboolean
1717        Dim depth As GLboolean
1718        glGetBooleanv(GL_DEPTH_TEST,VarPtr(depth))
1719        Return depth
1720    End Function
1721    Sub DepthTestEnable(enable As GLboolean)
1722        If enable Then
1723            glEnable(GL_DEPTH_TEST)
1724        Else
1725            glDisable(GL_DEPTH_TEST)
1726        End If
1727    End Sub
1728
1729    Function DepthFunction () As GLenum
1730        Dim func As GLenum
1731        glGetIntegerv(GL_DEPTH_FUNC,VarPtr(func))
1732        Return func
1733    End Function
1734    Sub DepthFunction(func As GLenum)
1735        glDepthFunc(func)
1736    End Sub
1737
1738    Function DepthBufferWritable() As GLboolean
1739        Dim writable As GLboolean
1740        glGetBooleanv(GL_DEPTH_WRITEMASK,VarPtr(writable))
1741        Return writable
1742    End Function
1743    Sub DepthBufferWritable(enable As GLboolean)
1744        If enable Then
1745            glDepthMask(GL_DEPTH_WRITEMASK)
1746        Else
1747            glDepthMask(GL_DEPTH_WRITEMASK)
1748        End If
1749    End Sub
1750
1751    Function DitherEnable() As GLboolean
1752        Dim dither As GLboolean
1753        glGetBooleanv(GL_DITHER,VarPtr(dither))
1754        Return dither
1755    End Function
1756    Sub DitherEnable(enable As GLboolean)
1757        If enable Then
1758            glEnable(GL_DITHER)
1759        Else
1760            glDisable(GL_DITHER)
1761        End If
1762    End Sub
1763
1764    Function FogEnable () As GLboolean
1765        Dim fog As GLboolean
1766        glGetBooleanv(GL_FOG,VarPtr(fog))
1767        Return fog
1768    End Function
1769    Sub FogEnable(enable As GLboolean)
1770        If enable Then
1771            glEnable(GL_FOG)
1772        Else
1773            glDisable(GL_FOG)
1774        End If
1775    End Sub
1776
1777    Function FogMode() As GLenum
1778        Dim mode As GLenum
1779        glGetIntegerv(GL_FOG_MODE,VarPtr(mode))
1780        Return mode
1781    End Function
1782    Sub FogMode(mode As GLenum)
1783        glFogi(GL_FOG_MODE,mode)
1784    End Sub
1785
1786    Function FogColor() As Color4f
1787        Dim ret As Color4f
1788        glGetFloatv(GL_FOG_COLOR,VarPtr(ret.rgba))
1789        Return ret
1790    End Function
1791    Sub FogColor(fcolor As Color4f)
1792        glFogfv(GL_FOG_COLOR,VarPtr(fcolor.rgba))
1793    End Sub
1794
1795    Function FogDensity() As GLfloat
1796        Dim density As GLfloat
1797        glGetFloatv(GL_FOG_DENSITY,density)
1798        Return density
1799    End Function
1800    Sub FogDensity(density As GLfloat)
1801        glFogf(GL_FOG_DENSITY,density)
1802    End Sub
1803
1804    Function FogStart() As GLfloat
1805        Dim fstrat As GLfloat
1806        glGetFloatv(GL_FOG_START,fstrat)
1807        Return fstrat
1808    End Function
1809    Sub FogStart(fstrat As GLfloat)
1810        glFogf(GL_FOG_START,fstrat)
1811    End Sub
1812
1813    Function FogEnd() As GLfloat
1814        Dim fend As GLfloat
1815        glGetFloatv(GL_FOG_END,fend)
1816        Return fend
1817    End Function
1818    Sub FogEnd(fend As GLfloat)
1819        glFogf(GL_FOG_END,fend)
1820    End Sub
1821
1822    Function Lighting() As GLboolean
1823        Dim lighting As GLboolean
1824        glGetBooleanv(GL_LIGHTING,VarPtr(lighting))
1825        Return lighting
1826    End Function
1827    Sub Lighting(enable As GLboolean)
1828        If enable Then
1829            glEnable(GL_LIGHTING)
1830        Else
1831            glDisable(GL_LIGHTING)
1832        End If
1833    End Sub
1834
1835    Function LineSmoothEnable() As GLboolean
1836        Dim smooth As GLboolean
1837        glGetBooleanv(GL_LINE_SMOOTH,VarPtr(smooth))
1838        Return smooth
1839    End Function
1840    Sub LineSmoothEnable(enable As GLboolean)
1841        If enable Then
1842            glEnable(GL_LINE_SMOOTH)
1843        Else
1844            glDisable(GL_LINE_SMOOTH)
1845        End If
1846    End Sub
1847
1848    Function LogicOpEnable() As GLboolean
1849        Dim logic As GLboolean
1850        glGetBooleanv(GL_COLOR_LOGIC_OP,VarPtr(logic))
1851        Return logic
1852    End Function
1853    Sub LogicOpEnable(enable As GLboolean)
1854        If enable Then
1855            glEnable(GL_COLOR_LOGIC_OP)
1856        Else
1857            glDisable(GL_COLOR_LOGIC_OP)
1858        End If
1859    End Sub
1860
1861    Function LogicOpCode() As GLenum
1862        Dim code As GLenum
1863        glGetFloatv(GL_COLOR_LOGIC_OP_MODE,code)
1864        Return code
1865    End Function
1866    Sub LogicOpCode(code As GLenum)
1867        glLogicOp(code)
1868    End Sub
1869
1870    Function PointSmoothEnable() As GLboolean
1871        Dim smooth As GLboolean
1872        glGetBooleanv(GL_POINT_SMOOTH,VarPtr(smooth))
1873        Return smooth
1874    End Function
1875    Sub PointSmoothEnable(enable As GLboolean)
1876        If enable Then
1877            glEnable(GL_POINT_SMOOTH)
1878        Else
1879            glDisable(GL_POINT_SMOOTH)
1880        End If
1881    End Sub
1882
1883    Function PolygonSmoothEnable() As GLboolean
1884        Dim smooth As GLboolean
1885        glGetBooleanv(GL_POLYGON_SMOOTH,VarPtr(smooth))
1886        Return smooth
1887    End Function
1888    Sub PolygonSmoothEnable(enable As GLboolean)
1889        If enable Then
1890            glEnable(GL_POLYGON_SMOOTH)
1891        Else
1892            glDisable(GL_POLYGON_SMOOTH)
1893        End If
1894    End Sub
1895
1896    Function ReferenceAlpha() As GLclampf
1897        Dim ref As GLclampf
1898        glGetFloatv(GL_ALPHA_TEST_REF,VarPtr(ref))
1899        Return ref
1900    End Function
1901    Sub ReferenceAlpha(ref As GLclampf)
1902        Dim func As GLenum
1903        glGetIntegerv(GL_ALPHA_TEST_FUNC,VarPtr(func))
1904        glAlphaFunc(func,ref)
1905    End Sub
1906
1907    Function ShadeModel() As GLenum
1908        Dim mode As GLenum
1909        glGetIntegerv(GL_SHADE_MODEL,VarPtr(mode))
1910        Return mode
1911    End Function
1912    Sub ShadeModel(mode As GLenum)
1913        glShadeModel(mode)
1914    End Sub
1915End Class
1916
1917
1918Enum ColorType
1919    RgbColor=0
1920    RgbaColor=0
1921    IndexColor
1922End Enum
1923
1924Enum BufferType
1925    SingleBuffer=0
1926    DoubleBuffer
1927End Enum
1928
1929Enum ClearBuffer
1930    DepthBufferBit = &H00000100
1931    AccumBufferBit = &H00000200
1932    StencilBufferBit = &H00000400
1933    ColorBufferBit = &H00004000
1934End Enum
1935
1936Enum PrimitiveMode
1937    Points = &H0000
1938    Lines = &H0001
1939    LineLoop = &H0002
1940    LineStrip = &H0003
1941    Triangles = &H0004
1942    TriangleStrip = &H0005
1943    TriangleFan = &H0006
1944    Quads = &H0007
1945    QuadStrip = &H0008
1946    Polygon = &H0009
1947End Enum
1948
1949Class RenderingContext
1950Public /* Composiotion */
1951    Material As MaterialManager
1952    RenderState As RenderStateManager
1953    Transform As TransformMatrix
1954    Lights As LightsCollection
1955
1956Public /* Constructor */
1957    Sub RenderingContext()
1958        Dim hrc As HGLRC
1959        hrc=wglGetCurrentContext()
1960        If hrc Then
1961            wglMakeCurrent(NULL,NULL)
1962            wglDeleteContext(hrc)
1963        End If
1964
1965        Material = New MaterialManager()
1966        RenderState = New RenderStateManager()
1967        Transform = New TransformMatrix()
1968        Lights = New LightsCollection()
1969    End Sub
1970    Sub RenderingContext(hdc As HDC, ByRef pfd As PIXELFORMATDESCRIPTOR)
1971        RenderingContext()
1972
1973        Dim pf As Long
1974        pf=ChoosePixelFormat(hdc,pfd)
1975        If pf=0 Then
1976            MessageBox(NULL,"Choose Pixel Format failed","error",MB_OK)
1977            Exit Sub
1978        End If
1979        If SetPixelFormat(hdc,pf,pfd)=FALSE Then
1980            MessageBox(NULL,"Set Pixel Format failed","error",MB_OK)
1981            Exit Sub
1982        End If
1983
1984        Dim hrc As HGLRC
1985        hrc=wglCreateContext(hdc)
1986        wglMakeCurrent(hdc,hrc)
1987    End Sub
1988    Sub RenderingContext(hdc As HDC, ctype As ColorType, btype As BufferType)
1989        RenderingContext()
1990
1991        Dim pfd As PIXELFORMATDESCRIPTOR
1992        pfd.nSize=SizeOf(PIXELFORMATDESCRIPTOR) As Word
1993        pfd.nVersion=GL_VERSION_1_1
1994        If btype=BufferType.DoubleBuffer Then
1995            pfd.dwFlags or=PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER
1996        Else
1997            pfd.dwFlags or=PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL
1998        End If
1999        If ctype=ColorType.RgbColor Then
2000            pfd.iPixelType=PFD_TYPE_RGBA
2001        Else
2002            pfd.iPixelType=PFD_TYPE_COLORINDEX
2003        End If
2004        pfd.cColorBits=24
2005        pfd.cRedBits=0
2006        pfd.cRedShift=0
2007        pfd.cGreenBits=0
2008        pfd.cGreenShift=0
2009        pfd.cBlueBits=0
2010        pfd.cBlueShift=0
2011        pfd.cAlphaBits=0
2012        pfd.cAlphaShift=0
2013        pfd.cAccumBits=0
2014        pfd.cAccumRedBits=0
2015        pfd.cAccumGreenBits=0
2016        pfd.cAccumBlueBits=0
2017        pfd.cAccumAlphaBits=0
2018        pfd.cDepthBits=32
2019        pfd.cStencilBits=0
2020        pfd.cAuxBuffers=0
2021        pfd.iLayerType=PFD_MAIN_PLANE
2022        pfd.bReserved=0
2023        pfd.dwLayerMask=0
2024        pfd.dwVisibleMask=0
2025        pfd.dwDamageMask=0
2026        RenderingContext(hdc,pfd)
2027    End Sub
2028    Sub RenderingContext(hdc As HDC)
2029        RenderingContext(hdc As HDC, ColorType.RgbColor, BufferType.DoubleBuffer)
2030    End Sub
2031
2032Public /* Destructor */
2033    Sub ~RenderingContext()
2034        Dim hrc As HGLRC
2035        hrc=wglGetCurrentContext()
2036        wglMakeCurrent(NULL,NULL)
2037        wglDeleteContext(hrc)
2038    End Sub
2039
2040Public /* Method */
2041    Sub Begin(mode As GLenum)
2042        glBegin(mode)
2043    End Sub
2044    Sub Begin(mode As PrimitiveMode)
2045        glBegin(mode)
2046    End Sub
2047    Sub Clear(mask As GLbitfield)
2048        glClear(mask)
2049    End Sub
2050    Sub Clear(mask As ClearBuffer)
2051        glClear(mask)
2052    End Sub
2053
2054    Sub ClearAccum(red As GLfloat, green As GLfloat, blue As GLfloat, alpha As GLfloat)
2055        glClearAccum(red, green, blue, alpha)
2056    End Sub
2057    Sub ClearAccum(color As Color4f)
2058        glClearAccum(color.R, color.G, color.B, color.A)
2059    End Sub
2060    Sub ClearColor(red As GLclampf, green As GLclampf, blue As GLclampf, alpha As GLclampf)
2061        glClearColor(red, green, blue, alpha)
2062    End Sub
2063    Sub ClearColor(color As Color4f)
2064        glClearColor(color.R, color.G, color.B, color.A)
2065    End Sub
2066    Sub ClearDepth(depth As GLclampd)
2067        glClearDepth(depth)
2068    End Sub
2069    Sub ClearIndex(c As GLfloat)
2070        glClearIndex(c)
2071    End Sub
2072    Sub ClearStencil(s As GLint)
2073        glClearStencil(s)
2074    End Sub
2075
2076    Sub Color(red As GLdouble, green As GLdouble, blue As GLdouble)
2077        glColor3d(red,green,blue)
2078    End Sub
2079    Sub Color(red As GLdouble, green As GLdouble, blue As GLdouble, alpha As GLdouble)
2080        glColor4d(red,green,blue,alpha)
2081    End Sub
2082    Sub Color(red As GLfloat, green As GLfloat, blue As GLfloat)
2083        glColor3f(red,green,blue)
2084    End Sub
2085    Sub Color(red As GLfloat, green As GLfloat, blue As GLfloat, alpha As GLfloat)
2086        glColor4f(red,green,blue,alpha)
2087    End Sub
2088    Sub Color(c As Color3f)
2089        glColor3fv(VarPtr(c.rgb) As *Single)
2090    End Sub
2091    Sub Color(c As Color4f)
2092        glColor4fv(VarPtr(c.rgba) As *Single)
2093    End Sub
2094    Sub Color(c As Color3d)
2095        glColor3dv(VarPtr(c.rgb) As *Double)
2096    End Sub
2097    Sub Color(c As Color4d)
2098        glColor4dv(VarPtr(c.rgba) As *Double)
2099    End Sub
2100
2101    Sub DrawPrimiteve()
2102    End Sub
2103
2104    Sub End()
2105        glEnd()
2106    End Sub
2107
2108    Sub Finish()
2109        glFinish()
2110    End Sub
2111    Sub Flush()
2112        glFlush()
2113    End Sub
2114
2115    Function GenerateTexures() As GLint
2116        glGenTextures()
2117    End Function
2118
2119    Sub MatrixMode(mode As GLenum)
2120        glMatrixMode(mode)
2121    End Sub
2122
2123    Sub Present()
2124        SwapBuffers(wglGetCurrentDC())
2125    End Sub
2126    Sub Present(hdc As HDC)
2127        SwapBuffers(hdc)
2128    End Sub
2129
2130    Sub PopMatrix()
2131        glPopMatrix()
2132    End Sub
2133
2134    Sub PushMatrix()
2135        glPushMatrix()
2136    End Sub
2137
2138    Sub Vertex(x As GLdouble, y As GLdouble)
2139        glVertex2d(x,y)
2140    End Sub
2141    Sub Vertex(x As GLdouble, y As GLdouble, z As GLdouble)
2142        glVertex3d(x,y,z)
2143    End Sub
2144    Sub Vertex(x As GLdouble, y As GLdouble, z As GLdouble, w As GLdouble)
2145        glVertex4d(x,y,z,w)
2146    End Sub
2147    Sub Vertex(x As GLfloat, y As GLfloat)
2148        glVertex2f(x,y)
2149    End Sub
2150    Sub Vertex(x As GLfloat, y As GLfloat, z As GLfloat)
2151        glVertex3f(x,y,z)
2152    End Sub
2153    Sub Vertex(x As GLfloat, y As GLfloat, z As GLfloat, w As GLfloat)
2154        glVertex4f(x,y,z,w)
2155    End Sub
2156
2157    Sub Viewport(x As GLint, y As GLint, width As GLsizei, height As GLsizei)
2158        glViewport(x, y, width, height)
2159    End Sub
2160End Class
2161
2162#endif
Note: See TracBrowser for help on using the repository browser.