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