lablgl icon indicating copy to clipboard operation
lablgl copied to clipboard

LablGL: an openGL interface for OCaml

	LablGL 1.07: Installation and Use instructions
  1. Description

LablGL is an OpenGL interface for Objective Caml. It includes two interfaces: the Togl widget, for comfortable use with LablTk, and LablGlut for standalone applications not using Tcl/Tk.

https://github.com/garrigue/lablgl http://wwwfun.kurims.kyoto-u.ac.jp/soft/olabl/lablgl.html

  1. Requisites
  • Objective Caml since 4.14
  • LablTk (included in Objective Caml, requires Tcl/Tk) for Togl support (only works for Tcl/Tk older than 8.4)
  • OpenGL
  • glut (included in Mesa) for glut support
  • GNU make (for conditionals)

Objective Caml can be obtained from http://ocaml.org

OpenGL (with hardware support) may already be on your machine. XFree86 supports the GLX protocol since version 4.0, with hardware acceleration on some platforms. It is available on most recent Linux configurations. If you are not lucky enough to have built-in OpenGL support, you can still use Mesa, an openGL-compatible freeware, which works on almost everything. http://www.mesa3d.org/

LablGl also uses the Togl widget, but the code is already included in this distribution (version 1.7). You may obtain more information about Togl at: http://www.mesa3d.org/brianp/Togl.html Note that Togl is only compatible with vanilla Tcl/Tk older than 8.4: specially patched versions may not work. For instance 8.2.3+ included in old debian distributions does not work, and recent versions do not work either.

LablGlut requires glut, which is already included in recent versions of Mesa and XFree86. For windows you need to obtain it from http://www.xmission.com/~nate/glut.html

  1. Installation

Precompiled versions of lablGL are available for Windows, and a number of Unix versions. For Linux, just install the package.

Windows binary distribution: The file lablgl-1.05-win32.zip supports the mingw windows installer for ocaml 4.01.

a) Install the lablGL distribution. The simplest way is to use the command-line version of unzip, and unpack it on top of your Objective Caml distribution. C:\Program Files\Objective Caml> unzip lablgl-1.04-win32.zip If you unpacked it somewhere else you must copy manually the contents of the bin, lib\stublibs and lib\lablGL directories to the corresponding directories of the Objective Caml distribution.

b) Compile the Caml parts. Go to the lib\lablGL directory, and execute the following command C:...\lib\lablGL> ocaml build.ml It will generate the bytecode and native versions of the library. Note that every time you install a new version of Objective Caml you will need to repeat this last step. Look carefully at the last line of output of this script, it should tell you which ocaml port you are using. If the guess is wrong, you edit build.ml to correct this.

c) For glut support, download glut32.dll and copy it to the bin directory of the OCaml distribution (or somewhere else in your path.)

After this, you should be able to compile and run programs as either bytecode or native code.

Compilation from source (if there is no package):

  1. On MacOSX, if you want to use Togl, you must use the X11 version of Tcl/Tk. Here we assume that ocaml was installed from macports. Then you must also install the mesa port from macports, to obtain a compatible version of GLX.

a) Create Makefile.config. Some tested configurations are provided. If none of them fits your needs, start with Makefile.config.ex.

b) Build LablGL with both Togl(Tcl/Tk) and Glut support. % make

 If you need only Togl support, do
    % make togl
 If you need only Glut support, do
    % make glut
 If you need neither (use the library with lablGtk for instance)
    % make lib

c) For the native code version (you need the native code version of LablTk), % make opt

 Similarly, you can also do
    % make {toglopt,glutopt,libopt}

d) Install LablGL % make install

 This will install all the available parts.   

To compile for Windows, Makefile.config.msvc and Makefile.config.mingw are provided. Note however that the DLL produced for Togl by mingw does not work with the ocaml 3.11 binary distribution, you must use the one produced by MSVC, included in the binary distribution above.

  1. Use

Examples are in the Togl/examples and LablGlut/examples directories.

  • The lablgl toplevel This is a toplevel, like ocaml, including LablTk, Unix, Str, LablGL and Togl. You may use it either as a toplevel, or directly to run scripts. To run an example in Togl/examples, type: % lablgl example.ml where example.ml is one of: (by order of complexity) simple.ml scene.ml checker.ml double.ml planet.ml texturesurf.ml gears.ml morph3d.ml tennis.ml

Note that some XFree86 do not seem to support single buffer rendering. The first 3 examples will not work in that case.

  • Similarely, there is a lablglut toplevel. For instance, move to the folder LablGlut/examples/lablGL and type

    % lablglut gears.ml

  • compiling and linking You need to include either labltk.cma, lablgl.cma and togl.cma or' lablgl.cma and lablglut.cma in your link: ocamlc -I +labltk -I +lablGL
    labltk.cma lablgl.cma togl.cma ... -o program ocamlc -I +lablGL lablgl.cma lablglut.cma ... -o program

  1. Writing programs

All of the GL and GLU libraries are available. Read a good book about how to use these. Translating from OpenGL to LablGL is rather straightforward: there is a LablGL function for each OpenGL one. For ease of retrieving, both GL and GLU are cut in smaller modules of related functions. See in appendix A which modules your function is in. By default it has the same name, gl or glu omited, and capitals replaced by underscores. When arguments are labelled, the names are taken from the man page or the C prototype.

OpenGL makes heavy use of enumerations, with names starting with GL_ or GLU_ . Since their meaning is often overloaded, they are all converted to polymorphic variants. In most cases just replace prefix by a backquote and convert to low case. When you have a doubt the best way is to have a look with OCamlBrowser.

Using Togl is also straightforward. Everything works like in LablTk. You create an openGL widget with Togl.create, and then you apply various functions on it. See Togl's README in Togl/src/Togl/README for details.

To use LablGlut you need to look at glut's documentation on your system. The approach is close to LablGL's.

  1. Comments and bug reports

    https://github.com/garrigue/lablgl/issues

    This library has been tested on a number of programs, but this is far from testing all of OpenGL functionality. There are bugs, but at least we didn't find any in our examples.

  2. Authors

    Jacques Garrigue, Isaac Trotts, Erick Tryzelaar and Christophe Raffali participated to this release.

A. Modules

There are 12 modules for GL and 5 modules for GLU. Modules marked with (*) contain LablGL specific functions.

Gl: Common data types and functions. glFlush glFinish glEnable glDisable glIsEnabled glGetError

GlArray: Array functions glEdgeFlagPointer -> edge_flag glTexCoordPointer -> tex_coord glIndexPointer -> index glNormalPointer -> normal glVertexPointer -> vertex glEnableClientState -> enable glDisableClientState -> disable glArrayElement -> element glDrawArrays glDrawElements

GlClear: Clearing functions. glClear glClearAccum -> accum glClearColor -> color glClearDepth -> depth glClearIndex -> index glClearStencil -> stencil

GlDraw: Drawing functions. glBegin -> begins glColor glCullFace glEdgeFlag glEnd -> ends glFrontFace glIndex glLineStipple glLineWidth glNormal glPointSize glPolygonOffset glPolygonMode glPolygonStipple glRect glShadeModel glVertex glViewport

GlFunc: Filtering functions. glAccum glAlphaFunc glBlendFunc glColorMask glDepthFunc glDepthMask glDrawBuffer glIndexMask glLogicOp
glReadBuffer
glStencilFunc glStencilMask glStencilOp

GlLight: Lighting functions. glColorMaterial glFog glLight glLightModel (gl 1.2 with `color_control) glMaterial

GlList: Call list functions. (*) glCallList -> call glCallLists glDeleteLists glEndList -> ends glGenLists glIsList glNewList -> begins

GlMap: Map and meshes functions. glEvalCoord1 glEvalCoord2 glEvalMesh1 glEvalMesh2 glEvalPoint1 glEvalPoint2 glMap1 glMap2 glMapGrid1 -> grid1 glMapGrid2 -> grid2

GlMat: Matrix functions. (*) glFrustum glLoadIdentity glLoadMatrix -> load glLoadTransposeMatrix -> load_transpose (gl 1.3) glMatrixMode -> mode glMultMatrix -> mult glMultTransposeMatrix -> mult_transpose (gl 1.3) glOrtho glPopMatrix -> pop glPushMatrix -> push glRotate glScale glTranslate glGetDoublev -> get_matrix (only for modelview, projection, and texture)

GlMisc: Miscellanous functions. glClipPlane glGetString glHint glInitNames glLoadName glPassThrough glPopAttrib glPopName glPushAttrib glPushName glRenderMode glScissor glSelectBuffer

GlPix: Rasterized pixel functions. (*) glBitmap glCopyPixels -> copy glDrawPixels -> draw glPixelMap -> map glPixelStore -> store glPixelTransfer -> transfer glPixelZoom -> zoom glRasterPos glReadPixels -> read

GlTex: Texturing functions. glTexCoord -> coord glTexEnv -> env glTexGen -> gen glTexImage1D -> image1d glTexImage2D -> image2d glTexParameter -> parameter (gl 1.4 with generate_mipmap)

GluMat: GLU matrix functions. gluLookAt gluOrtho2D gluPerspective gluPickMatrix gluProject gluUnProject

GluMisc: GLU miscellanous functions. gluBuild1DMipmaps gluBuild2DMipmaps gluGetString gluScaleImage

GluNurbs: Nurbs functions. gluBeginCurve gluBeginSurface gluBeginTrim gluEndCurve gluEndSurface gluEndTrim gluLoadSamplingMatrices gluNewNurbsRenderer -> create gluNurbsCurve -> curve gluNurbsProperty -> property gluNurbsPwlCurve -> pwl_curve gluNurbsSurface -> surface

GluQuadric: Quadric functions. gluCylinder gluDisk gluNewQuadric -> create gluPartialDisk gluQuadricDrawStyle -> draw_style gluQuadricNormals -> normals gluQuadricOrientation -> orientation gluQuadricTexture -> texture gluSphere

GluTess: Tessalating functions. Only glu 1.2 API is supported. Either render directly or produce lists of triangles.