1#
2#
3#  Adaption of the delphi3d.net OpenGL units to FreePascal
4#  Sebastian Guenther (sg@freepascal.org) in 2002
5#  These units are free to use
6#******************************************************************************
7# Converted to Delphi by Tom Nuydens (tom@delphi3d.net)
8# For the latest updates, visit Delphi3D: http://www.delphi3d.net
9#******************************************************************************
10
11import
12  GL
13
14when defined(windows):
15  {.push, callconv: stdcall.}
16else:
17  {.push, callconv: cdecl.}
18
19when defined(windows):
20  const
21    dllname = "glu32.dll"
22elif defined(macosx):
23  const
24    dllname = "/System/Library/Frameworks/OpenGL.framework/Libraries/libGLU.dylib"
25else:
26  const
27    dllname = "libGLU.so.1"
28type
29  TViewPortArray* = array[0..3, TGLint]
30  T16dArray* = array[0..15, TGLdouble]
31  TCallBack* = proc ()
32  T3dArray* = array[0..2, TGLdouble]
33  T4pArray* = array[0..3, Pointer]
34  T4fArray* = array[0..3, TGLfloat]
35  PPointer* = ptr Pointer
36
37type
38  GLUnurbs*{.final.} = object
39  PGLUnurbs* = ptr GLUnurbs
40  GLUquadric*{.final.} = object
41  PGLUquadric* = ptr GLUquadric
42  GLUtesselator*{.final.} = object
43  PGLUtesselator* = ptr GLUtesselator # backwards compatibility:
44  GLUnurbsObj* = GLUnurbs
45  PGLUnurbsObj* = PGLUnurbs
46  GLUquadricObj* = GLUquadric
47  PGLUquadricObj* = PGLUquadric
48  GLUtesselatorObj* = GLUtesselator
49  PGLUtesselatorObj* = PGLUtesselator
50  GLUtriangulatorObj* = GLUtesselator
51  PGLUtriangulatorObj* = PGLUtesselator
52  TGLUnurbs* = GLUnurbs
53  TGLUquadric* = GLUquadric
54  TGLUtesselator* = GLUtesselator
55  TGLUnurbsObj* = GLUnurbsObj
56  TGLUquadricObj* = GLUquadricObj
57  TGLUtesselatorObj* = GLUtesselatorObj
58  TGLUtriangulatorObj* = GLUtriangulatorObj
59
60proc gluErrorString*(errCode: TGLenum): cstring{.dynlib: dllname,
61    importc: "gluErrorString".}
62proc gluErrorUnicodeStringEXT*(errCode: TGLenum): ptr int16{.dynlib: dllname,
63    importc: "gluErrorUnicodeStringEXT".}
64proc gluGetString*(name: TGLenum): cstring{.dynlib: dllname,
65    importc: "gluGetString".}
66proc gluOrtho2D*(left, right, bottom, top: TGLdouble){.dynlib: dllname,
67    importc: "gluOrtho2D".}
68proc gluPerspective*(fovy, aspect, zNear, zFar: TGLdouble){.dynlib: dllname,
69    importc: "gluPerspective".}
70proc gluPickMatrix*(x, y, width, height: TGLdouble, viewport: var TViewPortArray){.
71    dynlib: dllname, importc: "gluPickMatrix".}
72proc gluLookAt*(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz: TGLdouble){.
73    dynlib: dllname, importc: "gluLookAt".}
74proc gluProject*(objx, objy, objz: TGLdouble,
75                 modelMatrix, projMatrix: var T16dArray,
76                 viewport: var TViewPortArray, winx, winy, winz: PGLdouble): int{.
77    dynlib: dllname, importc: "gluProject".}
78proc gluUnProject*(winx, winy, winz: TGLdouble,
79                   modelMatrix, projMatrix: var T16dArray,
80                   viewport: var TViewPortArray, objx, objy, objz: PGLdouble): int{.
81    dynlib: dllname, importc: "gluUnProject".}
82proc gluScaleImage*(format: TGLenum, widthin, heightin: TGLint, typein: TGLenum,
83                    datain: Pointer, widthout, heightout: TGLint,
84                    typeout: TGLenum, dataout: Pointer): int{.dynlib: dllname,
85    importc: "gluScaleImage".}
86proc gluBuild1DMipmaps*(target: TGLenum, components, width: TGLint,
87                        format, atype: TGLenum, data: Pointer): int{.
88    dynlib: dllname, importc: "gluBuild1DMipmaps".}
89proc gluBuild2DMipmaps*(target: TGLenum, components, width, height: TGLint,
90                        format, atype: TGLenum, data: Pointer): int{.
91    dynlib: dllname, importc: "gluBuild2DMipmaps".}
92proc gluNewQuadric*(): PGLUquadric{.dynlib: dllname, importc: "gluNewQuadric".}
93proc gluDeleteQuadric*(state: PGLUquadric){.dynlib: dllname,
94    importc: "gluDeleteQuadric".}
95proc gluQuadricNormals*(quadObject: PGLUquadric, normals: TGLenum){.
96    dynlib: dllname, importc: "gluQuadricNormals".}
97proc gluQuadricTexture*(quadObject: PGLUquadric, textureCoords: TGLboolean){.
98    dynlib: dllname, importc: "gluQuadricTexture".}
99proc gluQuadricOrientation*(quadObject: PGLUquadric, orientation: TGLenum){.
100    dynlib: dllname, importc: "gluQuadricOrientation".}
101proc gluQuadricDrawStyle*(quadObject: PGLUquadric, drawStyle: TGLenum){.
102    dynlib: dllname, importc: "gluQuadricDrawStyle".}
103proc gluCylinder*(qobj: PGLUquadric, baseRadius, topRadius, height: TGLdouble,
104                  slices, stacks: TGLint){.dynlib: dllname,
105    importc: "gluCylinder".}
106proc gluDisk*(qobj: PGLUquadric, innerRadius, outerRadius: TGLdouble,
107              slices, loops: TGLint){.dynlib: dllname, importc: "gluDisk".}
108proc gluPartialDisk*(qobj: PGLUquadric, innerRadius, outerRadius: TGLdouble,
109                     slices, loops: TGLint, startAngle, sweepAngle: TGLdouble){.
110    dynlib: dllname, importc: "gluPartialDisk".}
111proc gluSphere*(qobj: PGLuquadric, radius: TGLdouble, slices, stacks: TGLint){.
112    dynlib: dllname, importc: "gluSphere".}
113proc gluQuadricCallback*(qobj: PGLUquadric, which: TGLenum, fn: TCallBack){.
114    dynlib: dllname, importc: "gluQuadricCallback".}
115proc gluNewTess*(): PGLUtesselator{.dynlib: dllname, importc: "gluNewTess".}
116proc gluDeleteTess*(tess: PGLUtesselator){.dynlib: dllname,
117    importc: "gluDeleteTess".}
118proc gluTessBeginPolygon*(tess: PGLUtesselator, polygon_data: Pointer){.
119    dynlib: dllname, importc: "gluTessBeginPolygon".}
120proc gluTessBeginContour*(tess: PGLUtesselator){.dynlib: dllname,
121    importc: "gluTessBeginContour".}
122proc gluTessVertex*(tess: PGLUtesselator, coords: var T3dArray, data: Pointer){.
123    dynlib: dllname, importc: "gluTessVertex".}
124proc gluTessEndContour*(tess: PGLUtesselator){.dynlib: dllname,
125    importc: "gluTessEndContour".}
126proc gluTessEndPolygon*(tess: PGLUtesselator){.dynlib: dllname,
127    importc: "gluTessEndPolygon".}
128proc gluTessProperty*(tess: PGLUtesselator, which: TGLenum, value: TGLdouble){.
129    dynlib: dllname, importc: "gluTessProperty".}
130proc gluTessNormal*(tess: PGLUtesselator, x, y, z: TGLdouble){.dynlib: dllname,
131    importc: "gluTessNormal".}
132proc gluTessCallback*(tess: PGLUtesselator, which: TGLenum, fn: TCallBack){.
133    dynlib: dllname, importc: "gluTessCallback".}
134proc gluGetTessProperty*(tess: PGLUtesselator, which: TGLenum, value: PGLdouble){.
135    dynlib: dllname, importc: "gluGetTessProperty".}
136proc gluNewNurbsRenderer*(): PGLUnurbs{.dynlib: dllname,
137                                        importc: "gluNewNurbsRenderer".}
138proc gluDeleteNurbsRenderer*(nobj: PGLUnurbs){.dynlib: dllname,
139    importc: "gluDeleteNurbsRenderer".}
140proc gluBeginSurface*(nobj: PGLUnurbs){.dynlib: dllname,
141                                        importc: "gluBeginSurface".}
142proc gluBeginCurve*(nobj: PGLUnurbs){.dynlib: dllname, importc: "gluBeginCurve".}
143proc gluEndCurve*(nobj: PGLUnurbs){.dynlib: dllname, importc: "gluEndCurve".}
144proc gluEndSurface*(nobj: PGLUnurbs){.dynlib: dllname, importc: "gluEndSurface".}
145proc gluBeginTrim*(nobj: PGLUnurbs){.dynlib: dllname, importc: "gluBeginTrim".}
146proc gluEndTrim*(nobj: PGLUnurbs){.dynlib: dllname, importc: "gluEndTrim".}
147proc gluPwlCurve*(nobj: PGLUnurbs, count: TGLint, aarray: PGLfloat,
148                  stride: TGLint, atype: TGLenum){.dynlib: dllname,
149    importc: "gluPwlCurve".}
150proc gluNurbsCurve*(nobj: PGLUnurbs, nknots: TGLint, knot: PGLfloat,
151                    stride: TGLint, ctlarray: PGLfloat, order: TGLint,
152                    atype: TGLenum){.dynlib: dllname, importc: "gluNurbsCurve".}
153proc gluNurbsSurface*(nobj: PGLUnurbs, sknot_count: TGLint, sknot: PGLfloat,
154                      tknot_count: TGLint, tknot: PGLfloat,
155                      s_stride, t_stride: TGLint, ctlarray: PGLfloat,
156                      sorder, torder: TGLint, atype: TGLenum){.dynlib: dllname,
157    importc: "gluNurbsSurface".}
158proc gluLoadSamplingMatrices*(nobj: PGLUnurbs,
159                              modelMatrix, projMatrix: var T16dArray,
160                              viewport: var TViewPortArray){.dynlib: dllname,
161    importc: "gluLoadSamplingMatrices".}
162proc gluNurbsProperty*(nobj: PGLUnurbs, aproperty: TGLenum, value: TGLfloat){.
163    dynlib: dllname, importc: "gluNurbsProperty".}
164proc gluGetNurbsProperty*(nobj: PGLUnurbs, aproperty: TGLenum, value: PGLfloat){.
165    dynlib: dllname, importc: "gluGetNurbsProperty".}
166proc gluNurbsCallback*(nobj: PGLUnurbs, which: TGLenum, fn: TCallBack){.
167    dynlib: dllname, importc: "gluNurbsCallback".}
168  #*** Callback function prototypes ***
169type                          # gluQuadricCallback
170  GLUquadricErrorProc* = proc (p: TGLenum) # gluTessCallback
171  GLUtessBeginProc* = proc (p: TGLenum)
172  GLUtessEdgeFlagProc* = proc (p: TGLboolean)
173  GLUtessVertexProc* = proc (p: Pointer)
174  GLUtessEndProc* = proc ()
175  GLUtessErrorProc* = proc (p: TGLenum)
176  GLUtessCombineProc* = proc (p1: var T3dArray, p2: T4pArray, p3: T4fArray,
177                              p4: PPointer)
178  GLUtessBeginDataProc* = proc (p1: TGLenum, p2: Pointer)
179  GLUtessEdgeFlagDataProc* = proc (p1: TGLboolean, p2: Pointer)
180  GLUtessVertexDataProc* = proc (p1, p2: Pointer)
181  GLUtessEndDataProc* = proc (p: Pointer)
182  GLUtessErrorDataProc* = proc (p1: TGLenum, p2: Pointer)
183  GLUtessCombineDataProc* = proc (p1: var T3dArray, p2: var T4pArray,
184                                  p3: var T4fArray, p4: PPointer, p5: Pointer) #
185                                                                               #
186                                                                               # gluNurbsCallback
187  GLUnurbsErrorProc* = proc (p: TGLenum) #***           Generic constants               ****/
188
189const                         # Version
190  GLU_VERSION_1_1* = 1
191  GLU_VERSION_1_2* = 1        # Errors: (return value 0 = no error)
192  GLU_INVALID_ENUM* = 100900
193  GLU_INVALID_VALUE* = 100901
194  GLU_OUT_OF_MEMORY* = 100902
195  GLU_INCOMPATIBLE_GL_VERSION* = 100903 # StringName
196  GLU_VERSION* = 100800
197  GLU_EXTENSIONS* = 100801    # Boolean
198  GLU_TRUE* = GL_TRUE
199  GLU_FALSE* = GL_FALSE #***           Quadric constants               ****/
200                        # QuadricNormal
201  GLU_SMOOTH* = 100000
202  GLU_FLAT* = 100001
203  GLU_NONE* = 100002          # QuadricDrawStyle
204  GLU_POINT* = 100010
205  GLU_LINE* = 100011
206  GLU_FILL* = 100012
207  GLU_SILHOUETTE* = 100013    # QuadricOrientation
208  GLU_OUTSIDE* = 100020
209  GLU_INSIDE* = 100021        # Callback types:
210                              #      GLU_ERROR       = 100103;
211                              #***           Tesselation constants           ****/
212  GLU_TESS_MAX_COORD* = 1.00000e+150 # TessProperty
213  GLU_TESS_WINDING_RULE* = 100140
214  GLU_TESS_BOUNDARY_ONLY* = 100141
215  GLU_TESS_TOLERANCE* = 100142 # TessWinding
216  GLU_TESS_WINDING_ODD* = 100130
217  GLU_TESS_WINDING_NONZERO* = 100131
218  GLU_TESS_WINDING_POSITIVE* = 100132
219  GLU_TESS_WINDING_NEGATIVE* = 100133
220  GLU_TESS_WINDING_ABS_GEQ_TWO* = 100134 # TessCallback
221  GLU_TESS_BEGIN* = 100100    # void (CALLBACK*)(TGLenum    type)
222  constGLU_TESS_VERTEX* = 100101 # void (CALLBACK*)(void      *data)
223  GLU_TESS_END* = 100102      # void (CALLBACK*)(void)
224  GLU_TESS_ERROR* = 100103    # void (CALLBACK*)(TGLenum    errno)
225  GLU_TESS_EDGE_FLAG* = 100104 # void (CALLBACK*)(TGLboolean boundaryEdge)
226  GLU_TESS_COMBINE* = 100105 # void (CALLBACK*)(TGLdouble  coords[3],
227                             #                                                            void      *data[4],
228                             #                                                            TGLfloat   weight[4],
229                             #                                                            void      **dataOut)
230  GLU_TESS_BEGIN_DATA* = 100106 # void (CALLBACK*)(TGLenum    type,
231                                #                                                            void      *polygon_data)
232  GLU_TESS_VERTEX_DATA* = 100107 # void (CALLBACK*)(void      *data,
233                                 #                                                            void      *polygon_data)
234  GLU_TESS_END_DATA* = 100108 # void (CALLBACK*)(void      *polygon_data)
235  GLU_TESS_ERROR_DATA* = 100109 # void (CALLBACK*)(TGLenum    errno,
236                                #                                                            void      *polygon_data)
237  GLU_TESS_EDGE_FLAG_DATA* = 100110 # void (CALLBACK*)(TGLboolean boundaryEdge,
238                                    #                                                            void      *polygon_data)
239  GLU_TESS_COMBINE_DATA* = 100111 # void (CALLBACK*)(TGLdouble  coords[3],
240                                  #                                                            void      *data[4],
241                                  #                                                            TGLfloat   weight[4],
242                                  #                                                            void      **dataOut,
243                                  #                                                            void      *polygon_data)
244                                  # TessError
245  GLU_TESS_ERROR1* = 100151
246  GLU_TESS_ERROR2* = 100152
247  GLU_TESS_ERROR3* = 100153
248  GLU_TESS_ERROR4* = 100154
249  GLU_TESS_ERROR5* = 100155
250  GLU_TESS_ERROR6* = 100156
251  GLU_TESS_ERROR7* = 100157
252  GLU_TESS_ERROR8* = 100158
253  GLU_TESS_MISSING_BEGIN_POLYGON* = GLU_TESS_ERROR1
254  GLU_TESS_MISSING_BEGIN_CONTOUR* = GLU_TESS_ERROR2
255  GLU_TESS_MISSING_END_POLYGON* = GLU_TESS_ERROR3
256  GLU_TESS_MISSING_END_CONTOUR* = GLU_TESS_ERROR4
257  GLU_TESS_COORD_TOO_LARGE* = GLU_TESS_ERROR5
258  GLU_TESS_NEED_COMBINE_CALLBACK* = GLU_TESS_ERROR6 #***           NURBS constants                 ****/
259                                                    # NurbsProperty
260  GLU_AUTO_LOAD_MATRIX* = 100200
261  GLU_CULLING* = 100201
262  GLU_SAMPLING_TOLERANCE* = 100203
263  GLU_DISPLAY_MODE* = 100204
264  GLU_PARAMETRIC_TOLERANCE* = 100202
265  GLU_SAMPLING_METHOD* = 100205
266  GLU_U_STEP* = 100206
267  GLU_V_STEP* = 100207        # NurbsSampling
268  GLU_PATH_LENGTH* = 100215
269  GLU_PARAMETRIC_ERROR* = 100216
270  GLU_DOMAIN_DISTANCE* = 100217 # NurbsTrim
271  GLU_MAP1_TRIM_2* = 100210
272  GLU_MAP1_TRIM_3* = 100211   # NurbsDisplay
273                              #      GLU_FILL                = 100012;
274  GLU_OUTLINE_POLYGON* = 100240
275  GLU_OUTLINE_PATCH* = 100241 # NurbsCallback
276                              #      GLU_ERROR               = 100103;
277                              # NurbsErrors
278  GLU_NURBS_ERROR1* = 100251
279  GLU_NURBS_ERROR2* = 100252
280  GLU_NURBS_ERROR3* = 100253
281  GLU_NURBS_ERROR4* = 100254
282  GLU_NURBS_ERROR5* = 100255
283  GLU_NURBS_ERROR6* = 100256
284  GLU_NURBS_ERROR7* = 100257
285  GLU_NURBS_ERROR8* = 100258
286  GLU_NURBS_ERROR9* = 100259
287  GLU_NURBS_ERROR10* = 100260
288  GLU_NURBS_ERROR11* = 100261
289  GLU_NURBS_ERROR12* = 100262
290  GLU_NURBS_ERROR13* = 100263
291  GLU_NURBS_ERROR14* = 100264
292  GLU_NURBS_ERROR15* = 100265
293  GLU_NURBS_ERROR16* = 100266
294  GLU_NURBS_ERROR17* = 100267
295  GLU_NURBS_ERROR18* = 100268
296  GLU_NURBS_ERROR19* = 100269
297  GLU_NURBS_ERROR20* = 100270
298  GLU_NURBS_ERROR21* = 100271
299  GLU_NURBS_ERROR22* = 100272
300  GLU_NURBS_ERROR23* = 100273
301  GLU_NURBS_ERROR24* = 100274
302  GLU_NURBS_ERROR25* = 100275
303  GLU_NURBS_ERROR26* = 100276
304  GLU_NURBS_ERROR27* = 100277
305  GLU_NURBS_ERROR28* = 100278
306  GLU_NURBS_ERROR29* = 100279
307  GLU_NURBS_ERROR30* = 100280
308  GLU_NURBS_ERROR31* = 100281
309  GLU_NURBS_ERROR32* = 100282
310  GLU_NURBS_ERROR33* = 100283
311  GLU_NURBS_ERROR34* = 100284
312  GLU_NURBS_ERROR35* = 100285
313  GLU_NURBS_ERROR36* = 100286
314  GLU_NURBS_ERROR37* = 100287 #***           Backwards compatibility for old tesselator           ****/
315
316proc gluBeginPolygon*(tess: PGLUtesselator){.dynlib: dllname,
317    importc: "gluBeginPolygon".}
318proc gluNextContour*(tess: PGLUtesselator, atype: TGLenum){.dynlib: dllname,
319    importc: "gluNextContour".}
320proc gluEndPolygon*(tess: PGLUtesselator){.dynlib: dllname,
321    importc: "gluEndPolygon".}
322const                         # Contours types -- obsolete!
323  GLU_CW* = 100120
324  GLU_CCW* = 100121
325  GLU_INTERIOR* = 100122
326  GLU_EXTERIOR* = 100123
327  GLU_UNKNOWN* = 100124       # Names without "TESS_" prefix
328  GLU_BEGIN* = GLU_TESS_BEGIN
329  GLU_VERTEX* = constGLU_TESS_VERTEX
330  GLU_END* = GLU_TESS_END
331  GLU_ERROR* = GLU_TESS_ERROR
332  GLU_EDGE_FLAG* = GLU_TESS_EDGE_FLAG
333
334{.pop.}
335# implementation
336