Browse Source

* new updated version
* gtkglarea unit and demo
* win32 opengl headers
* morph3d demo

peter 25 years ago
parent
commit
7039100d0d
62 changed files with 25078 additions and 0 deletions
  1. 1397 0
      packages/opengl/Makefile
  2. 12 0
      packages/opengl/Makefile.fpc
  3. 1270 0
      packages/opengl/build/Makefile
  4. 33 0
      packages/opengl/build/Makefile.fpc
  5. 86 0
      packages/opengl/build/buildgl.pp
  6. 600 0
      packages/opengl/build/c_gen.pp
  7. 98 0
      packages/opengl/build/def2def.pas
  8. 866 0
      packages/opengl/build/gl10.def
  9. 176 0
      packages/opengl/build/gl10ext.def
  10. 40 0
      packages/opengl/build/gl10mesa.def
  11. 109 0
      packages/opengl/build/gl10sgi.def
  12. 96 0
      packages/opengl/build/gl11.def
  13. 58 0
      packages/opengl/build/gl12.def
  14. 310 0
      packages/opengl/build/gl_linux.tem
  15. 303 0
      packages/opengl/build/gl_w32d.tem
  16. 227 0
      packages/opengl/build/gl_w32s.tem
  17. 12 0
      packages/opengl/build/glaux.def
  18. 504 0
      packages/opengl/build/glaux_w32d.tem
  19. 504 0
      packages/opengl/build/glaux_w32s.tem
  20. 300 0
      packages/opengl/build/glext.def
  21. 197 0
      packages/opengl/build/glu.def
  22. 142 0
      packages/opengl/build/glu_linux.tem
  23. 132 0
      packages/opengl/build/glu_w32d.tem
  24. 92 0
      packages/opengl/build/glu_w32s.tem
  25. 271 0
      packages/opengl/build/glut.def
  26. 108 0
      packages/opengl/build/glut_linux.tem
  27. 75 0
      packages/opengl/build/glut_w32d.tem
  28. 53 0
      packages/opengl/build/glut_w32s.tem
  29. 106 0
      packages/opengl/build/glx.def
  30. 143 0
      packages/opengl/build/glx_linux.tem
  31. 134 0
      packages/opengl/build/glx_w32d.tem
  32. 89 0
      packages/opengl/build/glx_w32s.tem
  33. 71 0
      packages/opengl/build/ogl_linux.gen
  34. 77 0
      packages/opengl/build/ogl_w32d.gen
  35. 68 0
      packages/opengl/build/ogl_w32s.gen
  36. 1300 0
      packages/opengl/examples/Makefile
  37. 17 0
      packages/opengl/examples/Makefile.fpc
  38. 159 0
      packages/opengl/examples/glutdemo.pp
  39. 928 0
      packages/opengl/examples/morph3d.pp
  40. 1336 0
      packages/opengl/gtkgl/Makefile
  41. 17 0
      packages/opengl/gtkgl/Makefile.fpc
  42. 178 0
      packages/opengl/gtkgl/gtkglarea.pp
  43. 196 0
      packages/opengl/gtkgl/gtkgldemo.pp
  44. 1240 0
      packages/opengl/linux/Makefile
  45. 15 0
      packages/opengl/linux/Makefile.fpc
  46. 2065 0
      packages/opengl/linux/gl.pp
  47. 385 0
      packages/opengl/linux/glu.pp
  48. 458 0
      packages/opengl/linux/glut.pp
  49. 272 0
      packages/opengl/linux/glx.pp
  50. 58 0
      packages/opengl/readme
  51. 1240 0
      packages/opengl/win32/Makefile
  52. 15 0
      packages/opengl/win32/Makefile.fpc
  53. 2058 0
      packages/opengl/win32/gl.pp
  54. 1494 0
      packages/opengl/win32/gl_sl.pp
  55. 513 0
      packages/opengl/win32/glaux.pp
  56. 513 0
      packages/opengl/win32/glaux_sl.pp
  57. 375 0
      packages/opengl/win32/glu.pp
  58. 286 0
      packages/opengl/win32/glu_sl.pp
  59. 425 0
      packages/opengl/win32/glut.pp
  60. 321 0
      packages/opengl/win32/glut_sl.pp
  61. 263 0
      packages/opengl/win32/glx.pp
  62. 192 0
      packages/opengl/win32/glx_sl.pp

+ 1397 - 0
packages/opengl/Makefile

@@ -0,0 +1,1397 @@
+#
+# Makefile generated by fpcmake v1.00 [2000/09/02]
+#
+
+defaultrule: all
+
+#####################################################################
+# Autodetect OS (Linux or Dos or Windows NT)
+# define inlinux when running under linux
+# define inWinNT when running under WinNT
+#####################################################################
+
+# We need only / in the path
+override PATH:=$(subst \,/,$(PATH))
+
+# Search for PWD and determine also if we are under linux
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(subst ;, ,$(PATH)))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(subst :, ,$(PATH)))))
+ifeq ($(PWD),)
+nopwd:
+	@echo You need the GNU utils package to use this Makefile!
+	@echo Get ftp://ftp.freepascal.org/pub/fpc/dist/go32v2/utilgo32.zip
+	@exit
+else
+inlinux=1
+endif
+else
+PWD:=$(firstword $(PWD))
+endif
+
+# Detect NT - NT sets OS to Windows_NT
+ifndef inlinux
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+endif
+endif
+
+# Detect OS/2 - OS/2 has OS2_SHELL defined
+ifndef inlinux
+ifndef inWinNT
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+endif
+
+# The extension of executables
+ifdef inlinux
+EXEEXT=
+else
+EXEEXT=.exe
+endif
+
+# The path which is searched separated by spaces
+ifdef inlinux
+SEARCHPATH=$(subst :, ,$(PATH))
+else
+SEARCHPATH=$(subst ;, ,$(PATH))
+endif
+
+# Base dir
+ifdef PWD
+BASEDIR:=$(shell $(PWD))
+else
+BASEDIR=.
+endif
+
+#####################################################################
+# FPC version/target Detection
+#####################################################################
+
+# What compiler to use ?
+ifndef FPC
+# Compatibility with old makefiles
+ifdef PP
+FPC=$(PP)
+else
+ifdef inOS2
+FPC=ppos2
+else
+FPC=ppc386
+endif
+endif
+endif
+override FPC:=$(subst $(EXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(EXEEXT)
+
+# Target OS
+ifndef OS_TARGET
+OS_TARGET:=$(shell $(FPC) -iTO)
+endif
+
+# Source OS
+ifndef OS_SOURCE
+OS_SOURCE:=$(shell $(FPC) -iSO)
+endif
+
+# Target CPU
+ifndef CPU_TARGET
+CPU_TARGET:=$(shell $(FPC) -iTP)
+endif
+
+# Source CPU
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(shell $(FPC) -iSP)
+endif
+
+# FPC version
+ifndef FPC_VERSION
+FPC_VERSION:=$(shell $(FPC) -iV)
+endif
+
+export FPC OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FPC_VERSION
+
+#####################################################################
+# FPCDIR Setting
+#####################################################################
+
+# Test FPCDIR to look if the RTL dir exists
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=wrong
+endif
+endif
+else
+override FPCDIR=wrong
+endif
+
+# Detect FPCDIR
+ifeq ($(FPCDIR),wrong)
+ifdef inlinux
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+endif
+
+#####################################################################
+# User Settings
+#####################################################################
+
+
+# Targets
+
+ifeq ($(OS_TARGET),linux)
+override DIROBJECTS+=$(wildcard linux gtkgl)
+endif
+ifeq ($(OS_TARGET),win32)
+override DIROBJECTS+=$(wildcard win32 gtkgl)
+endif
+override EXAMPLEDIROBJECTS+=examples
+
+# Clean
+
+
+# Install
+
+EXAMPLESUBDIR=opengl
+PACKAGENAME=opengl
+ZIPTARGET=install
+
+# Defaults
+
+
+# Directories
+
+
+# Packages
+
+
+# Libraries
+
+
+# Info
+
+INFOTARGET=fpc_infocfg fpc_infoobjects fpc_infoinstall 
+
+#####################################################################
+# Shell tools
+#####################################################################
+
+# echo
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=echo
+ECHOE:=echo
+else
+ECHO:=$(firstword $(ECHO))
+ECHOE=$(ECHO) -E
+endif
+else
+ECHO:=$(firstword $(ECHO))
+ECHOE=$(ECHO) -E
+endif
+endif
+
+# To copy pograms
+ifndef COPY
+COPY:=cp -fp
+endif
+
+# Copy a whole tree
+ifndef COPYTREE
+COPYTREE:=cp -rfp
+endif
+
+# To move pograms
+ifndef MOVE
+MOVE:=mv -f
+endif
+
+# Check delete program
+ifndef DEL
+DEL:=rm -f
+endif
+
+# Check deltree program
+ifndef DELTREE
+DELTREE:=rm -rf
+endif
+
+# To install files
+ifndef INSTALL
+ifdef inlinux
+INSTALL:=install -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+
+# To install programs
+ifndef INSTALLEXE
+ifdef inlinux
+INSTALLEXE:=install -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+
+# To make a directory.
+ifndef MKDIR
+ifdef inlinux
+MKDIR:=install -m 755 -d
+else
+MKDIR:=ginstall -m 755 -d
+endif
+endif
+
+export ECHO ECHOE COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+
+#####################################################################
+# Default Tools
+#####################################################################
+
+# assembler, redefine it if cross compiling
+ifndef AS
+AS=as
+endif
+
+# linker, but probably not used
+ifndef LD
+LD=ld
+endif
+
+# ppas.bat / ppas.sh
+ifdef inlinux
+PPAS=ppas.sh
+else
+ifdef inOS2
+PPAS=ppas.cmd
+else
+PPAS=ppas.bat
+endif
+endif
+
+# ldconfig to rebuild .so cache
+ifdef inlinux
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+
+# ppumove
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE=
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+
+# ppufiles
+ifndef PPUFILES
+PPUFILES:=$(strip $(wildcard $(addsuffix /ppufiles$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUFILES),)
+PPUFILES=
+else
+PPUFILES:=$(firstword $(PPUFILES))
+endif
+endif
+export PPUFILES
+
+# Look if UPX is found for go32v2 and win32. We can't use $UPX becuase
+# upx uses that one itself (PFV)
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+
+# ZipProg, you can't use Zip as the var name (PFV)
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG=
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+
+ZIPOPT=-9
+ZIPEXT=.zip
+
+# Tar
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG=
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+
+ifeq ($(USETAR),bz2)
+TAROPT=vI
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+
+#####################################################################
+# Default extensions
+#####################################################################
+
+# Default needed extensions (Go32v2,Linux)
+LOADEREXT=.as
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+RSTEXT=.rst
+FPCMADE=fpcmade
+
+# Go32v1
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+FPCMADE=fpcmade.v1
+endif
+
+# Go32v2
+ifeq ($(OS_TARGET),go32v2)
+FPCMADE=fpcmade.dos
+endif
+
+# Linux
+ifeq ($(OS_TARGET),linux)
+FPCMADE=fpcmade.lnx
+endif
+
+# Win32
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.w32
+endif
+
+# OS/2
+ifeq ($(OS_TARGET),os2)
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+SMARTEXT=.so
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.os2
+endif
+
+# library prefix
+LIBPREFIX=lib
+ifeq ($(OS_TARGET),go32v2)
+LIBPREFIX=
+endif
+ifeq ($(OS_TARGET),go32v1)
+LIBPREFIX=
+endif
+
+# determine which .pas extension is used
+ifndef PASEXT
+ifdef EXEOBJECTS
+override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(EXEOBJECTS)))))
+else
+override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(UNITOBJECTS)))))
+endif
+ifeq ($(TESTPAS),)
+PASEXT=.pp
+else
+PASEXT=.pas
+endif
+endif
+
+
+
+#####################################################################
+# Default Directories
+#####################################################################
+
+# set the prefix directory where to install everything
+ifndef PREFIXINSTALLDIR
+ifdef inlinux
+PREFIXINSTALLDIR=/usr
+else
+PREFIXINSTALLDIR=/pp
+endif
+endif
+export PREFIXINSTALLDIR
+
+# Where to place the resulting zip files
+ifndef DESTZIPDIR
+DESTZIPDIR:=$(BASEDIR)
+endif
+export DESTZIPDIR
+
+#####################################################################
+# Install Directories
+#####################################################################
+
+# set the base directory where to install everything
+ifndef BASEINSTALLDIR
+ifdef inlinux
+BASEINSTALLDIR=$(PREFIXINSTALLDIR)/lib/fpc/$(FPC_VERSION)
+else
+BASEINSTALLDIR=$(PREFIXINSTALLDIR)
+endif
+endif
+
+# set the directory where to install the binaries
+ifndef BININSTALLDIR
+ifdef inlinux
+BININSTALLDIR=$(PREFIXINSTALLDIR)/bin
+else
+BININSTALLDIR=$(BASEINSTALLDIR)/bin/$(OS_TARGET)
+endif
+endif
+
+# set the directory where to install the units.
+ifndef UNITINSTALLDIR
+UNITINSTALLDIR=$(BASEINSTALLDIR)/units/$(OS_TARGET)
+ifdef UNITSUBDIR
+UNITINSTALLDIR:=$(UNITINSTALLDIR)/$(UNITSUBDIR)
+endif
+endif
+
+# Where to install shared libraries
+ifndef LIBINSTALLDIR
+ifdef inlinux
+LIBINSTALLDIR=$(PREFIXINSTALLDIR)/lib
+else
+LIBINSTALLDIR=$(UNITINSTALLDIR)
+endif
+endif
+
+# Where the source files will be stored
+ifndef SOURCEINSTALLDIR
+ifdef inlinux
+SOURCEINSTALLDIR=$(PREFIXINSTALLDIR)/src/fpc-$(FPC_VERSION)
+else
+SOURCEINSTALLDIR=$(BASEINSTALLDIR)/source
+endif
+ifdef SOURCESUBDIR
+SOURCEINSTALLDIR:=$(SOURCEINSTALLDIR)/$(SOURCESUBDIR)
+endif
+endif
+
+# Where the doc files will be stored
+ifndef DOCINSTALLDIR
+ifdef inlinux
+DOCINSTALLDIR=$(PREFIXINSTALLDIR)/doc/fpc-$(FPC_VERSION)
+else
+DOCINSTALLDIR=$(BASEINSTALLDIR)/doc
+endif
+endif
+
+# Where to install the examples, under linux we use the doc dir
+# because the copytree command will create a subdir itself
+ifndef EXAMPLEINSTALLDIR
+ifdef inlinux
+EXAMPLEINSTALLDIR=$(DOCINSTALLDIR)/examples
+else
+EXAMPLEINSTALLDIR=$(BASEINSTALLDIR)/examples
+endif
+ifdef EXAMPLESUBDIR
+EXAMPLEINSTALLDIR:=$(EXAMPLEINSTALLDIR)/$(EXAMPLESUBDIR)
+endif
+endif
+
+# Where the some extra (data)files will be stored
+ifndef DATAINSTALLDIR
+DATAINSTALLDIR=$(BASEINSTALLDIR)
+endif
+
+#####################################################################
+# Redirection
+#####################################################################
+
+ifndef REDIRFILE
+REDIRFILE=log
+endif
+
+ifdef REDIR
+ifndef inlinux
+override FPC=redir -eo $(FPC)
+endif
+# set the verbosity to max
+override FPCOPT+=-va
+override REDIR:= >> $(REDIRFILE)
+endif
+
+
+#####################################################################
+# Compiler Command Line
+#####################################################################
+
+# Load commandline OPTDEF and add FPC_CPU define
+override FPCOPTDEF:=-d$(CPU_TARGET)
+
+# Load commandline OPT and add target and unit dir to be sure
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+
+# User dirs should be first, so they are looked at first
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+
+# Smartlinking
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+
+# Smartlinking creation
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+
+# Debug
+ifdef DEBUG
+override FPCOPT+=-g -dDEBUG
+endif
+
+# Release mode (strip, optimize and don't load ppc386.cfg)
+# 0.99.12b has a bug in the optimizer so don't use it by default
+ifdef RELEASE
+ifeq ($(FPC_VERSION),0.99.12)
+override FPCOPT+=-Xs -OGp3 -n
+else
+override FPCOPT+=-Xs -OG2p3 -n
+endif
+endif
+
+# Strip
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+
+# Optimizer
+ifdef OPTIMIZE
+override FPCOPT+=-OG2p3
+endif
+
+# Verbose settings (warning,note,info)
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+
+ifdef UNITSDIR
+override FPCOPT+=-Fu$(UNITSDIR)
+endif
+
+# Target dirs and the prefix to use for clean/install
+ifdef TARGETDIR
+override FPCOPT+=-FE$(TARGETDIR)
+ifeq ($(TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(TARGETDIR)/
+endif
+endif
+ifdef UNITTARGETDIR
+override FPCOPT+=-FU$(UNITTARGETDIR)
+ifeq ($(UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(TARGETDIR)/
+endif
+else
+ifdef TARGETDIR
+override UNITTARGETDIR=$(TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+
+# Add commandline options last so they can override
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+
+# Add defines from FPCOPTDEF to FPCOPT
+ifdef FPCOPTDEF
+override FPCOPT+=$(FPCOPTDEF)
+endif
+
+# Error file ?
+ifdef ERRORFILE
+override FPCOPT+=-Fr$(ERRORFILE)
+endif
+
+# Was a config file specified ?
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+
+# For win32 the options are passed using the environment FPCEXTCMD
+ifeq ($(OS_SOURCE),win32)
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+
+# Compiler commandline
+override COMPILER:=$(FPC) $(FPCOPT)
+
+# also call ppas if with command option -s
+# but only if the OS_SOURCE and OS_TARGE are equal
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(OS_SOURCE),$(OS_TARGET))
+EXECPPAS:=@$(PPAS)
+endif
+endif
+
+#####################################################################
+# Standard rules
+#####################################################################
+
+all: fpc_all $(addsuffix _all,$(DIROBJECTS))
+
+debug: fpc_debug $(addsuffix _debug,$(DIROBJECTS))
+
+examples: fpc_examples
+
+test: fpc_test
+
+smart: fpc_smart $(addsuffix _smart,$(DIROBJECTS))
+
+shared: fpc_shared $(addsuffix _shared,$(DIROBJECTS))
+
+showinstall: fpc_showinstall $(addsuffix _showinstall,$(DIROBJECTS))
+
+install: fpc_install $(addsuffix _install,$(DIROBJECTS))
+
+sourceinstall: fpc_sourceinstall
+
+exampleinstall: fpc_exampleinstall
+
+zipinstall: fpc_zipinstall
+
+zipsourceinstall: fpc_zipsourceinstall
+
+zipexampleinstall: fpc_zipexampleinstall
+
+clean: fpc_clean $(addsuffix _clean,$(DIROBJECTS)) $(addsuffix _clean,$(EXAMPLEDIROBJECTS))
+
+distclean: fpc_distclean $(addsuffix _distclean,$(DIROBJECTS))
+
+cleanall: fpc_cleanall $(addsuffix _cleanall,$(DIROBJECTS))
+
+require: $(addsuffix _require,$(DIROBJECTS))
+
+info: fpc_info
+
+.PHONY:  all debug examples test smart shared showinstall install sourceinstall exampleinstall zipinstall zipsourceinstall zipexampleinstall clean distclean cleanall require info
+
+#####################################################################
+# Examples
+#####################################################################
+
+.PHONY: fpc_examples fpc_test
+
+ifdef EXAMPLEOBJECTS
+override EXAMPLESOURCEFILES:=$(addsuffix $(PASEXT),$(EXAMPLEOBJECTS))
+override EXAMPLEFILES:=$(addsuffix $(EXEEXT),$(EXAMPLEOBJECTS))
+override EXAMPLEOFILES:=$(addsuffix $(OEXT),$(EXAMPLEOBJECTS))
+
+override CLEANEXEFILES+=$(EXAMPLEFILES) $(EXAMPLEOFILES)
+endif
+
+fpc_examples: all $(EXAMPLEFILES) $(addsuffix _all,$(EXAMPLEDIROBJECTS))
+
+fpc_test: examples
+
+#####################################################################
+# General compile rules
+#####################################################################
+
+.PHONY: fpc_packages fpc_all fpc_debug
+
+$(FPCMADE): $(ALLTARGET)
+	@$(ECHO) Compiled > $(FPCMADE)
+
+fpc_packages: $(COMPILEPACKAGES)
+
+fpc_all: fpc_packages $(FPCMADE)
+
+fpc_debug:
+	$(MAKE) all DEBUG=1
+
+# Search paths for .ppu if targetdir is set
+ifdef UNITTARGETDIR
+vpath %$(PPUEXT) $(UNITTARGETDIR)
+endif
+
+# General compile rules, available for both possible PASEXT
+
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .pp
+
+%$(PPUEXT): %.pp
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(PPUEXT): %.pas
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(EXEEXT): %.pp
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(EXEEXT): %.pas
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+#####################################################################
+# Library
+#####################################################################
+
+.PHONY: fpc_smart fpc_shared
+
+ifdef LIBVERSION
+LIBFULLNAME=$(LIBNAME).$(LIBVERSION)
+else
+LIBFULLNAME=$(LIBNAME)
+endif
+
+# Default sharedlib units are all unit objects
+ifndef SHAREDLIBUNITOBJECTS
+SHAREDLIBUNITOBJECTS:=$(UNITOBJECTS)
+endif
+
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+
+fpc_shared: all
+ifdef inlinux
+ifndef LIBNAME
+	@$(ECHO) "LIBNAME not set"
+else
+	$(PPUMOVE) $(SHAREDLIBUNITOBJECTS) -o$(LIBFULLNAME)
+endif
+else
+	@$(ECHO) "Shared Libraries not supported"
+endif
+
+#####################################################################
+# Install rules
+#####################################################################
+
+.PHONY: fpc_showinstall fpc_install
+
+ifdef EXTRAINSTALLUNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(EXTRAINSTALLUNITS))
+endif
+
+ifdef INSTALLPPUFILES
+override INSTALLPPUFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLPPUFILES))
+ifdef PPUFILES
+INSTALLPPULINKFILES:=$(shell $(PPUFILES) -S -O $(INSTALLPPUFILES))
+else
+INSTALLPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(LIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))))
+endif
+override INSTALLPPULINKFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLPPULINKFILES))
+endif
+
+ifdef INSTALLEXEFILES
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLEXEFILES))
+endif
+
+fpc_showinstall: $(SHOWINSTALLTARGET)
+ifdef INSTALLEXEFILES
+	@$(ECHO) -e $(addprefix "\n"$(BININSTALLDIR)/,$(INSTALLEXEFILES))
+endif
+ifdef INSTALLPPUFILES
+	@$(ECHO) -e $(addprefix "\n"$(UNITINSTALLDIR)/,$(INSTALLPPUFILES))
+ifneq ($(INSTALLPPULINKFILES),)
+	@$(ECHO) -e $(addprefix "\n"$(UNITINSTALLDIR)/,$(INSTALLPPULINKFILES))
+endif
+ifneq ($(wildcard $(LIBFULLNAME)),)
+	@$(ECHO) $(LIBINSTALLDIR)/$(LIBFULLNAME)
+ifdef inlinux
+	@$(ECHO) $(LIBINSTALLDIR)/$(LIBNAME)
+endif
+endif
+endif
+ifdef EXTRAINSTALLFILES
+	@$(ECHO) -e $(addprefix "\n"$(DATAINSTALLDIR)/,$(EXTRAINSTALLFILES))
+endif
+
+fpc_install: $(INSTALLTARGET)
+# Create UnitInstallFiles
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(BININSTALLDIR)
+# Compress the exes if upx is defined
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(BININSTALLDIR)
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(UNITINSTALLDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(UNITINSTALLDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(UNITINSTALLDIR)
+endif
+ifneq ($(wildcard $(LIBFULLNAME)),)
+	$(MKDIR) $(LIBINSTALLDIR)
+	$(INSTALL) $(LIBFULLNAME) $(LIBINSTALLDIR)
+ifdef inlinux
+	ln -sf $(LIBFULLNAME) $(LIBINSTALLDIR)/$(LIBNAME)
+endif
+endif
+endif
+ifdef EXTRAINSTALLFILES
+	$(MKDIR) $(DATAINSTALLDIR)
+	$(INSTALL) $(EXTRAINSTALLFILES) $(DATAINSTALLDIR)
+endif
+
+#####################################################################
+# SourceInstall rules
+#####################################################################
+
+.PHONY: fpc_sourceinstall
+
+ifndef SOURCETOPDIR
+SOURCETOPDIR=$(BASEDIR)
+endif
+
+fpc_sourceinstall: clean
+	$(MKDIR) $(SOURCEINSTALLDIR)
+	$(COPYTREE) $(SOURCETOPDIR) $(SOURCEINSTALLDIR)
+
+#####################################################################
+# exampleinstall rules
+#####################################################################
+
+.PHONY: fpc_exampleinstall
+
+fpc_exampleinstall: $(addsuffix _clean,$(EXAMPLEDIROBJECTS))
+ifdef EXAMPLESOURCEFILES
+	$(MKDIR) $(EXAMPLEINSTALLDIR)
+	$(COPY) $(EXAMPLESOURCEFILES) $(EXAMPLEINSTALLDIR)
+endif
+ifdef EXAMPLEDIROBJECTS
+ifndef EXAMPLESOURCEFILES
+	$(MKDIR) $(EXAMPLEINSTALLDIR)
+endif
+	$(COPYTREE) $(addsuffix /*,$(EXAMPLEDIROBJECTS)) $(EXAMPLEINSTALLDIR)
+endif
+
+#####################################################################
+# Zip
+#####################################################################
+
+.PHONY: fpc_zipinstall
+
+# Create suffix to add
+ifndef PACKAGESUFFIX
+PACKAGESUFFIX=$(OS_TARGET)
+ifeq ($(OS_TARGET),go32v2)
+PACKAGESUFFIX=go32
+endif
+ifeq ($(OS_TARGET),win32)
+PACKAGESUFFIX=w32
+endif
+endif
+
+# Temporary path to pack a file
+ifndef PACKDIR
+ifndef inlinux
+PACKDIR=$(BASEDIR)/pack_tmp
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+
+# Maybe create default zipname from packagename
+ifndef ZIPNAME
+ifdef PACKAGENAME
+ZIPNAME=$(PACKAGEPREFIX)$(PACKAGENAME)$(PACKAGESUFFIX)
+endif
+endif
+
+# Use tar by default under linux
+ifndef USEZIP
+ifdef inlinux
+USETAR=1
+endif
+endif
+
+fpc_zipinstall:
+ifndef ZIPNAME
+	@$(ECHO) "Please specify ZIPNAME!"
+	@exit 1
+else
+	$(MAKE) $(ZIPTARGET) PREFIXINSTALLDIR=$(PACKDIR)
+ifdef USETAR
+	$(DEL) $(DESTZIPDIR)/$(ZIPNAME)$(TAREXT)
+	cd $(PACKDIR) ; $(TARPROG) c$(TAROPT) --file $(DESTZIPDIR)/$(ZIPNAME)$(TAREXT) * ; cd $(BASEDIR)
+else
+	$(DEL) $(DESTZIPDIR)/$(ZIPNAME)$(ZIPEXT)
+	cd $(PACKDIR) ; $(ZIPPROG) -Dr $(ZIPOPT) $(DESTZIPDIR)/$(ZIPNAME)$(ZIPEXT) * ; cd $(BASEDIR)
+endif
+	$(DELTREE) $(PACKDIR)
+endif
+
+.PHONY:  fpc_zipsourceinstall
+
+fpc_zipsourceinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall PACKAGESUFFIX=src
+
+.PHONY:  fpc_zipexampleinstall
+
+fpc_zipexampleinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall PACKAGESUFFIX=exm
+
+#####################################################################
+# Clean rules
+#####################################################################
+
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+
+ifdef EXTRACLEANUNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(EXTRACLEANUNITS))
+endif
+
+ifdef CLEANPPUFILES
+override CLEANPPUFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANPPUFILES))
+# Get the .o and .a files created for the units
+ifdef PPUFILES
+CLEANPPULINKFILES:=$(shell $(PPUFILES) $(CLEANPPUFILES))
+else
+CLEANPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(LIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))))
+endif
+override CLEANPPULINKFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANPPULINKFILES))
+endif
+
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef EXTRACLEANFILES
+	-$(DEL) $(EXTRACLEANFILES)
+endif
+ifdef LIBNAME
+	-$(DEL) $(LIBNAME) $(LIBFULLNAME)
+endif
+	-$(DEL) $(FPCMADE) $(PPAS) link.res $(FPCEXTFILE) $(REDIRFILE)
+
+fpc_distclean: fpc_clean
+
+# Also run clean first if targetdir is set. Unittargetdir is always
+# set if targetdir or unittargetdir is specified
+ifdef UNITTARGETDIR
+TARGETDIRCLEAN=fpc_clean
+endif
+
+fpc_cleanall: $(CLEANTARGET) $(TARGETDIRCLEAN)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) $(FPCMADE) $(PPAS) link.res $(FPCEXTFILE) $(REDIRFILE)
+
+#####################################################################
+# Info rules
+#####################################################################
+
+.PHONY: fpc_info fpc_cfginfo fpc_objectinfo fpc_toolsinfo fpc_installinfo \
+	fpc_dirinfo
+
+fpc_info: $(INFOTARGET)
+
+fpc_infocfg:
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC....... $(FPC)
+	@$(ECHO)  Version... $(FPC_VERSION)
+	@$(ECHO)  CPU....... $(CPU_TARGET)
+	@$(ECHO)  Source.... $(OS_SOURCE)
+	@$(ECHO)  Target.... $(OS_TARGET)
+	@$(ECHO)
+
+fpc_infoobjects:
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  LoaderObjects..... $(LOADEROBJECTS)
+	@$(ECHO)  UnitObjects....... $(UNITOBJECTS)
+	@$(ECHO)  ExeObjects........ $(EXEOBJECTS)
+	@$(ECHO)
+	@$(ECHO)  ExtraCleanUnits... $(EXTRACLEANUNITS)
+	@$(ECHO)  ExtraCleanFiles... $(EXTRACLEANFILES)
+	@$(ECHO)
+	@$(ECHO)  ExtraInstallUnits. $(EXTRAINSTALLUNITS)
+	@$(ECHO)  ExtraInstallFiles. $(EXTRAINSTALLFILES)
+	@$(ECHO)
+
+fpc_infoinstall:
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+ifdef DATE
+	@$(ECHO)  DateStr.............. $(DATESTR)
+endif
+ifdef PACKAGEPREFIX
+	@$(ECHO)  PackagePrefix........ $(PACKAGEPREFIX)
+endif
+ifdef PACKAGENAME
+	@$(ECHO)  PackageName.......... $(PACKAGENAME)
+endif
+	@$(ECHO)  PackageSuffix........ $(PACKAGESUFFIX)
+	@$(ECHO)
+	@$(ECHO)  BaseInstallDir....... $(BASEINSTALLDIR)
+	@$(ECHO)  BinInstallDir........ $(BININSTALLDIR)
+	@$(ECHO)  LibInstallDir........ $(LIBINSTALLDIR)
+	@$(ECHO)  UnitInstallDir....... $(UNITINSTALLDIR)
+	@$(ECHO)  SourceInstallDir..... $(SOURCEINSTALLDIR)
+	@$(ECHO)  DocInstallDir........ $(DOCINSTALLDIR)
+	@$(ECHO)  DataInstallDir....... $(DATAINSTALLDIR)
+	@$(ECHO)
+	@$(ECHO)  DestZipDir........... $(DESTZIPDIR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)
+
+#####################################################################
+# Directories
+#####################################################################
+
+ifeq ($(OS_TARGET),linux)
+OBJECTDIRLINUX=1
+OBJECTDIRGTKGL=1
+endif
+ifeq ($(OS_TARGET),win32)
+OBJECTDIRWIN32=1
+OBJECTDIRGTKGL=1
+endif
+
+# Dir linux
+
+ifdef OBJECTDIRLINUX
+.PHONY:  linux_all linux_debug linux_examples linux_test linux_smart linux_shared linux_showinstall linux_install linux_sourceinstall linux_exampleinstall linux_zipinstall linux_zipsourceinstall linux_zipexampleinstall linux_clean linux_distclean linux_cleanall linux_require linux_info
+
+linux_all:
+	$(MAKE) -C linux all
+
+linux_debug:
+	$(MAKE) -C linux debug
+
+linux_examples:
+	$(MAKE) -C linux examples
+
+linux_test:
+	$(MAKE) -C linux test
+
+linux_smart:
+	$(MAKE) -C linux smart
+
+linux_shared:
+	$(MAKE) -C linux shared
+
+linux_showinstall:
+	$(MAKE) -C linux showinstall
+
+linux_install:
+	$(MAKE) -C linux install
+
+linux_sourceinstall:
+	$(MAKE) -C linux sourceinstall
+
+linux_exampleinstall:
+	$(MAKE) -C linux exampleinstall
+
+linux_zipinstall:
+	$(MAKE) -C linux zipinstall
+
+linux_zipsourceinstall:
+	$(MAKE) -C linux zipsourceinstall
+
+linux_zipexampleinstall:
+	$(MAKE) -C linux zipexampleinstall
+
+linux_clean:
+	$(MAKE) -C linux clean
+
+linux_distclean:
+	$(MAKE) -C linux distclean
+
+linux_cleanall:
+	$(MAKE) -C linux cleanall
+
+linux_require:
+	$(MAKE) -C linux require
+
+linux_info:
+	$(MAKE) -C linux info
+endif
+
+# Dir gtkgl
+
+ifdef OBJECTDIRGTKGL
+.PHONY:  gtkgl_all gtkgl_debug gtkgl_examples gtkgl_test gtkgl_smart gtkgl_shared gtkgl_showinstall gtkgl_install gtkgl_sourceinstall gtkgl_exampleinstall gtkgl_zipinstall gtkgl_zipsourceinstall gtkgl_zipexampleinstall gtkgl_clean gtkgl_distclean gtkgl_cleanall gtkgl_require gtkgl_info
+
+gtkgl_all:
+	$(MAKE) -C gtkgl all
+
+gtkgl_debug:
+	$(MAKE) -C gtkgl debug
+
+gtkgl_examples:
+	$(MAKE) -C gtkgl examples
+
+gtkgl_test:
+	$(MAKE) -C gtkgl test
+
+gtkgl_smart:
+	$(MAKE) -C gtkgl smart
+
+gtkgl_shared:
+	$(MAKE) -C gtkgl shared
+
+gtkgl_showinstall:
+	$(MAKE) -C gtkgl showinstall
+
+gtkgl_install:
+	$(MAKE) -C gtkgl install
+
+gtkgl_sourceinstall:
+	$(MAKE) -C gtkgl sourceinstall
+
+gtkgl_exampleinstall:
+	$(MAKE) -C gtkgl exampleinstall
+
+gtkgl_zipinstall:
+	$(MAKE) -C gtkgl zipinstall
+
+gtkgl_zipsourceinstall:
+	$(MAKE) -C gtkgl zipsourceinstall
+
+gtkgl_zipexampleinstall:
+	$(MAKE) -C gtkgl zipexampleinstall
+
+gtkgl_clean:
+	$(MAKE) -C gtkgl clean
+
+gtkgl_distclean:
+	$(MAKE) -C gtkgl distclean
+
+gtkgl_cleanall:
+	$(MAKE) -C gtkgl cleanall
+
+gtkgl_require:
+	$(MAKE) -C gtkgl require
+
+gtkgl_info:
+	$(MAKE) -C gtkgl info
+endif
+
+# Dir win32
+
+ifdef OBJECTDIRWIN32
+.PHONY:  win32_all win32_debug win32_examples win32_test win32_smart win32_shared win32_showinstall win32_install win32_sourceinstall win32_exampleinstall win32_zipinstall win32_zipsourceinstall win32_zipexampleinstall win32_clean win32_distclean win32_cleanall win32_require win32_info
+
+win32_all:
+	$(MAKE) -C win32 all
+
+win32_debug:
+	$(MAKE) -C win32 debug
+
+win32_examples:
+	$(MAKE) -C win32 examples
+
+win32_test:
+	$(MAKE) -C win32 test
+
+win32_smart:
+	$(MAKE) -C win32 smart
+
+win32_shared:
+	$(MAKE) -C win32 shared
+
+win32_showinstall:
+	$(MAKE) -C win32 showinstall
+
+win32_install:
+	$(MAKE) -C win32 install
+
+win32_sourceinstall:
+	$(MAKE) -C win32 sourceinstall
+
+win32_exampleinstall:
+	$(MAKE) -C win32 exampleinstall
+
+win32_zipinstall:
+	$(MAKE) -C win32 zipinstall
+
+win32_zipsourceinstall:
+	$(MAKE) -C win32 zipsourceinstall
+
+win32_zipexampleinstall:
+	$(MAKE) -C win32 zipexampleinstall
+
+win32_clean:
+	$(MAKE) -C win32 clean
+
+win32_distclean:
+	$(MAKE) -C win32 distclean
+
+win32_cleanall:
+	$(MAKE) -C win32 cleanall
+
+win32_require:
+	$(MAKE) -C win32 require
+
+win32_info:
+	$(MAKE) -C win32 info
+endif
+EXAMPLEDIREXAMPLES=1
+
+# Dir examples
+
+ifdef EXAMPLEDIREXAMPLES
+.PHONY:  examples_all examples_debug examples_examples examples_test examples_smart examples_shared examples_showinstall examples_install examples_sourceinstall examples_exampleinstall examples_zipinstall examples_zipsourceinstall examples_zipexampleinstall examples_clean examples_distclean examples_cleanall examples_require examples_info
+
+examples_all:
+	$(MAKE) -C examples all
+
+examples_debug:
+	$(MAKE) -C examples debug
+
+examples_examples:
+	$(MAKE) -C examples examples
+
+examples_test:
+	$(MAKE) -C examples test
+
+examples_smart:
+	$(MAKE) -C examples smart
+
+examples_shared:
+	$(MAKE) -C examples shared
+
+examples_showinstall:
+	$(MAKE) -C examples showinstall
+
+examples_install:
+	$(MAKE) -C examples install
+
+examples_sourceinstall:
+	$(MAKE) -C examples sourceinstall
+
+examples_exampleinstall:
+	$(MAKE) -C examples exampleinstall
+
+examples_zipinstall:
+	$(MAKE) -C examples zipinstall
+
+examples_zipsourceinstall:
+	$(MAKE) -C examples zipsourceinstall
+
+examples_zipexampleinstall:
+	$(MAKE) -C examples zipexampleinstall
+
+examples_clean:
+	$(MAKE) -C examples clean
+
+examples_distclean:
+	$(MAKE) -C examples distclean
+
+examples_cleanall:
+	$(MAKE) -C examples cleanall
+
+examples_require:
+	$(MAKE) -C examples require
+
+examples_info:
+	$(MAKE) -C examples info
+endif
+
+#####################################################################
+# Local Makefile
+#####################################################################
+
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+

+ 12 - 0
packages/opengl/Makefile.fpc

@@ -0,0 +1,12 @@
+#
+#   Makefile.fpc for OpenGL for FPC
+#
+
+[targets]
+dirs_win32=win32 gtkgl
+dirs_linux=linux gtkgl
+exampledirs=examples
+
+[install]
+packagename=opengl
+examplesubdir=opengl

+ 1270 - 0
packages/opengl/build/Makefile

@@ -0,0 +1,1270 @@
+#
+# Makefile generated by fpcmake v1.00 [2000/09/02]
+#
+
+defaultrule: all_units
+
+#####################################################################
+# Autodetect OS (Linux or Dos or Windows NT)
+# define inlinux when running under linux
+# define inWinNT when running under WinNT
+#####################################################################
+
+# We need only / in the path
+override PATH:=$(subst \,/,$(PATH))
+
+# Search for PWD and determine also if we are under linux
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(subst ;, ,$(PATH)))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(subst :, ,$(PATH)))))
+ifeq ($(PWD),)
+nopwd:
+	@echo You need the GNU utils package to use this Makefile!
+	@echo Get ftp://ftp.freepascal.org/pub/fpc/dist/go32v2/utilgo32.zip
+	@exit
+else
+inlinux=1
+endif
+else
+PWD:=$(firstword $(PWD))
+endif
+
+# Detect NT - NT sets OS to Windows_NT
+ifndef inlinux
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+endif
+endif
+
+# Detect OS/2 - OS/2 has OS2_SHELL defined
+ifndef inlinux
+ifndef inWinNT
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+endif
+
+# The extension of executables
+ifdef inlinux
+EXEEXT=
+else
+EXEEXT=.exe
+endif
+
+# The path which is searched separated by spaces
+ifdef inlinux
+SEARCHPATH=$(subst :, ,$(PATH))
+else
+SEARCHPATH=$(subst ;, ,$(PATH))
+endif
+
+# Base dir
+ifdef PWD
+BASEDIR:=$(shell $(PWD))
+else
+BASEDIR=.
+endif
+
+#####################################################################
+# FPC version/target Detection
+#####################################################################
+
+# What compiler to use ?
+ifndef FPC
+# Compatibility with old makefiles
+ifdef PP
+FPC=$(PP)
+else
+ifdef inOS2
+FPC=ppos2
+else
+FPC=ppc386
+endif
+endif
+endif
+override FPC:=$(subst $(EXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(EXEEXT)
+
+# Target OS
+ifndef OS_TARGET
+OS_TARGET:=$(shell $(FPC) -iTO)
+endif
+
+# Source OS
+ifndef OS_SOURCE
+OS_SOURCE:=$(shell $(FPC) -iSO)
+endif
+
+# Target CPU
+ifndef CPU_TARGET
+CPU_TARGET:=$(shell $(FPC) -iTP)
+endif
+
+# Source CPU
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(shell $(FPC) -iSP)
+endif
+
+# FPC version
+ifndef FPC_VERSION
+FPC_VERSION:=$(shell $(FPC) -iV)
+endif
+
+export FPC OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FPC_VERSION
+
+#####################################################################
+# FPCDIR Setting
+#####################################################################
+
+# Test FPCDIR to look if the RTL dir exists
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=wrong
+endif
+endif
+else
+override FPCDIR=wrong
+endif
+
+# Default FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR=../../..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=wrong
+endif
+endif
+endif
+
+# Detect FPCDIR
+ifeq ($(FPCDIR),wrong)
+ifdef inlinux
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+endif
+
+ifndef PACKAGESDIR
+PACKAGESDIR=$(FPCDIR)/packages
+endif
+ifndef TOOLKITSDIR
+TOOLKITSDIR=
+endif
+ifndef COMPONENTSDIR
+COMPONENTSDIR=
+endif
+
+# Create units dir
+ifneq ($(FPCDIR),.)
+UNITSDIR=$(FPCDIR)/units/$(OS_TARGET)
+endif
+
+#####################################################################
+# User Settings
+#####################################################################
+
+
+# Targets
+
+override UNITOBJECTS+=buildgl
+override EXEOBJECTS+=c_gen
+
+# Clean
+
+
+# Install
+
+ZIPTARGET=install
+
+# Defaults
+
+
+# Directories
+
+
+# Packages
+
+override PACKAGES+=rtl fcl
+
+# Libraries
+
+
+# Info
+
+INFOTARGET=fpc_infocfg fpc_infoobjects fpc_infoinstall 
+
+#####################################################################
+# Shell tools
+#####################################################################
+
+# echo
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=echo
+ECHOE:=echo
+else
+ECHO:=$(firstword $(ECHO))
+ECHOE=$(ECHO) -E
+endif
+else
+ECHO:=$(firstword $(ECHO))
+ECHOE=$(ECHO) -E
+endif
+endif
+
+# To copy pograms
+ifndef COPY
+COPY:=cp -fp
+endif
+
+# Copy a whole tree
+ifndef COPYTREE
+COPYTREE:=cp -rfp
+endif
+
+# To move pograms
+ifndef MOVE
+MOVE:=mv -f
+endif
+
+# Check delete program
+ifndef DEL
+DEL:=rm -f
+endif
+
+# Check deltree program
+ifndef DELTREE
+DELTREE:=rm -rf
+endif
+
+# To install files
+ifndef INSTALL
+ifdef inlinux
+INSTALL:=install -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+
+# To install programs
+ifndef INSTALLEXE
+ifdef inlinux
+INSTALLEXE:=install -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+
+# To make a directory.
+ifndef MKDIR
+ifdef inlinux
+MKDIR:=install -m 755 -d
+else
+MKDIR:=ginstall -m 755 -d
+endif
+endif
+
+export ECHO ECHOE COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+
+#####################################################################
+# Default Tools
+#####################################################################
+
+# assembler, redefine it if cross compiling
+ifndef AS
+AS=as
+endif
+
+# linker, but probably not used
+ifndef LD
+LD=ld
+endif
+
+# ppas.bat / ppas.sh
+ifdef inlinux
+PPAS=ppas.sh
+else
+ifdef inOS2
+PPAS=ppas.cmd
+else
+PPAS=ppas.bat
+endif
+endif
+
+# ldconfig to rebuild .so cache
+ifdef inlinux
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+
+# ppumove
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE=
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+
+# ppufiles
+ifndef PPUFILES
+PPUFILES:=$(strip $(wildcard $(addsuffix /ppufiles$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUFILES),)
+PPUFILES=
+else
+PPUFILES:=$(firstword $(PPUFILES))
+endif
+endif
+export PPUFILES
+
+# Look if UPX is found for go32v2 and win32. We can't use $UPX becuase
+# upx uses that one itself (PFV)
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+
+# ZipProg, you can't use Zip as the var name (PFV)
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG=
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+
+ZIPOPT=-9
+ZIPEXT=.zip
+
+# Tar
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG=
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+
+ifeq ($(USETAR),bz2)
+TAROPT=vI
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+
+#####################################################################
+# Default extensions
+#####################################################################
+
+# Default needed extensions (Go32v2,Linux)
+LOADEREXT=.as
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+RSTEXT=.rst
+FPCMADE=fpcmade
+
+# Go32v1
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+FPCMADE=fpcmade.v1
+endif
+
+# Go32v2
+ifeq ($(OS_TARGET),go32v2)
+FPCMADE=fpcmade.dos
+endif
+
+# Linux
+ifeq ($(OS_TARGET),linux)
+FPCMADE=fpcmade.lnx
+endif
+
+# Win32
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.w32
+endif
+
+# OS/2
+ifeq ($(OS_TARGET),os2)
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+SMARTEXT=.so
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.os2
+endif
+
+# library prefix
+LIBPREFIX=lib
+ifeq ($(OS_TARGET),go32v2)
+LIBPREFIX=
+endif
+ifeq ($(OS_TARGET),go32v1)
+LIBPREFIX=
+endif
+
+# determine which .pas extension is used
+ifndef PASEXT
+ifdef EXEOBJECTS
+override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(EXEOBJECTS)))))
+else
+override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(UNITOBJECTS)))))
+endif
+ifeq ($(TESTPAS),)
+PASEXT=.pp
+else
+PASEXT=.pas
+endif
+endif
+
+
+# Check if the dirs really exists, else turn it off
+ifeq ($(wildcard $(UNITSDIR)),)
+UNITSDIR=
+endif
+ifeq ($(wildcard $(TOOLKITSDIR)),)
+TOOLKITSDIR=
+endif
+ifeq ($(wildcard $(PACKAGESDIR)),)
+PACKAGESDIR=
+endif
+ifeq ($(wildcard $(COMPONENTSDIR)),)
+COMPONENTSDIR=
+endif
+
+
+# PACKAGESDIR packages
+
+PACKAGERTL=1
+PACKAGEFCL=1
+
+ifdef PACKAGERTL
+ifneq ($(wildcard $(FPCDIR)/rtl),)
+ifneq ($(wildcard $(FPCDIR)/rtl/$(OS_TARGET)),)
+PACKAGEDIR_RTL=$(FPCDIR)/rtl/$(OS_TARGET)
+else
+PACKAGEDIR_RTL=$(FPCDIR)/rtl
+endif
+ifeq ($(wildcard $(PACKAGEDIR_RTL)/$(FPCMADE)),)
+override COMPILEPACKAGES+=package_rtl
+package_rtl:
+	$(MAKE) -C $(PACKAGEDIR_RTL) all
+endif
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+else
+PACKAGEDIR_RTL=
+ifneq ($(wildcard $(UNITSDIR)/rtl),)
+ifneq ($(wildcard $(UNITSDIR)/rtl/$(OS_TARGET)),)
+UNITDIR_RTL=$(UNITSDIR)/rtl/$(OS_TARGET)
+else
+UNITDIR_RTL=$(UNITSDIR)/rtl
+endif
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override NEEDUNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifdef PACKAGEFCL
+ifneq ($(wildcard $(FPCDIR)/fcl),)
+ifneq ($(wildcard $(FPCDIR)/fcl/$(OS_TARGET)),)
+PACKAGEDIR_FCL=$(FPCDIR)/fcl/$(OS_TARGET)
+else
+PACKAGEDIR_FCL=$(FPCDIR)/fcl
+endif
+ifeq ($(wildcard $(PACKAGEDIR_FCL)/$(FPCMADE)),)
+override COMPILEPACKAGES+=package_fcl
+package_fcl:
+	$(MAKE) -C $(PACKAGEDIR_FCL) all
+endif
+UNITDIR_FCL=$(PACKAGEDIR_FCL)
+else
+PACKAGEDIR_FCL=
+ifneq ($(wildcard $(UNITSDIR)/fcl),)
+ifneq ($(wildcard $(UNITSDIR)/fcl/$(OS_TARGET)),)
+UNITDIR_FCL=$(UNITSDIR)/fcl/$(OS_TARGET)
+else
+UNITDIR_FCL=$(UNITSDIR)/fcl
+endif
+else
+UNITDIR_FCL=
+endif
+endif
+ifdef UNITDIR_FCL
+override NEEDUNITDIR+=$(UNITDIR_FCL)
+endif
+endif
+
+
+#####################################################################
+# Default Directories
+#####################################################################
+
+# set the prefix directory where to install everything
+ifndef PREFIXINSTALLDIR
+ifdef inlinux
+PREFIXINSTALLDIR=/usr
+else
+PREFIXINSTALLDIR=/pp
+endif
+endif
+export PREFIXINSTALLDIR
+
+# Where to place the resulting zip files
+ifndef DESTZIPDIR
+DESTZIPDIR:=$(BASEDIR)
+endif
+export DESTZIPDIR
+
+#####################################################################
+# Install Directories
+#####################################################################
+
+# set the base directory where to install everything
+ifndef BASEINSTALLDIR
+ifdef inlinux
+BASEINSTALLDIR=$(PREFIXINSTALLDIR)/lib/fpc/$(FPC_VERSION)
+else
+BASEINSTALLDIR=$(PREFIXINSTALLDIR)
+endif
+endif
+
+# set the directory where to install the binaries
+ifndef BININSTALLDIR
+ifdef inlinux
+BININSTALLDIR=$(PREFIXINSTALLDIR)/bin
+else
+BININSTALLDIR=$(BASEINSTALLDIR)/bin/$(OS_TARGET)
+endif
+endif
+
+# set the directory where to install the units.
+ifndef UNITINSTALLDIR
+UNITINSTALLDIR=$(BASEINSTALLDIR)/units/$(OS_TARGET)
+ifdef UNITSUBDIR
+UNITINSTALLDIR:=$(UNITINSTALLDIR)/$(UNITSUBDIR)
+endif
+endif
+
+# Where to install shared libraries
+ifndef LIBINSTALLDIR
+ifdef inlinux
+LIBINSTALLDIR=$(PREFIXINSTALLDIR)/lib
+else
+LIBINSTALLDIR=$(UNITINSTALLDIR)
+endif
+endif
+
+# Where the source files will be stored
+ifndef SOURCEINSTALLDIR
+ifdef inlinux
+SOURCEINSTALLDIR=$(PREFIXINSTALLDIR)/src/fpc-$(FPC_VERSION)
+else
+SOURCEINSTALLDIR=$(BASEINSTALLDIR)/source
+endif
+ifdef SOURCESUBDIR
+SOURCEINSTALLDIR:=$(SOURCEINSTALLDIR)/$(SOURCESUBDIR)
+endif
+endif
+
+# Where the doc files will be stored
+ifndef DOCINSTALLDIR
+ifdef inlinux
+DOCINSTALLDIR=$(PREFIXINSTALLDIR)/doc/fpc-$(FPC_VERSION)
+else
+DOCINSTALLDIR=$(BASEINSTALLDIR)/doc
+endif
+endif
+
+# Where to install the examples, under linux we use the doc dir
+# because the copytree command will create a subdir itself
+ifndef EXAMPLEINSTALLDIR
+ifdef inlinux
+EXAMPLEINSTALLDIR=$(DOCINSTALLDIR)/examples
+else
+EXAMPLEINSTALLDIR=$(BASEINSTALLDIR)/examples
+endif
+ifdef EXAMPLESUBDIR
+EXAMPLEINSTALLDIR:=$(EXAMPLEINSTALLDIR)/$(EXAMPLESUBDIR)
+endif
+endif
+
+# Where the some extra (data)files will be stored
+ifndef DATAINSTALLDIR
+DATAINSTALLDIR=$(BASEINSTALLDIR)
+endif
+
+#####################################################################
+# Redirection
+#####################################################################
+
+ifndef REDIRFILE
+REDIRFILE=log
+endif
+
+ifdef REDIR
+ifndef inlinux
+override FPC=redir -eo $(FPC)
+endif
+# set the verbosity to max
+override FPCOPT+=-va
+override REDIR:= >> $(REDIRFILE)
+endif
+
+
+#####################################################################
+# Compiler Command Line
+#####################################################################
+
+# Load commandline OPTDEF and add FPC_CPU define
+override FPCOPTDEF:=-d$(CPU_TARGET)
+
+# Load commandline OPT and add target and unit dir to be sure
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+
+# User dirs should be first, so they are looked at first
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+
+# Smartlinking
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+
+# Smartlinking creation
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+
+# Debug
+ifdef DEBUG
+override FPCOPT+=-g -dDEBUG
+endif
+
+# Release mode (strip, optimize and don't load ppc386.cfg)
+# 0.99.12b has a bug in the optimizer so don't use it by default
+ifdef RELEASE
+ifeq ($(FPC_VERSION),0.99.12)
+override FPCOPT+=-Xs -OGp3 -n
+else
+override FPCOPT+=-Xs -OG2p3 -n
+endif
+endif
+
+# Strip
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+
+# Optimizer
+ifdef OPTIMIZE
+override FPCOPT+=-OG2p3
+endif
+
+# Verbose settings (warning,note,info)
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+
+ifdef NEEDUNITDIR
+override FPCOPT+=$(addprefix -Fu,$(NEEDUNITDIR))
+endif
+
+ifdef UNITSDIR
+override FPCOPT+=-Fu$(UNITSDIR)
+endif
+
+# Target dirs and the prefix to use for clean/install
+ifdef TARGETDIR
+override FPCOPT+=-FE$(TARGETDIR)
+ifeq ($(TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(TARGETDIR)/
+endif
+endif
+ifdef UNITTARGETDIR
+override FPCOPT+=-FU$(UNITTARGETDIR)
+ifeq ($(UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(TARGETDIR)/
+endif
+else
+ifdef TARGETDIR
+override UNITTARGETDIR=$(TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+
+# Add commandline options last so they can override
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+
+# Add defines from FPCOPTDEF to FPCOPT
+ifdef FPCOPTDEF
+override FPCOPT+=$(FPCOPTDEF)
+endif
+
+# Error file ?
+ifdef ERRORFILE
+override FPCOPT+=-Fr$(ERRORFILE)
+endif
+
+# Was a config file specified ?
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+
+# For win32 the options are passed using the environment FPCEXTCMD
+ifeq ($(OS_SOURCE),win32)
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+
+# Compiler commandline
+override COMPILER:=$(FPC) $(FPCOPT)
+
+# also call ppas if with command option -s
+# but only if the OS_SOURCE and OS_TARGE are equal
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(OS_SOURCE),$(OS_TARGET))
+EXECPPAS:=@$(PPAS)
+endif
+endif
+
+#####################################################################
+# Standard rules
+#####################################################################
+
+all: fpc_all
+
+debug: fpc_debug
+
+smart: fpc_smart
+
+shared: fpc_shared
+
+showinstall: fpc_showinstall
+
+install: fpc_install
+
+sourceinstall: fpc_sourceinstall
+
+exampleinstall: fpc_exampleinstall
+
+zipinstall: fpc_zipinstall
+
+zipsourceinstall: fpc_zipsourceinstall
+
+zipexampleinstall: fpc_zipexampleinstall
+
+clean: fpc_clean
+
+distclean: fpc_distclean
+
+cleanall: fpc_cleanall
+
+info: fpc_info
+
+.PHONY:  all debug smart shared showinstall install sourceinstall exampleinstall zipinstall zipsourceinstall zipexampleinstall clean distclean cleanall info
+
+#####################################################################
+# Units
+#####################################################################
+
+.PHONY: fpc_units
+
+override ALLTARGET+=fpc_units
+
+override UNITPPUFILES=$(addsuffix $(PPUEXT),$(UNITOBJECTS))
+override INSTALLPPUFILES+=$(UNITPPUFILES)
+override CLEANPPUFILES+=$(UNITPPUFILES)
+
+fpc_units: $(UNITPPUFILES)
+
+#####################################################################
+# Exes
+#####################################################################
+
+.PHONY: fpc_exes
+
+ifdef EXEOBJECTS
+override EXEFILES=$(addsuffix $(EXEEXT),$(EXEOBJECTS))
+override EXEOFILES=$(addsuffix $(OEXT),$(EXEOBJECTS))
+
+override ALLTARGET+=fpc_exes
+override INSTALLEXEFILES+=$(EXEFILES)
+override CLEANEXEFILES+=$(EXEFILES) $(EXEOFILES)
+endif
+
+fpc_exes: $(EXEFILES)
+
+#####################################################################
+# General compile rules
+#####################################################################
+
+.PHONY: fpc_packages fpc_all fpc_debug
+
+$(FPCMADE): $(ALLTARGET)
+	@$(ECHO) Compiled > $(FPCMADE)
+
+fpc_packages: $(COMPILEPACKAGES)
+
+fpc_all: fpc_packages $(FPCMADE)
+
+fpc_debug:
+	$(MAKE) all DEBUG=1
+
+# Search paths for .ppu if targetdir is set
+ifdef UNITTARGETDIR
+vpath %$(PPUEXT) $(UNITTARGETDIR)
+endif
+
+# General compile rules, available for both possible PASEXT
+
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .pp
+
+%$(PPUEXT): %.pp
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(PPUEXT): %.pas
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(EXEEXT): %.pp
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(EXEEXT): %.pas
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+#####################################################################
+# Library
+#####################################################################
+
+.PHONY: fpc_smart fpc_shared
+
+ifdef LIBVERSION
+LIBFULLNAME=$(LIBNAME).$(LIBVERSION)
+else
+LIBFULLNAME=$(LIBNAME)
+endif
+
+# Default sharedlib units are all unit objects
+ifndef SHAREDLIBUNITOBJECTS
+SHAREDLIBUNITOBJECTS:=$(UNITOBJECTS)
+endif
+
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+
+fpc_shared: all
+ifdef inlinux
+ifndef LIBNAME
+	@$(ECHO) "LIBNAME not set"
+else
+	$(PPUMOVE) $(SHAREDLIBUNITOBJECTS) -o$(LIBFULLNAME)
+endif
+else
+	@$(ECHO) "Shared Libraries not supported"
+endif
+
+#####################################################################
+# Install rules
+#####################################################################
+
+.PHONY: fpc_showinstall fpc_install
+
+ifdef EXTRAINSTALLUNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(EXTRAINSTALLUNITS))
+endif
+
+ifdef INSTALLPPUFILES
+override INSTALLPPUFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLPPUFILES))
+ifdef PPUFILES
+INSTALLPPULINKFILES:=$(shell $(PPUFILES) -S -O $(INSTALLPPUFILES))
+else
+INSTALLPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(LIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))))
+endif
+override INSTALLPPULINKFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLPPULINKFILES))
+endif
+
+ifdef INSTALLEXEFILES
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLEXEFILES))
+endif
+
+fpc_showinstall: $(SHOWINSTALLTARGET)
+ifdef INSTALLEXEFILES
+	@$(ECHO) -e $(addprefix "\n"$(BININSTALLDIR)/,$(INSTALLEXEFILES))
+endif
+ifdef INSTALLPPUFILES
+	@$(ECHO) -e $(addprefix "\n"$(UNITINSTALLDIR)/,$(INSTALLPPUFILES))
+ifneq ($(INSTALLPPULINKFILES),)
+	@$(ECHO) -e $(addprefix "\n"$(UNITINSTALLDIR)/,$(INSTALLPPULINKFILES))
+endif
+ifneq ($(wildcard $(LIBFULLNAME)),)
+	@$(ECHO) $(LIBINSTALLDIR)/$(LIBFULLNAME)
+ifdef inlinux
+	@$(ECHO) $(LIBINSTALLDIR)/$(LIBNAME)
+endif
+endif
+endif
+ifdef EXTRAINSTALLFILES
+	@$(ECHO) -e $(addprefix "\n"$(DATAINSTALLDIR)/,$(EXTRAINSTALLFILES))
+endif
+
+fpc_install: $(INSTALLTARGET)
+# Create UnitInstallFiles
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(BININSTALLDIR)
+# Compress the exes if upx is defined
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(BININSTALLDIR)
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(UNITINSTALLDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(UNITINSTALLDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(UNITINSTALLDIR)
+endif
+ifneq ($(wildcard $(LIBFULLNAME)),)
+	$(MKDIR) $(LIBINSTALLDIR)
+	$(INSTALL) $(LIBFULLNAME) $(LIBINSTALLDIR)
+ifdef inlinux
+	ln -sf $(LIBFULLNAME) $(LIBINSTALLDIR)/$(LIBNAME)
+endif
+endif
+endif
+ifdef EXTRAINSTALLFILES
+	$(MKDIR) $(DATAINSTALLDIR)
+	$(INSTALL) $(EXTRAINSTALLFILES) $(DATAINSTALLDIR)
+endif
+
+#####################################################################
+# SourceInstall rules
+#####################################################################
+
+.PHONY: fpc_sourceinstall
+
+ifndef SOURCETOPDIR
+SOURCETOPDIR=$(BASEDIR)
+endif
+
+fpc_sourceinstall: clean
+	$(MKDIR) $(SOURCEINSTALLDIR)
+	$(COPYTREE) $(SOURCETOPDIR) $(SOURCEINSTALLDIR)
+
+#####################################################################
+# exampleinstall rules
+#####################################################################
+
+.PHONY: fpc_exampleinstall
+
+fpc_exampleinstall: $(addsuffix _clean,$(EXAMPLEDIROBJECTS))
+ifdef EXAMPLESOURCEFILES
+	$(MKDIR) $(EXAMPLEINSTALLDIR)
+	$(COPY) $(EXAMPLESOURCEFILES) $(EXAMPLEINSTALLDIR)
+endif
+ifdef EXAMPLEDIROBJECTS
+ifndef EXAMPLESOURCEFILES
+	$(MKDIR) $(EXAMPLEINSTALLDIR)
+endif
+	$(COPYTREE) $(addsuffix /*,$(EXAMPLEDIROBJECTS)) $(EXAMPLEINSTALLDIR)
+endif
+
+#####################################################################
+# Zip
+#####################################################################
+
+.PHONY: fpc_zipinstall
+
+# Create suffix to add
+ifndef PACKAGESUFFIX
+PACKAGESUFFIX=$(OS_TARGET)
+ifeq ($(OS_TARGET),go32v2)
+PACKAGESUFFIX=go32
+endif
+ifeq ($(OS_TARGET),win32)
+PACKAGESUFFIX=w32
+endif
+endif
+
+# Temporary path to pack a file
+ifndef PACKDIR
+ifndef inlinux
+PACKDIR=$(BASEDIR)/pack_tmp
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+
+# Maybe create default zipname from packagename
+ifndef ZIPNAME
+ifdef PACKAGENAME
+ZIPNAME=$(PACKAGEPREFIX)$(PACKAGENAME)$(PACKAGESUFFIX)
+endif
+endif
+
+# Use tar by default under linux
+ifndef USEZIP
+ifdef inlinux
+USETAR=1
+endif
+endif
+
+fpc_zipinstall:
+ifndef ZIPNAME
+	@$(ECHO) "Please specify ZIPNAME!"
+	@exit 1
+else
+	$(MAKE) $(ZIPTARGET) PREFIXINSTALLDIR=$(PACKDIR)
+ifdef USETAR
+	$(DEL) $(DESTZIPDIR)/$(ZIPNAME)$(TAREXT)
+	cd $(PACKDIR) ; $(TARPROG) c$(TAROPT) --file $(DESTZIPDIR)/$(ZIPNAME)$(TAREXT) * ; cd $(BASEDIR)
+else
+	$(DEL) $(DESTZIPDIR)/$(ZIPNAME)$(ZIPEXT)
+	cd $(PACKDIR) ; $(ZIPPROG) -Dr $(ZIPOPT) $(DESTZIPDIR)/$(ZIPNAME)$(ZIPEXT) * ; cd $(BASEDIR)
+endif
+	$(DELTREE) $(PACKDIR)
+endif
+
+.PHONY:  fpc_zipsourceinstall
+
+fpc_zipsourceinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall PACKAGESUFFIX=src
+
+.PHONY:  fpc_zipexampleinstall
+
+fpc_zipexampleinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall PACKAGESUFFIX=exm
+
+#####################################################################
+# Clean rules
+#####################################################################
+
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+
+ifdef EXTRACLEANUNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(EXTRACLEANUNITS))
+endif
+
+ifdef CLEANPPUFILES
+override CLEANPPUFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANPPUFILES))
+# Get the .o and .a files created for the units
+ifdef PPUFILES
+CLEANPPULINKFILES:=$(shell $(PPUFILES) $(CLEANPPUFILES))
+else
+CLEANPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(LIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))))
+endif
+override CLEANPPULINKFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANPPULINKFILES))
+endif
+
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef EXTRACLEANFILES
+	-$(DEL) $(EXTRACLEANFILES)
+endif
+ifdef LIBNAME
+	-$(DEL) $(LIBNAME) $(LIBFULLNAME)
+endif
+	-$(DEL) $(FPCMADE) $(PPAS) link.res $(FPCEXTFILE) $(REDIRFILE)
+
+fpc_distclean: fpc_clean
+
+# Also run clean first if targetdir is set. Unittargetdir is always
+# set if targetdir or unittargetdir is specified
+ifdef UNITTARGETDIR
+TARGETDIRCLEAN=fpc_clean
+endif
+
+fpc_cleanall: $(CLEANTARGET) $(TARGETDIRCLEAN)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) $(FPCMADE) $(PPAS) link.res $(FPCEXTFILE) $(REDIRFILE)
+
+#####################################################################
+# Info rules
+#####################################################################
+
+.PHONY: fpc_info fpc_cfginfo fpc_objectinfo fpc_toolsinfo fpc_installinfo \
+	fpc_dirinfo
+
+fpc_info: $(INFOTARGET)
+
+fpc_infocfg:
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC....... $(FPC)
+	@$(ECHO)  Version... $(FPC_VERSION)
+	@$(ECHO)  CPU....... $(CPU_TARGET)
+	@$(ECHO)  Source.... $(OS_SOURCE)
+	@$(ECHO)  Target.... $(OS_TARGET)
+	@$(ECHO)
+
+fpc_infoobjects:
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  LoaderObjects..... $(LOADEROBJECTS)
+	@$(ECHO)  UnitObjects....... $(UNITOBJECTS)
+	@$(ECHO)  ExeObjects........ $(EXEOBJECTS)
+	@$(ECHO)
+	@$(ECHO)  ExtraCleanUnits... $(EXTRACLEANUNITS)
+	@$(ECHO)  ExtraCleanFiles... $(EXTRACLEANFILES)
+	@$(ECHO)
+	@$(ECHO)  ExtraInstallUnits. $(EXTRAINSTALLUNITS)
+	@$(ECHO)  ExtraInstallFiles. $(EXTRAINSTALLFILES)
+	@$(ECHO)
+
+fpc_infoinstall:
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+ifdef DATE
+	@$(ECHO)  DateStr.............. $(DATESTR)
+endif
+ifdef PACKAGEPREFIX
+	@$(ECHO)  PackagePrefix........ $(PACKAGEPREFIX)
+endif
+ifdef PACKAGENAME
+	@$(ECHO)  PackageName.......... $(PACKAGENAME)
+endif
+	@$(ECHO)  PackageSuffix........ $(PACKAGESUFFIX)
+	@$(ECHO)
+	@$(ECHO)  BaseInstallDir....... $(BASEINSTALLDIR)
+	@$(ECHO)  BinInstallDir........ $(BININSTALLDIR)
+	@$(ECHO)  LibInstallDir........ $(LIBINSTALLDIR)
+	@$(ECHO)  UnitInstallDir....... $(UNITINSTALLDIR)
+	@$(ECHO)  SourceInstallDir..... $(SOURCEINSTALLDIR)
+	@$(ECHO)  DocInstallDir........ $(DOCINSTALLDIR)
+	@$(ECHO)  DataInstallDir....... $(DATAINSTALLDIR)
+	@$(ECHO)
+	@$(ECHO)  DestZipDir........... $(DESTZIPDIR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)
+
+#####################################################################
+# Local Makefile
+#####################################################################
+
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+
+#####################################################################
+# Users rules
+#####################################################################
+
+.PHONY: all_units linux win32 w32d w32s
+
+all_units: linux win32
+
+linux: c_gen$(EXEEXT) ogl_linux.gen
+	c_gen ogl_linux.gen
+
+win32: w32d w32s
+
+w32d: c_gen$(EXEEXT) ogl_w32d.gen
+	c_gen ogl_w32d.gen
+
+w32s: c_gen$(EXEEXT) ogl_w32s.gen
+	c_gen ogl_w32s.gen

+ 33 - 0
packages/opengl/build/Makefile.fpc

@@ -0,0 +1,33 @@
+#
+#   Makefile.fpc for auto generation of OpenGL units
+#
+
+[targets]
+units=buildgl
+programs=c_gen
+
+[require]
+packages=fcl
+
+[dirs]
+fpcdir=../../..
+
+[defaults]
+defaultrule=all_units
+
+[rules]
+.PHONY: all_units linux win32 w32d w32s
+
+all_units: linux win32
+
+linux: c_gen$(EXEEXT) ogl_linux.gen
+        c_gen ogl_linux.gen
+
+win32: w32d w32s
+
+w32d: c_gen$(EXEEXT) ogl_w32d.gen
+        c_gen ogl_w32d.gen
+
+w32s: c_gen$(EXEEXT) ogl_w32s.gen
+        c_gen ogl_w32s.gen
+

+ 86 - 0
packages/opengl/build/buildgl.pp

@@ -0,0 +1,86 @@
+{
+  $Id$
+
+  GL unit creation tool helpers
+  (c) 1999 Sebastian Guenther, [email protected]
+}
+
+{$MODE objfpc}
+{$H+}
+
+unit buildgl;
+
+interface
+uses SysUtils, Classes;
+
+type
+
+  TDefReader = class
+  protected
+    FInterfaceBlock, FProcs: TStringList;
+  public
+    constructor Create(const Filename: String);
+    property InterfaceBlock: TStringList read FInterfaceBlock;
+    property Procs: TStringList read FProcs;
+  end;
+
+
+implementation
+
+
+constructor TDefReader.Create(const Filename: String);
+type
+  TCurState = (stateNothing, stateCopyInterface, stateProcs);
+var
+  f: Text;
+  s: String;
+  state: TCurState;
+begin
+  state := stateNothing;
+  FInterfaceBlock := TStringList.Create;
+  FProcs := TStringList.Create;
+
+  Assign(f, Filename);
+  Reset(f);
+  while not EOF(f) do begin
+    ReadLn(f, s);
+    if Copy(s, 1, 1) = '#' then continue;  // Skip comments
+    if s = '%COPY_INTERFACE' then
+      state := stateCopyInterface
+    else if s = '%PROCS' then
+      state := stateProcs
+    else if s = '%END' then
+      state := stateNothing
+    else
+      case state of
+        stateCopyInterface: InterfaceBlock.Add(s);
+        stateProcs: Procs.Add(s);
+      end;
+  end;
+  Close(f);
+end;
+
+end.
+
+
+{
+  $Log$
+  Revision 1.4  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:17  michael
+  + Initial import
+
+  Revision 1.1  2000/05/26 09:22:39  alex
+  universal cross platform unit file generator
+
+  Revision 1.1  1999/12/23 13:51:50  peter
+    * reorganized, it now doesn't depend on fcl anymore by default
+
+  Revision 1.1  1999/11/28 17:55:22  sg
+  * Added new unit generation tools and auto-generated GL units for Linux
+
+}

+ 600 - 0
packages/opengl/build/c_gen.pp

@@ -0,0 +1,600 @@
+{
+  unit generation tool
+  (C) 2000 Alexander Stohr, [email protected]
+  based upon the linux dynamic tool from Sebastian Guenther
+  with latest version "1.1 1999/12/23 13:51:50 peter"
+}
+
+{$MODE objfpc}
+{$H-}   { use normal strings }
+(* do not enable! fpc bug with H+ *)
+
+program c_gen;
+
+uses
+  SysUtils,
+  Classes,
+  buildgl;
+
+// =====================================================================
+
+type
+  ptDefFile     = ^tDefFile;
+  tDefFile      = record
+                    Name        : String;
+                    DefFile     : TDefReader;
+                    pNext       : ptDefFile;
+                  end;
+
+  ptSectionKey  = ^tSectionKey;
+  tSectionKey   = record
+                    Keyword     : String;
+                    Rule        : DWord;
+                    pDefFile    : ptDefFile;
+                    Option2     : String;
+                    pNext       : ptSectionKey;
+                  end;
+
+// =====================================================================
+
+const
+  verbose       = 0;    // change this for debugging
+
+const
+  ST_NONE       = 0;
+  ST_COMMON     = 1;
+  ST_FILE       = 2;
+
+  RULE_IG       = 0;
+  RULE_TX       = 1;
+  RULE_IF       = 2;
+  RULE_PD       = 3;
+  RULE_PL       = 4;
+  RULE_PS       = 5;
+
+// =====================================================================
+// global vars
+
+var
+  ReturnVal     : Word;
+
+  pSectionKey   : ptSectionKey;
+  pAllDefFile   : ptDefFile;
+
+  ToolName      : String;
+  TargetText    : String;
+  TargetDir     : String;
+
+  SectionType   : DWord;
+  SectionName   : String;
+
+  TemplateName  : String;
+
+// =====================================================================
+
+procedure StripSpaces(var s : String);
+var
+  L : Byte;
+begin
+  // strip leading spaces
+  while (Pos(' ',s)=1) or (Pos(#8,s)=1) do
+    Delete(s,1,1);
+
+  // strip trailing spaces
+  L := Length(s);
+  while L<>0 do
+  begin
+    if (s[L]=' ') or (s[L]=#8) then
+    begin
+      Delete(s,L,1);
+      Dec(L);
+    end
+    else
+      L := 0;
+  end;
+end;
+
+function GetName(var s : String) : String;
+var
+  Name : String;
+  P    : Byte;
+begin
+  Name := s;
+  P := Pos(',',s);
+  if p>0 then
+  begin
+    Delete(s,1,P);
+    Delete(Name,P,255);
+  end
+  else
+    s := '';
+
+  StripSpaces(Name);
+
+{  WriteLn('GetName, reminder = ',Name,',',s); }
+
+  GetName := Name;
+end;
+
+function Name2Rule(Name : String) : DWord;
+begin
+  if Name='IG'
+  then Name2Rule := RULE_IG
+  else
+  if Name='TX'
+  then Name2Rule := RULE_TX
+  else
+  if Name='IF'
+  then Name2Rule := RULE_IF
+  else
+  if Name='PD'
+  then Name2Rule := RULE_PD
+  else
+  if Name='PL'
+  then Name2Rule := RULE_PL
+  else
+  if Name='PS'
+  then Name2Rule := RULE_PS
+  else
+  begin
+    Name2Rule := RULE_IG;
+    WriteLn('error - unknown rule: ',Name);
+    ReturnVal := 1;
+  end;
+end;
+
+function AddDefFile(Name : String) : ptDefFile;
+var
+  pDefFile : ptDefFile;
+  pSearch  : ptDefFile;
+begin
+  pDefFile := NIL;
+
+  // search if file is already loaded
+  if pAllDefFile<>NIL then
+  begin
+    pSearch := pAllDefFile;
+    while pSearch<>NIL do
+    begin
+      if pSearch^.Name = Name then
+      begin
+        pDefFile := pSearch;
+        pSearch := NIL;
+      end
+      else
+        pSearch := pSearch^.pNext;
+    end;
+  end;
+
+  // create new file if its not loaded
+  if pDefFile = NIL then
+  begin
+    New(pDefFile);
+
+    pDefFile^.Name := Name;
+    pDefFile^.DefFile := TDefReader.Create(Name);
+    pDefFile^.pNext := pAllDefFile;     // chain in as first member
+
+    pAllDefFile := pDefFile;
+  end;
+
+  AddDefFile := pDefFile;
+end;
+
+procedure AddSectionKey(s : string);
+var
+  pKey : ptSectionKey;
+  t : string;
+begin
+  New(pKey);
+
+  pKey^.Keyword  := GetName(s);
+  pKey^.Rule     := Name2Rule(GetName(s));
+  pKey^.pDefFile := AddDefFile(GetName(s));
+  t := GetName(s);
+  pKey^.Option2  := t;
+  pKey^.pNext    := pSectionKey; // chain in as first member
+
+  pSectionKey   := pKey;
+end;
+
+function GetSectionKey(s : string) : ptSectionKey;
+var
+  pSearch : ptSectionKey;
+begin
+  GetSectionKey := NIL;
+
+  pSearch := pSectionKey;
+  while pSearch<>NIL do
+  begin
+    if pSearch^.Keyword = s then
+    begin
+      GetSectionKey := pSearch;
+      pSearch := NIL;
+    end
+    else pSearch := pSearch^.pNext;
+  end;
+end;
+
+procedure FreeSectionKeys;
+var
+  pSearch, pNext : ptSectionKey;
+begin
+  pSearch := pSectionKey;
+  while pSearch<>NIL do
+  begin
+    pNext := pSearch^.pNext;
+    Dispose(pSearch);
+    pSearch := pNext;
+  end;
+  pSectionKey := pSearch;
+end;
+
+// =====================================================================
+
+procedure ResetCommonSecData;
+begin
+  ToolName   := 'BuildTool';
+  TargetText := 'unknown';
+  TargetDir  := '.\';
+end;
+
+procedure ResetFileSecData;
+begin
+  FreeSectionKeys;
+  TemplateName := '';
+end;
+
+procedure InitGlobals;
+begin
+  ReturnVal := 0;
+
+  SectionType := ST_NONE;
+  pSectionKey := NIL;
+  pAllDefFile := NIL;
+
+  ResetCommonSecData;
+  ResetFileSecData;
+end;
+
+// =====================================================================
+
+procedure PrintInterface(var dest: Text; lines: TStringList);
+var
+  i: Integer;
+begin
+  for i := 0 to lines.Count - 1 do
+    WriteLn(dest, lines.Strings[i]);
+end;
+
+procedure PrintProcDecls(var dest: Text; procs: TStringList; const Modifier : String);
+var
+  i, j: Integer;
+  s: String;
+begin
+  for i := 0 to procs.Count - 1 do
+  begin
+    s := procs.Strings[i];
+    j := Pos('//', s);
+    if (Length(s) = 0)
+    then
+      WriteLn(dest)
+    else
+    if (Pos('{', s) = 1)
+    then
+      WriteLn(dest,procs.Strings[i])
+    else
+    if ((j > 0) and (Trim(s)[1] = '/')) then
+      WriteLn(dest, s)
+    else if j = 0 then
+      WriteLn(dest, s, ' ',Modifier)
+    else
+      WriteLn(dest, TrimRight(Copy(s, 1, j-1)),
+        ' ',Modifier,' ', Copy(s, j, Length(s)) );
+  end;
+end;
+
+procedure PrintProcLoaders(var dest: Text; procs: TStringList; const libname: String);
+var
+  i, j: Integer;
+  s: String;
+begin
+  for i := 0 to procs.Count - 1 do
+  begin
+    s := Trim(procs.Strings[i]);
+    if (Pos('//', s) > 0)
+    or (Pos('{', s) = 1)
+    then
+      WriteLn(dest,procs.Strings[i])
+    else
+    begin
+      j := Pos(':', s);
+      s := Trim(Copy(s, 1, j - 1));
+      if (Length(s) = 0)
+      then
+        continue
+      else
+        WriteLn(dest, '  ', s, ' := GetProc(', libname, ', ''', s, ''');');
+    end;
+  end;
+end;
+
+procedure PrintProcStatic(var dest: Text; procs: TStringList; const Modifier: String);
+var
+  i, j, k: Integer;
+  s: String;
+  t: String;
+begin
+  for i := 0 to procs.Count - 1 do
+  begin
+    s := procs.Strings[i];
+    j := Pos('//', s);
+    if (Length(s) = 0) or ((j > 0) and (Trim(s)[1] = '/')) then
+      WriteLn(dest, s)
+    else
+    begin
+      // swap order of leading symbols and remove ':'
+      t := Trim(procs.Strings[i]);
+      j := Pos(':', t);
+      t := Trim(Copy(t, 1, j - 1));
+
+      j := Pos(':', s);
+      Delete(s,1,j);
+      s := Trim(s);
+
+      j := Pos(';', s);
+      k := Pos('(', s);
+      if k>0 then if j>k then j := k;
+      k := Pos(':', s);
+      if k>0 then if j>k then j := k;
+
+      Insert(t,s,j);
+      Insert(' ',s,j);
+
+      j := Pos('//', s);
+      if j = 0 then
+        WriteLn(dest, s, ' ',Modifier)
+      else
+        WriteLn(dest, TrimRight(Copy(s, 1, j-1)),
+          ' ',Modifier,' ', Copy(s, j, Length(s)) );
+    end;
+
+  end;
+end;
+
+procedure PrintCVSLogSection(var dest: Text);
+begin
+  WriteLn(dest);
+  WriteLn(dest);
+  WriteLn(dest, '{');
+  WriteLn(dest, '  $', 'Log:$');  // needed because _this_ file might be in CVS, too
+  WriteLn(dest, '}');
+end;
+
+// =====================================================================
+
+procedure ProcessFileSection;
+var
+  f             : Text;
+  tpl           : Text;
+  s             : String;
+{  j             : Integer; }
+  tmp           : String;
+  pKey          : ptSectionKey;
+begin
+  WriteLn('Generating "',TargetDir+SectionName,'" ...');
+
+  Assign(f, TargetDir+SectionName);
+  Rewrite(f);
+
+  Assign(tpl, TemplateName);
+  Reset(tpl);
+
+  while not EOF(tpl) do
+  begin
+    ReadLn(tpl, s);
+    if Copy(s, 1, 1) = '%' then
+    begin
+      tmp := Copy(s,2,255);
+      StripSpaces(tmp);
+
+      pKey := GetSectionKey(tmp);
+
+      if pKey=NIL then
+      begin
+        WriteLn(f, '// ### ',ToolName,': Don''t know what to insert here!: ', s);
+        WriteLn('error - unknown keyword: ',tmp);
+        ReturnVal := 1;
+      end
+      else
+      begin
+        case pKey^.Rule of
+          RULE_IG : { ignore };
+          RULE_TX : { todo };
+          RULE_IF : PrintInterface(f, pKey^.pDefFile^.DefFile.InterfaceBlock);
+          RULE_PD : PrintProcDecls(f, pKey^.pDefFile^.DefFile.Procs,
+                      pKey^.Option2);
+          RULE_PL : PrintProcLoaders(f, pKey^.pDefFile^.DefFile.Procs,
+                      pKey^.Option2);
+          RULE_PS : PrintProcStatic(f, pKey^.pDefFile^.DefFile.Procs,
+                      pKey^.Option2);
+        end;
+      end;
+    end
+    else
+    begin
+      if Copy(s, 1, 1) <> '#'
+      then WriteLn(f, s);
+    end;
+  end;
+  PrintCVSLogSection(f);
+  Close(f);
+
+(*
+    if Copy(s, 1, 1) <> '#' then
+      begin
+      j := Pos('#extdecl', s);
+      if j = 0 then
+        WriteLn(f, s)
+      else
+        WriteLn(f, Copy(s, 1, j - 1), 'cdecl', Copy(s, j + 8, Length(s)));
+    end;
+*)
+
+end;
+
+procedure ProcessCommonSection;
+begin
+  if verbose>0 then
+  begin
+    WriteLn('common section:');
+    WriteLn('  ToolName   = ',ToolName);
+    WriteLn('  TargetText = ',TargetText);
+    WriteLn('  TargetDir  = ',TargetDir);
+  end;
+end;
+
+// =====================================================================
+
+procedure SectionComplete;
+begin
+  if ReturnVal=0 then { if we are error free }
+  case SectionType of
+    ST_NONE :
+      begin
+        // ignore
+      end;
+    ST_COMMON :
+      begin
+        ProcessCommonSection;
+      end;
+    ST_FILE :
+      begin
+        ProcessFileSection();
+      end;
+  end;
+end;
+
+var
+  hFGen         : Text;
+  Line          : String;
+  KeyName       : String;
+  KeyValue      : String;
+
+begin
+  InitGlobals;
+
+  WriteLn('File Generator Tool for OpenGL related Units');
+
+  if ParamCount<>1 then
+  begin
+    WriteLn('specify a generator file as parameter 1');
+    Halt(1);
+  end;
+
+  // Open Generation File
+  Assign(hFGen,ParamStr(1));
+  Reset(hFGen);
+
+  while Not(EOF(hFGen)) do
+  begin
+    ReadLn(hFGen,Line);
+    if Length(Line)>0 then
+    begin
+      if Line[1]='[' then
+      begin
+        // its a new section
+        SectionComplete;        // close previous section
+
+        Delete(Line,Pos(']',Line),255);
+        SectionName := Copy(Line,2,255);
+
+        if verbose>0 then
+          WriteLn('SectionName = ',SectionName);
+
+        if SectionName='common' then
+        begin
+          SectionType := ST_COMMON;
+          ResetCommonSecData;
+        end
+        else
+        begin
+          SectionType := ST_FILE;
+          ResetFileSecData;
+        end;
+      end
+      else
+      if Pos(Line[1],'#*;''')<>0 then
+      begin
+        // just a comment - ignore
+      end
+      else
+      begin
+        // its a key in the section
+        KeyName := Line;
+        KeyValue := Line;
+
+        Delete(KeyName,Pos('=',KeyName),255);
+        Delete(KeyValue,1,Pos('=',KeyValue));
+
+        StripSpaces(KeyName);
+        StripSpaces(KeyValue);
+
+//        WriteLn('KeyName  = ',KeyName);
+//        WriteLn('KeyValue = ',KeyValue);
+
+        case SectionType of
+          ST_COMMON :
+            begin
+              if KeyName='TOOL_NAME'
+              then ToolName := KeyValue
+              else
+              if KeyName='TARGET_TEXT'
+              then TargetText := KeyValue
+              else
+              if KeyName='TARGET_DIR'
+              then
+              begin
+                TargetDir := KeyValue;
+
+              end
+              else
+              begin
+                WriteLn('error in script file - inside common section');
+                WriteLn('key line: ',Line);
+                ReturnVal := 1;
+              end;
+            end;
+          ST_FILE :
+            begin
+              if KeyName='TEMPLATE'
+              then TemplateName := KeyValue
+              else
+              if KeyName='KEY'
+              then AddSectionKey(KeyValue)
+              else
+              begin
+                WriteLn('error in script file - inside file section');
+                WriteLn('key line: ',Line);
+                ReturnVal := 1;
+              end;
+            end;
+          ELSE
+            begin
+              WriteLn('error in script file - not in a section');
+              WriteLn('key line: ',Line);
+              ReturnVal := 1;
+            end;
+        end;
+      end
+    end;
+  end;
+
+  SectionComplete;      // close last section
+
+  Close(hFGen);
+
+  WriteLn('Done...');
+
+  Halt(ReturnVal);
+end.

+ 98 - 0
packages/opengl/build/def2def.pas

@@ -0,0 +1,98 @@
+PROGRAM def2def;
+{ converts the rpoc section of a def file
+  from function prototye format to function varaible format
+  if not already in right form }
+
+VAR
+  Fin, Fout  : Text;
+  I, J, K, L : Word;
+  S, T, U, V : String;
+  Mode       : Word;
+
+PROCEDURE UpString(VAR S:String);
+VAR
+  I : Word;
+BEGIN
+  FOR I := 1 TO Length(S) DO
+    S[I] := UpCase(S[I]);
+END;
+
+BEGIN
+  IF ParamCount<>2 THEN
+  BEGIN
+    WriteLn('Error: Invalid parameter count');
+    WriteLn('Usage:');
+    WriteLn('  def2def [source] [destination]');
+    Halt(1);
+  END;
+
+  IF ParamStr(1)=ParamStr(2) THEN
+  BEGIN
+    WriteLn('Error: files must be different');
+    WriteLn('Usage:');
+    WriteLn('  def2def [source] [destination]');
+    Halt(1);
+  END;
+
+  Assign(Fin,ParamStr(1));
+  Reset(Fin);
+
+  Assign(Fout,ParamStr(2));
+  ReWrite(Fout);
+
+  WriteLn('Converting...');
+  Mode := 0;
+  WHILE Not(EOF(Fin)) DO
+  BEGIN
+    ReadLn(Fin,S);
+    IF Length(S)>0 THEN
+      IF S[1]='%' THEN
+      BEGIN
+        IF S='%END'            THEN Mode:=0 ELSE
+        IF S='%COPY_INTERFACE' THEN Mode:=1 ELSE
+        IF S='%PROCS'          THEN Mode:=2 ELSE
+           (* Unknown *)            Mode:=0;
+      END ELSE
+      BEGIN
+        CASE Mode OF
+          0 : { nothing };
+          1 : { nothing };
+          2 : BEGIN
+                T := S;
+                WHILE Pos(' ',T)=1 DO
+                  Delete(T,1,1);
+                I := Pos(' ',T);
+                U := Copy(T,1,I-1);
+                V := U;
+                UpString(U);
+                IF (U='PROCEDURE') OR (U='FUNCTION') THEN
+                BEGIN
+                  { this line needs swapping }
+                  Delete(T,1,I);
+                  WHILE Pos(' ',T)=1 DO
+                    Delete(T,1,1);
+                  I := Pos('(',T);
+                  J := Pos(' ',T);
+                  K := Pos(':',T);
+                  L := Pos(';',T);
+                  IF L>0 THEN
+                  BEGIN
+                    IF (I>0) AND (I<L) THEN L := I;
+                    IF (J>0) AND (J<L) THEN L := J;
+                    IF (K>0) AND (K<L) THEN L := K;
+                    Insert(': '+V,T,L);
+                    S := T;
+                  END;
+                END;
+              END;
+          ELSE { nothing };
+        END;
+      END;
+    WriteLn(Fout,S);
+  END;
+
+  Close(Fin);
+  Close(Fout);
+
+  WriteLn('Done.');
+END.

+ 866 - 0
packages/opengl/build/gl10.def

@@ -0,0 +1,866 @@
+# This is the definition file for all GL 1.0 stuff
+
+%COPY_INTERFACE
+
+const
+  GL_NO_ERROR                           = 0;
+
+  // Boolean values
+  GL_FALSE                              = 0;
+  GL_TRUE                               = 1;
+
+  // Data types
+  GL_BYTE                               = $1400;
+  GL_UNSIGNED_BYTE                      = $1401;
+  GL_SHORT                              = $1402;
+  GL_UNSIGNED_SHORT                     = $1403;
+  GL_INT                                = $1404;
+  GL_UNSIGNED_INT                       = $1405;
+  GL_FLOAT                              = $1406;
+  GL_DOUBLE                             = $140A;
+  GL_2_BYTES                            = $1407;
+  GL_3_BYTES                            = $1408;
+  GL_4_BYTES                            = $1409;
+
+  // Primitives
+  GL_LINES                              = $0001;
+  GL_POINTS                             = $0000;
+  GL_LINE_STRIP                         = $0003;
+  GL_LINE_LOOP                          = $0002;
+  GL_TRIANGLES                          = $0004;
+  GL_TRIANGLE_STRIP                     = $0005;
+  GL_TRIANGLE_FAN                       = $0006;
+  GL_QUADS                              = $0007;
+  GL_QUAD_STRIP                         = $0008;
+  GL_POLYGON                            = $0009;
+  GL_EDGE_FLAG                          = $0B43;
+
+  // Vertex arrays
+  GL_VERTEX_ARRAY                       = $8074;
+  GL_NORMAL_ARRAY                       = $8075;
+  GL_COLOR_ARRAY                        = $8076;
+  GL_INDEX_ARRAY                        = $8077;
+  GL_TEXTURE_COORD_ARRAY                = $8078;
+  GL_EDGE_FLAG_ARRAY                    = $8079;
+  GL_VERTEX_ARRAY_SIZE                  = $807A;
+  GL_VERTEX_ARRAY_TYPE                  = $807B;
+  GL_VERTEX_ARRAY_STRIDE                = $807C;
+  GL_NORMAL_ARRAY_TYPE                  = $807E;
+  GL_NORMAL_ARRAY_STRIDE                = $807F;
+  GL_COLOR_ARRAY_SIZE                   = $8081;
+  GL_COLOR_ARRAY_TYPE                   = $8082;
+  GL_COLOR_ARRAY_STRIDE                 = $8083;
+  GL_INDEX_ARRAY_TYPE                   = $8085;
+  GL_INDEX_ARRAY_STRIDE                 = $8086;
+  GL_TEXTURE_COORD_ARRAY_SIZE           = $8088;
+  GL_TEXTURE_COORD_ARRAY_TYPE           = $8089;
+  GL_TEXTURE_COORD_ARRAY_STRIDE         = $808A;
+  GL_EDGE_FLAG_ARRAY_STRIDE             = $808C;
+  GL_VERTEX_ARRAY_POINTER               = $808E;
+  GL_NORMAL_ARRAY_POINTER               = $808F;
+  GL_COLOR_ARRAY_POINTER                = $8090;
+  GL_INDEX_ARRAY_POINTER                = $8091;
+  GL_TEXTURE_COORD_ARRAY_POINTER        = $8092;
+  GL_EDGE_FLAG_ARRAY_POINTER            = $8093;
+  GL_V2F                                = $2A20;
+  GL_V3F                                = $2A21;
+  GL_C4UB_V2F                           = $2A22;
+  GL_C4UB_V3F                           = $2A23;
+  GL_C3F_V3F                            = $2A24;
+  GL_N3F_V3F                            = $2A25;
+  GL_C4F_N3F_V3F                        = $2A26;
+  GL_T2F_V3F                            = $2A27;
+  GL_T4F_V4F                            = $2A28;
+  GL_T2F_C4UB_V3F                       = $2A29;
+  GL_T2F_C3F_V3F                        = $2A2A;
+  GL_T2F_N3F_V3F                        = $2A2B;
+  GL_T2F_C4F_N3F_V3F                    = $2A2C;
+  GL_T4F_C4F_N3F_V4F                    = $2A2D;
+
+  // Matrix Mode
+  GL_MATRIX_MODE                        = $0BA0;
+  GL_MODELVIEW                          = $1700;
+  GL_PROJECTION                         = $1701;
+  GL_TEXTURE                            = $1702;
+
+  // Points
+  GL_POINT_SMOOTH                       = $0B10;
+  GL_POINT_SIZE                         = $0B11;
+  GL_POINT_SIZE_GRANULARITY             = $0B13;
+  GL_POINT_SIZE_RANGE                   = $0B12;
+
+  // Lines
+  GL_LINE_SMOOTH                        = $0B20;
+  GL_LINE_STIPPLE                       = $0B24;
+  GL_LINE_STIPPLE_PATTERN               = $0B25;
+  GL_LINE_STIPPLE_REPEAT                = $0B26;
+  GL_LINE_WIDTH                         = $0B21;
+  GL_LINE_WIDTH_GRANULARITY             = $0B23;
+  GL_LINE_WIDTH_RANGE                   = $0B22;
+
+  // Polygons
+  GL_POINT                              = $1B00;
+  GL_LINE                               = $1B01;
+  GL_FILL                               = $1B02;
+  GL_CCW                                = $0901;
+  GL_CW                                 = $0900;
+  GL_FRONT                              = $0404;
+  GL_BACK                               = $0405;
+  GL_CULL_FACE                          = $0B44;
+  GL_CULL_FACE_MODE                     = $0B45;
+  GL_POLYGON_SMOOTH                     = $0B41;
+  GL_POLYGON_STIPPLE                    = $0B42;
+  GL_FRONT_FACE                         = $0B46;
+  GL_POLYGON_MODE                       = $0B40;
+  GL_POLYGON_OFFSET_FACTOR              = $8038;
+  GL_POLYGON_OFFSET_UNITS               = $2A00;
+  GL_POLYGON_OFFSET_POINT               = $2A01;
+  GL_POLYGON_OFFSET_LINE                = $2A02;
+  GL_POLYGON_OFFSET_FILL                = $8037;
+
+  // Display lists
+  GL_COMPILE                            = $1300;
+  GL_COMPILE_AND_EXECUTE                = $1301;
+  GL_LIST_BASE                          = $0B32;
+  GL_LIST_INDEX                         = $0B33;
+  GL_LIST_MODE                          = $0B30;
+
+  // Depth buffer
+  GL_NEVER                              = $0200;
+  GL_LESS                               = $0201;
+  GL_GEQUAL                             = $0206;
+  GL_LEQUAL                             = $0203;
+  GL_GREATER                            = $0204;
+  GL_NOTEQUAL                           = $0205;
+  GL_EQUAL                              = $0202;
+  GL_ALWAYS                             = $0207;
+  GL_DEPTH_TEST                         = $0B71;
+  GL_DEPTH_BITS                         = $0D56;
+  GL_DEPTH_CLEAR_VALUE                  = $0B73;
+  GL_DEPTH_FUNC                         = $0B74;
+  GL_DEPTH_RANGE                        = $0B70;
+  GL_DEPTH_WRITEMASK                    = $0B72;
+  GL_DEPTH_COMPONENT                    = $1902;
+
+  // Lighting
+  GL_LIGHTING                           = $0B50;
+  GL_LIGHT0                             = $4000;
+  GL_LIGHT1                             = $4001;
+  GL_LIGHT2                             = $4002;
+  GL_LIGHT3                             = $4003;
+  GL_LIGHT4                             = $4004;
+  GL_LIGHT5                             = $4005;
+  GL_LIGHT6                             = $4006;
+  GL_LIGHT7                             = $4007;
+  GL_SPOT_EXPONENT                      = $1205;
+  GL_SPOT_CUTOFF                        = $1206;
+  GL_CONSTANT_ATTENUATION               = $1207;
+  GL_LINEAR_ATTENUATION                 = $1208;
+  GL_QUADRATIC_ATTENUATION              = $1209;
+  GL_AMBIENT                            = $1200;
+  GL_DIFFUSE                            = $1201;
+  GL_SPECULAR                           = $1202;
+  GL_SHININESS                          = $1601;
+  GL_EMISSION                           = $1600;
+  GL_POSITION                           = $1203;
+  GL_SPOT_DIRECTION                     = $1204;
+  GL_AMBIENT_AND_DIFFUSE                = $1602;
+  GL_COLOR_INDEXES                      = $1603;
+  GL_LIGHT_MODEL_TWO_SIDE               = $0B52;
+  GL_LIGHT_MODEL_LOCAL_VIEWER           = $0B51;
+  GL_LIGHT_MODEL_AMBIENT                = $0B53;
+  GL_FRONT_AND_BACK                     = $0408;
+  GL_SHADE_MODEL                        = $0B54;
+  GL_FLAT                               = $1D00;
+  GL_SMOOTH                             = $1D01;
+  GL_COLOR_MATERIAL                     = $0B57;
+  GL_COLOR_MATERIAL_FACE                = $0B55;
+  GL_COLOR_MATERIAL_PARAMETER           = $0B56;
+  GL_NORMALIZE                          = $0BA1;
+
+  // User clipping planes
+  GL_CLIP_PLANE0                        = $3000;
+  GL_CLIP_PLANE1                        = $3001;
+  GL_CLIP_PLANE2                        = $3002;
+  GL_CLIP_PLANE3                        = $3003;
+  GL_CLIP_PLANE4                        = $3004;
+  GL_CLIP_PLANE5                        = $3005;
+
+  // Accumulation buffer
+  GL_ACCUM_RED_BITS                     = $0D58;
+  GL_ACCUM_GREEN_BITS                   = $0D59;
+  GL_ACCUM_BLUE_BITS                    = $0D5A;
+  GL_ACCUM_ALPHA_BITS                   = $0D5B;
+  GL_ACCUM_CLEAR_VALUE                  = $0B80;
+  GL_ACCUM                              = $0100;
+  GL_ADD                                = $0104;
+  GL_LOAD                               = $0101;
+  GL_MULT                               = $0103;
+  GL_RETURN                             = $0102;
+
+  // Alpha testing
+  GL_ALPHA_TEST                         = $0BC0;
+  GL_ALPHA_TEST_REF                     = $0BC2;
+  GL_ALPHA_TEST_FUNC                    = $0BC1;
+
+  // Blending
+  GL_BLEND                              = $0BE2;
+  GL_BLEND_SRC                          = $0BE1;
+  GL_BLEND_DST                          = $0BE0;
+  GL_ZERO                               = 0;
+  GL_ONE                                = 1;
+  GL_SRC_COLOR                          = $0300;
+  GL_ONE_MINUS_SRC_COLOR                = $0301;
+  GL_DST_COLOR                          = $0306;
+  GL_ONE_MINUS_DST_COLOR                = $0307;
+  GL_SRC_ALPHA                          = $0302;
+  GL_ONE_MINUS_SRC_ALPHA                = $0303;
+  GL_DST_ALPHA                          = $0304;
+  GL_ONE_MINUS_DST_ALPHA                = $0305;
+  GL_SRC_ALPHA_SATURATE                 = $0308;
+  GL_CONSTANT_COLOR                     = $8001;
+  GL_ONE_MINUS_CONSTANT_COLOR           = $8002;
+  GL_CONSTANT_ALPHA                     = $8003;
+  GL_ONE_MINUS_CONSTANT_ALPHA           = $8004;
+
+  // Render mode
+  GL_FEEDBACK                           = $1C01;
+  GL_RENDER                             = $1C00;
+  GL_SELECT                             = $1C02;
+
+  // Feedback
+  GL_2D                                 = $0600;
+  GL_3D                                 = $0601;
+  GL_3D_COLOR                           = $0602;
+  GL_3D_COLOR_TEXTURE                   = $0603;
+  GL_4D_COLOR_TEXTURE                   = $0604;
+  GL_POINT_TOKEN                        = $0701;
+  GL_LINE_TOKEN                         = $0702;
+  GL_LINE_RESET_TOKEN                   = $0707;
+  GL_POLYGON_TOKEN                      = $0703;
+  GL_BITMAP_TOKEN                       = $0704;
+  GL_DRAW_PIXEL_TOKEN                   = $0705;
+  GL_COPY_PIXEL_TOKEN                   = $0706;
+  GL_PASS_THROUGH_TOKEN                 = $0700;
+  GL_FEEDBACK_BUFFER_POINTER            = $0DF0;
+  GL_FEEDBACK_BUFFER_SIZE               = $0DF1;
+  GL_FEEDBACK_BUFFER_TYPE               = $0DF2;
+
+  // Selection
+  GL_SELECTION_BUFFER_POINTER           = $0DF3;
+  GL_SELECTION_BUFFER_SIZE              = $0DF4;
+
+  // Fog
+  GL_FOG                                = $0B60;
+  GL_FOG_MODE                           = $0B65;
+  GL_FOG_DENSITY                        = $0B62;
+  GL_FOG_COLOR                          = $0B66;
+  GL_FOG_INDEX                          = $0B61;
+  GL_FOG_START                          = $0B63;
+  GL_FOG_END                            = $0B64;
+  GL_LINEAR                             = $2601;
+  GL_EXP                                = $0800;
+  GL_EXP2                               = $0801;
+
+  // Logic ops
+  GL_LOGIC_OP                           = $0BF1;
+  GL_INDEX_LOGIC_OP                     = $0BF1;
+  GL_COLOR_LOGIC_OP                     = $0BF2;
+  GL_LOGIC_OP_MODE                      = $0BF0;
+  GL_CLEAR                              = $1500;
+  GL_SET                                = $150F;
+  GL_COPY                               = $1503;
+  GL_COPY_INVERTED                      = $150C;
+  GL_NOOP                               = $1505;
+  GL_INVERT                             = $150A;
+  GL_AND                                = $1501;
+  GL_NAND                               = $150E;
+  GL_OR                                 = $1507;
+  GL_NOR                                = $1508;
+  GL_XOR                                = $1506;
+  GL_EQUIV                              = $1509;
+  GL_AND_REVERSE                        = $1502;
+  GL_AND_INVERTED                       = $1504;
+  GL_OR_REVERSE                         = $150B;
+  GL_OR_INVERTED                        = $150D;
+
+  // Stencil
+  GL_STENCIL_TEST                       = $0B90;
+  GL_STENCIL_WRITEMASK                  = $0B98;
+  GL_STENCIL_BITS                       = $0D57;
+  GL_STENCIL_FUNC                       = $0B92;
+  GL_STENCIL_VALUE_MASK                 = $0B93;
+  GL_STENCIL_REF                        = $0B97;
+  GL_STENCIL_FAIL                       = $0B94;
+  GL_STENCIL_PASS_DEPTH_PASS            = $0B96;
+  GL_STENCIL_PASS_DEPTH_FAIL            = $0B95;
+  GL_STENCIL_CLEAR_VALUE                = $0B91;
+  GL_STENCIL_INDEX                      = $1901;
+  GL_KEEP                               = $1E00;
+  GL_REPLACE                            = $1E01;
+  GL_INCR                               = $1E02;
+  GL_DECR                               = $1E03;
+
+  // Buffers, Pixel Drawing/Reading
+  GL_NONE                               = 0;
+  GL_LEFT                               = $0406;
+  GL_RIGHT                              = $0407;
+  //GL_FRONT                            = $0404;
+  //GL_BACK                             = $0405;
+  //GL_FRONT_AND_BACK                   = $0408;
+  GL_FRONT_LEFT                         = $0400;
+  GL_FRONT_RIGHT                        = $0401;
+  GL_BACK_LEFT                          = $0402;
+  GL_BACK_RIGHT                         = $0403;
+  GL_AUX0                               = $0409;
+  GL_AUX1                               = $040A;
+  GL_AUX2                               = $040B;
+  GL_AUX3                               = $040C;
+  GL_COLOR_INDEX                        = $1900;
+  GL_RED                                = $1903;
+  GL_GREEN                              = $1904;
+  GL_BLUE                               = $1905;
+  GL_ALPHA                              = $1906;
+  GL_LUMINANCE                          = $1909;
+  GL_LUMINANCE_ALPHA                    = $190A;
+  GL_ALPHA_BITS                         = $0D55;
+  GL_RED_BITS                           = $0D52;
+  GL_GREEN_BITS                         = $0D53;
+  GL_BLUE_BITS                          = $0D54;
+  GL_INDEX_BITS                         = $0D51;
+  GL_SUBPIXEL_BITS                      = $0D50;
+  GL_AUX_BUFFERS                        = $0C00;
+  GL_READ_BUFFER                        = $0C02;
+  GL_DRAW_BUFFER                        = $0C01;
+  GL_DOUBLEBUFFER                       = $0C32;
+  GL_STEREO                             = $0C33;
+  GL_BITMAP                             = $1A00;
+  GL_COLOR                              = $1800;
+  GL_DEPTH                              = $1801;
+  GL_STENCIL                            = $1802;
+  GL_DITHER                             = $0BD0;
+  GL_RGB                                = $1907;
+  GL_RGBA                               = $1908;
+
+  // Implementation limits
+  GL_MAX_LIST_NESTING                   = $0B31;
+  GL_MAX_ATTRIB_STACK_DEPTH             = $0D35;
+  GL_MAX_MODELVIEW_STACK_DEPTH          = $0D36;
+  GL_MAX_NAME_STACK_DEPTH               = $0D37;
+  GL_MAX_PROJECTION_STACK_DEPTH         = $0D38;
+  GL_MAX_TEXTURE_STACK_DEPTH            = $0D39;
+  GL_MAX_EVAL_ORDER                     = $0D30;
+  GL_MAX_LIGHTS                         = $0D31;
+  GL_MAX_CLIP_PLANES                    = $0D32;
+  GL_MAX_TEXTURE_SIZE                   = $0D33;
+  GL_MAX_PIXEL_MAP_TABLE                = $0D34;
+  GL_MAX_VIEWPORT_DIMS                  = $0D3A;
+  GL_MAX_CLIENT_ATTRIB_STACK_DEPTH      = $0D3B;
+
+  // Gets
+  GL_ATTRIB_STACK_DEPTH                 = $0BB0;
+  GL_CLIENT_ATTRIB_STACK_DEPTH          = $0BB1;
+  GL_COLOR_CLEAR_VALUE                  = $0C22;
+  GL_COLOR_WRITEMASK                    = $0C23;
+  GL_CURRENT_INDEX                      = $0B01;
+  GL_CURRENT_COLOR                      = $0B00;
+  GL_CURRENT_NORMAL                     = $0B02;
+  GL_CURRENT_RASTER_COLOR               = $0B04;
+  GL_CURRENT_RASTER_DISTANCE            = $0B09;
+  GL_CURRENT_RASTER_INDEX               = $0B05;
+  GL_CURRENT_RASTER_POSITION            = $0B07;
+  GL_CURRENT_RASTER_TEXTURE_COORDS      = $0B06;
+  GL_CURRENT_RASTER_POSITION_VALID      = $0B08;
+  GL_CURRENT_TEXTURE_COORDS             = $0B03;
+  GL_INDEX_CLEAR_VALUE                  = $0C20;
+  GL_INDEX_MODE                         = $0C30;
+  GL_INDEX_WRITEMASK                    = $0C21;
+  GL_MODELVIEW_MATRIX                   = $0BA6;
+  GL_MODELVIEW_STACK_DEPTH              = $0BA3;
+  GL_NAME_STACK_DEPTH                   = $0D70;
+  GL_PROJECTION_MATRIX                  = $0BA7;
+  GL_PROJECTION_STACK_DEPTH             = $0BA4;
+  GL_RENDER_MODE                        = $0C40;
+  GL_RGBA_MODE                          = $0C31;
+  GL_TEXTURE_MATRIX                     = $0BA8;
+  GL_TEXTURE_STACK_DEPTH                = $0BA5;
+  GL_VIEWPORT                           = $0BA2;
+
+  // Evaluators
+  GL_AUTO_NORMAL                        = $0D80;
+  GL_MAP1_COLOR_4                       = $0D90;
+  GL_MAP1_GRID_DOMAIN                   = $0DD0;
+  GL_MAP1_GRID_SEGMENTS                 = $0DD1;
+  GL_MAP1_INDEX                         = $0D91;
+  GL_MAP1_NORMAL                        = $0D92;
+  GL_MAP1_TEXTURE_COORD_1               = $0D93;
+  GL_MAP1_TEXTURE_COORD_2               = $0D94;
+  GL_MAP1_TEXTURE_COORD_3               = $0D95;
+  GL_MAP1_TEXTURE_COORD_4               = $0D96;
+  GL_MAP1_VERTEX_3                      = $0D97;
+  GL_MAP1_VERTEX_4                      = $0D98;
+  GL_MAP2_COLOR_4                       = $0DB0;
+  GL_MAP2_GRID_DOMAIN                   = $0DD2;
+  GL_MAP2_GRID_SEGMENTS                 = $0DD3;
+  GL_MAP2_INDEX                         = $0DB1;
+  GL_MAP2_NORMAL                        = $0DB2;
+  GL_MAP2_TEXTURE_COORD_1               = $0DB3;
+  GL_MAP2_TEXTURE_COORD_2               = $0DB4;
+  GL_MAP2_TEXTURE_COORD_3               = $0DB5;
+  GL_MAP2_TEXTURE_COORD_4               = $0DB6;
+  GL_MAP2_VERTEX_3                      = $0DB7;
+  GL_MAP2_VERTEX_4                      = $0DB8;
+  GL_COEFF                              = $0A00;
+  GL_DOMAIN                             = $0A02;
+  GL_ORDER                              = $0A01;
+
+  // Hints
+  GL_FOG_HINT                           = $0C54;
+  GL_LINE_SMOOTH_HINT                   = $0C52;
+  GL_PERSPECTIVE_CORRECTION_HINT        = $0C50;
+  GL_POINT_SMOOTH_HINT                  = $0C51;
+  GL_POLYGON_SMOOTH_HINT                = $0C53;
+  GL_DONT_CARE                          = $1100;
+  GL_FASTEST                            = $1101;
+  GL_NICEST                             = $1102;
+
+  // Scissor box
+  GL_SCISSOR_TEST                       = $0C11;
+  GL_SCISSOR_BOX                        = $0C10;
+
+  // Pixel Mode / Transfer
+  GL_MAP_COLOR                          = $0D10;
+  GL_MAP_STENCIL                        = $0D11;
+  GL_INDEX_SHIFT                        = $0D12;
+  GL_INDEX_OFFSET                       = $0D13;
+  GL_RED_SCALE                          = $0D14;
+  GL_RED_BIAS                           = $0D15;
+  GL_GREEN_SCALE                        = $0D18;
+  GL_GREEN_BIAS                         = $0D19;
+  GL_BLUE_SCALE                         = $0D1A;
+  GL_BLUE_BIAS                          = $0D1B;
+  GL_ALPHA_SCALE                        = $0D1C;
+  GL_ALPHA_BIAS                         = $0D1D;
+  GL_DEPTH_SCALE                        = $0D1E;
+  GL_DEPTH_BIAS                         = $0D1F;
+  GL_PIXEL_MAP_S_TO_S_SIZE              = $0CB1;
+  GL_PIXEL_MAP_I_TO_I_SIZE              = $0CB0;
+  GL_PIXEL_MAP_I_TO_R_SIZE              = $0CB2;
+  GL_PIXEL_MAP_I_TO_G_SIZE              = $0CB3;
+  GL_PIXEL_MAP_I_TO_B_SIZE              = $0CB4;
+  GL_PIXEL_MAP_I_TO_A_SIZE              = $0CB5;
+  GL_PIXEL_MAP_R_TO_R_SIZE              = $0CB6;
+  GL_PIXEL_MAP_G_TO_G_SIZE              = $0CB7;
+  GL_PIXEL_MAP_B_TO_B_SIZE              = $0CB8;
+  GL_PIXEL_MAP_A_TO_A_SIZE              = $0CB9;
+  GL_PIXEL_MAP_S_TO_S                   = $0C71;
+  GL_PIXEL_MAP_I_TO_I                   = $0C70;
+  GL_PIXEL_MAP_I_TO_R                   = $0C72;
+  GL_PIXEL_MAP_I_TO_G                   = $0C73;
+  GL_PIXEL_MAP_I_TO_B                   = $0C74;
+  GL_PIXEL_MAP_I_TO_A                   = $0C75;
+  GL_PIXEL_MAP_R_TO_R                   = $0C76;
+  GL_PIXEL_MAP_G_TO_G                   = $0C77;
+  GL_PIXEL_MAP_B_TO_B                   = $0C78;
+  GL_PIXEL_MAP_A_TO_A                   = $0C79;
+  GL_PACK_ALIGNMENT                     = $0D05;
+  GL_PACK_LSB_FIRST                     = $0D01;
+  GL_PACK_ROW_LENGTH                    = $0D02;
+  GL_PACK_SKIP_PIXELS                   = $0D04;
+  GL_PACK_SKIP_ROWS                     = $0D03;
+  GL_PACK_SWAP_BYTES                    = $0D00;
+  GL_UNPACK_ALIGNMENT                   = $0CF5;
+  GL_UNPACK_LSB_FIRST                   = $0CF1;
+  GL_UNPACK_ROW_LENGTH                  = $0CF2;
+  GL_UNPACK_SKIP_PIXELS                 = $0CF4;
+  GL_UNPACK_SKIP_ROWS                   = $0CF3;
+  GL_UNPACK_SWAP_BYTES                  = $0CF0;
+  GL_ZOOM_X                             = $0D16;
+  GL_ZOOM_Y                             = $0D17;
+
+  // Texture mapping
+  GL_TEXTURE_ENV                        = $2300;
+  GL_TEXTURE_ENV_MODE                   = $2200;
+  GL_TEXTURE_1D                         = $0DE0;
+  GL_TEXTURE_2D                         = $0DE1;
+  GL_TEXTURE_WRAP_S                     = $2802;
+  GL_TEXTURE_WRAP_T                     = $2803;
+  GL_TEXTURE_MAG_FILTER                 = $2800;
+  GL_TEXTURE_MIN_FILTER                 = $2801;
+  GL_TEXTURE_ENV_COLOR                  = $2201;
+  GL_TEXTURE_GEN_S                      = $0C60;
+  GL_TEXTURE_GEN_T                      = $0C61;
+  GL_TEXTURE_GEN_MODE                   = $2500;
+  GL_TEXTURE_BORDER_COLOR               = $1004;
+  GL_TEXTURE_WIDTH                      = $1000;
+  GL_TEXTURE_HEIGHT                     = $1001;
+  GL_TEXTURE_BORDER                     = $1005;
+  GL_TEXTURE_COMPONENTS                 = $1003;
+  GL_TEXTURE_RED_SIZE                   = $805C;
+  GL_TEXTURE_GREEN_SIZE                 = $805D;
+  GL_TEXTURE_BLUE_SIZE                  = $805E;
+  GL_TEXTURE_ALPHA_SIZE                 = $805F;
+  GL_TEXTURE_LUMINANCE_SIZE             = $8060;
+  GL_TEXTURE_INTENSITY_SIZE             = $8061;
+  GL_NEAREST_MIPMAP_NEAREST             = $2700;
+  GL_NEAREST_MIPMAP_LINEAR              = $2702;
+  GL_LINEAR_MIPMAP_NEAREST              = $2701;
+  GL_LINEAR_MIPMAP_LINEAR               = $2703;
+  GL_OBJECT_LINEAR                      = $2401;
+  GL_OBJECT_PLANE                       = $2501;
+  GL_EYE_LINEAR                         = $2400;
+  GL_EYE_PLANE                          = $2502;
+  GL_SPHERE_MAP                         = $2402;
+  GL_DECAL                              = $2101;
+  GL_MODULATE                           = $2100;
+  GL_NEAREST                            = $2600;
+  GL_REPEAT                             = $2901;
+  GL_CLAMP                              = $2900;
+  GL_S                                  = $2000;
+  GL_T                                  = $2001;
+  GL_R                                  = $2002;
+  GL_Q                                  = $2003;
+  GL_TEXTURE_GEN_R                      = $0C62;
+  GL_TEXTURE_GEN_Q                      = $0C63;
+%END
+
+
+#=====================================================================
+# Procedures and functions
+#=====================================================================
+
+%PROCS
+// Miscellaneous
+glClearIndex: procedure(c: Single);
+glClearColor: procedure(red, green, blue, alpha: GLclampf);
+glClear: procedure(mask: GLbitfield);
+glIndexMask: procedure(mask: LongWord);
+glColorMask: procedure(red, green, blue, alpha: GLboolean);
+glAlphaFunc: procedure(func: GLenum; ref: GLclampf);
+glBlendFunc: procedure(sfactor, dfactor: GLenum);
+glLogicOp: procedure(opcode: GLenum);
+glCullFace: procedure(mode: GLenum);
+glFrontFace: procedure(mode: GLenum);
+glPointSize: procedure(size: Single);
+glLineWidth: procedure(width: Single);
+glLineStipple: procedure(factor: LongInt; pattern: Word);
+glPolygonMode: procedure(face, mode: GLenum);
+glPolygonOffset: procedure(factor, units: Single);
+glPolygonStipple: procedure(var mask: Byte);
+glGetPolygonStipple: procedure(var mask: Byte);
+glEdgeFlag: procedure(flag: GLBoolean);
+glEdgeFlagv: procedure(var flag: GLBoolean);
+glScissor: procedure(x, y, width, height: LongInt);
+glClipPlane: procedure(plane: GLenum; var equation: Double);
+glGetClipPlane: procedure(plane: GLenum; var equation: Double);
+glDrawBuffer: procedure(mode: GLenum);
+glReadBuffer: procedure(mode: GLenum);
+glEnable: procedure(cap: LongInt);
+glDisable: procedure(cap: LongInt);
+glIsEnabled: function(cap: GLenum): GLBoolean;
+glGetBooleanv: procedure(pname: GLenum; params : PGLBoolean);
+glGetDoublev: procedure(pname: GLenum; params : PDouble);
+glGetFloatv: procedure(pname: GLenum; params : PSingle);
+glGetIntegerv: procedure(pname: GLenum; params : PLongInt);
+glPushAttrib: procedure(mask: GLbitfield);
+glPopAttrib: procedure;
+glRenderMode: function(mode: GLenum): LongInt;
+glGetError: function: GLenum;
+glGetString: function(name: GLenum): PChar;
+glFinish: procedure;
+glFlush: procedure;
+glHint: procedure(target, mode: GLenum);
+
+// Depth Buffer
+glClearDepth: procedure(depth: GLclampd);
+glDepthFunc: procedure(func: LongInt);
+glDepthMask: procedure(flag: GLBoolean);
+glDepthRange: procedure(near_val, far_val: GLclampd);
+
+// Accumulation Buffer
+glClearAccum: procedure(red, green, blue, alpha: Single);
+glAccum: procedure(op: GLenum; value: Single);
+
+// Tranformation
+glMatrixMode: procedure(mode: GLenum);
+glOrtho: procedure(left, right, bottom, top, near_val, far_val: Double);
+glFrustum: procedure(left, right, bottom, top, near_val, far_val: Double);
+glViewport: procedure(x, y, width, height: LongInt);
+glPushMatrix: procedure;
+glPopMatrix: procedure;
+glLoadIdentity: procedure;
+glLoadMatrixd: procedure(var m: Double);
+glLoadMatrixf: procedure(var m: PSingle);
+glMultMatrixd: procedure(var m: Double);
+glMultMatrixf: procedure(var m: Single);
+glRotated: procedure(angle, x, y, z: Double);
+glRotatef: procedure(angle, x, y, z: Single);
+glScaled: procedure(x, y, z: Double);
+glScalef: procedure(x, y, z: Single);
+glTranslated: procedure(x, y, z: Double);
+glTranslatef: procedure(x, y, z: Single);
+
+// Display Lists
+glIsList: function(list: LongWord): GLBoolean;
+glDeleteLists: procedure(list: LongWord; range: LongInt);
+glGenLists: function(range: LongInt): LongWord;
+glNewList: procedure(list: LongWord; mode: GLenum);
+glEndList: procedure;
+glCallList: procedure(list: LongWord);
+glCallLists: procedure(n: LongInt; AType: GLenum; var lists);
+glListBase: procedure(base: LongWord);
+
+// Drawing Functions
+glBegin: procedure(mode: GLenum);
+glEnd: procedure;
+glVertex2d: procedure(x, y: Double);
+glVertex2f: procedure(x, y: Single);
+glVertex2i: procedure(x, y: LongInt);
+glVertex2s: procedure(x, y: SmallInt);
+glVertex3d: procedure(x, y, z: Double);
+glVertex3f: procedure(x, y, z: Single);
+glVertex3i: procedure(x, y, z: LongInt);
+glVertex3s: procedure(x, y, z: SmallInt);
+glVertex4d: procedure(x, y, z, w: Double);
+glVertex4f: procedure(x, y, z, w: Single);
+glVertex4i: procedure(x, y, z, w: LongInt);
+glVertex4s: procedure(x, y, z, w: SmallInt);
+glVertex2dv: procedure(var v: Double);
+glVertex2fv: procedure(var v: Single);
+glVertex2iv: procedure(var v: LongInt);
+glVertex2sv: procedure(var v: SmallInt);
+glVertex3dv: procedure(var v: Double);
+glVertex3fv: procedure(var v: Single);
+glVertex3iv: procedure(var v: LongInt);
+glVertex3sv: procedure(var v: SmallInt);
+glVertex4dv: procedure(var v: Double);
+glVertex4fv: procedure(var v: Single);
+glVertex4iv: procedure(var v: LongInt);
+glVertex4sv: procedure(var v: SmallInt);
+glNormal3b: procedure(nx, ny, nz: Byte);
+glNormal3d: procedure(nx, ny, nz: Double);
+glNormal3f: procedure(nx, ny, nz: Single);
+glNormal3i: procedure(nx, ny, nz: LongInt);
+glNormal3s: procedure(nx, ny, nz: SmallInt);
+glNormal3bv: procedure(var v: ShortInt);
+glNormal3dv: procedure(var v: Double);
+glNormal3fv: procedure(var v: Single);
+glNormal3iv: procedure(var v: LongInt);
+glNormal3sv: procedure(var v: SmallInt);
+glIndexd: procedure(c: Double);
+glIndexf: procedure(c: Single);
+glIndexi: procedure(c: LongInt);
+glIndexs: procedure(c: SmallInt);
+glIndexdv: procedure(var c: Double);
+glIndexfv: procedure(var c: Single);
+glIndexiv: procedure(var c: LongInt);
+glIndexsv: procedure(var c: SmallInt);
+glColor3b: procedure (red, green, blue: ShortInt);
+glColor3d: procedure (red, green, blue: Double);
+glColor3f: procedure (red, green, blue: Single);
+glColor3i: procedure (red, green, blue: LongInt);
+glColor3s: procedure (red, green, blue: SmallInt);
+glColor3ub: procedure(red, green, blue: Byte);
+glColor3ui: procedure(red, green, blue: LongWord);
+glColor3us: procedure(red, green, blue: Word);
+glColor4b: procedure (red, green, blue, alpha: ShortInt);
+glColor4d: procedure (red, green, blue, alpha: Double);
+glColor4f: procedure (red, green, blue, alpha: Single);
+glColor4i: procedure (red, green, blue, alpha: LongInt);
+glColor4s: procedure (red, green, blue, alpha: SmallInt);
+glColor4ub: procedure(red, green, blue, alpha: Byte);
+glColor4ui: procedure(red, green, blue, alpha: LongWord);
+glColor4us: procedure(red, green, blue, alpha: Word);
+glColor3bv: procedure (var v: ShortInt);
+glColor3dv: procedure (var v: Double);
+glColor3fv: procedure (var v: Single);
+glColor3iv: procedure (var v: LongInt);
+glColor3sv: procedure (var v: SmallInt);
+glColor3ubv: procedure(var v: Byte);
+glColor3uiv: procedure(var v: LongWord);
+glColor3usv: procedure(var v: Word);
+glColor4bv: procedure (var v: ShortInt);
+glColor4dv: procedure (var v: Double);
+glColor4fv: procedure (var v: Single);
+glColor4iv: procedure (var v: LongInt);
+glColor4sv: procedure (var v: SmallInt);
+glColor4ubv: procedure(var v: Byte);
+glColor4uiv: procedure(var v: LongWord);
+glColor4usv: procedure(var v: Word);
+glTexCoord1d: procedure(s: Double);
+glTexCoord1f: procedure(s: Single);
+glTexCoord1i: procedure(s: LongInt);
+glTexCoord1s: procedure(s: SmallInt);
+glTexCoord2d: procedure(s, t: Double);
+glTexCoord2f: procedure(s, t: Single);
+glTexCoord2i: procedure(s, t: LongInt);
+glTexCoord2s: procedure(s, t: SmallInt);
+glTexCoord3d: procedure(s, t, r: Double);
+glTexCoord3f: procedure(s, t, r: Single);
+glTexCoord3i: procedure(s, t, r: LongInt);
+glTexCoord3s: procedure(s, t, r: SmallInt);
+glTexCoord4d: procedure(s, t, r, q: Double);
+glTexCoord4f: procedure(s, t, r, q: Single);
+glTexCoord4i: procedure(s, t, r, q: LongInt);
+glTexCoord4s: procedure(s, t, r, q: SmallInt);
+glTexCoord1dv: procedure(var v: Double);
+glTexCoord1fv: procedure(var v: Single);
+glTexCoord1iv: procedure(var v: LongInt);
+glTexCoord1sv: procedure(var v: SmallInt);
+glTexCoord2dv: procedure(var v: Double);
+glTexCoord2fv: procedure(var v: Single);
+glTexCoord2iv: procedure(var v: LongInt);
+glTexCoord2sv: procedure(var v: SmallInt);
+glTexCoord3dv: procedure(var v: Double);
+glTexCoord3fv: procedure(var v: Single);
+glTexCoord3iv: procedure(var v: LongInt);
+glTexCoord3sv: procedure(var v: SmallInt);
+glTexCoord4dv: procedure(var v: Double);
+glTexCoord4fv: procedure(var v: Single);
+glTexCoord4iv: procedure(var v: LongInt);
+glTexCoord4sv: procedure(var v: SmallInt);
+glRasterPos2d: procedure(x, y: Double);
+glRasterPos2f: procedure(x, y: Single);
+glRasterPos2i: procedure(x, y: LongInt);
+glRasterPos2s: procedure(x, y: SmallInt);
+glRasterPos3d: procedure(x, y, z: Double);
+glRasterPos3f: procedure(x, y, z: Single);
+glRasterPos3i: procedure(x, y, z: LongInt);
+glRasterPos3s: procedure(x, y, z: SmallInt);
+glRasterPos4d: procedure(x, y, z, w: Double);
+glRasterPos4f: procedure(x, y, z, w: Single);
+glRasterPos4i: procedure(x, y, z, w: LongInt);
+glRasterPos4s: procedure(x, y, z, w: SmallInt);
+glRasterPos2dv: procedure(var v: Double);
+glRasterPos2fv: procedure(var v: Single);
+glRasterPos2iv: procedure(var v: LongInt);
+glRasterPos2sv: procedure(var v: SmallInt);
+glRasterPos3dv: procedure(var v: Double);
+glRasterPos3fv: procedure(var v: Single);
+glRasterPos3iv: procedure(var v: LongInt);
+glRasterPos3sv: procedure(var v: SmallInt);
+glRasterPos4dv: procedure(var v: Double);
+glRasterPos4fv: procedure(var v: Single);
+glRasterPos4iv: procedure(var v: LongInt);
+glRasterPos4sv: procedure(var v: SmallInt);
+glRectd: procedure(x1, y1, x2, y2: Double);
+glRectf: procedure(x1, y1, x2, y2: Single);
+glRecti: procedure(x1, y1, x2, y2: LongInt);
+glRects: procedure(x1, y1, x2, y2: SmallInt);
+glRectdv: procedure(var v1, v2: Double);
+glRectfv: procedure(var v1, v2: Single);
+glRectiv: procedure(var v1, v2: LongInt);
+glRectsv: procedure(var v1, v2: SmallInt);
+
+// Lighting
+glShadeModel: procedure(mode: GLenum);
+glLightf: procedure(light, pname: GLenum; param: Single);
+glLighti: procedure(light, pname: GLenum; param: LongInt);
+glLightfv: procedure(light, pname: GLenum; params : PSingle);
+glLightiv: procedure(light, pname: GLenum; params : PLongInt);
+glGetLightfv: procedure(light, pname: GLenum; params : PSingle);
+glGetLightiv: procedure(light, pname: GLenum; params : PLongInt);
+glLightModelf: procedure(pname: GLenum; param: Single);
+glLightModeli: procedure(pname: GLenum; param: LongInt);
+glLightModelfv: procedure(pname: GLenum; params : PSingle);
+glLightModeliv: procedure(pname: GLenum; params : PLongInt);
+glMaterialf: procedure(face, pname: GLenum; param: Single);
+glMateriali: procedure(face, pname: GLenum; param: LongInt);
+glMaterialfv: procedure(face, pname: GLenum; params : PSingle);
+glMaterialiv: procedure(face, pname: GLenum; params : PLongInt);
+glGetMaterialfv: procedure(face, pname: GLenum; params : PSingle);
+glGetMaterialiv: procedure(face, pname: GLenum; params : PLongInt);
+glColorMaterial: procedure(face, mode: GLenum);
+
+// Raster Functions
+glPixelZoom: procedure(xfactor, yfactor: Single);
+glPixelStoref: procedure(pname: GLenum; param: Single);
+glPixelStorei: procedure(pname: GLenum; param: LongInt);
+glPixelTransferf: procedure(pname: GLenum; param: Single);
+glPixelTransferi: procedure(pname: GLenum; param: LongInt);
+glPixelMapfv: procedure(map: GLenum; mapsize: LongInt; var values: Single);
+glPixelMapuiv: procedure(map: GLenum; mapsize: LongInt; var values: LongWord);
+glPixelMapusv: procedure(map: GLenum; mapsize: LongInt; var values: Word);
+glGetPixelMapfv: procedure(map: GLenum; var values: Single);
+glGetPixelMapuiv: procedure(map: GLenum; var values: LongWord);
+glGetPixelMapusv: procedure(map: GLenum; var values: Word);
+glBitmap: procedure(width, height: LongInt; xorig, yorig, xmove, ymove: Single; var bitmap);
+glReadPixels: procedure(x, y, width, height: LongInt; format, AType: GLenum; var pixels);
+glDrawPixels: procedure(width, height: LongInt; format, AType: GLenum; var pixels);
+glCopyPixels: procedure(x, y, width, height: LongInt; AType: GLenum);
+
+// Stenciling
+glStencilFunc: procedure(func: GLenum; ref: LongInt; mask: LongWord);
+glStencilMask: procedure(mask: LongWord);
+glStencilOp: procedure(fail, zfail, zpass: GLenum);
+glClearStencil: procedure(s: LongInt);
+
+// Texture Mapping
+glTexGend: procedure(cord, pname: GLenum; param: Double);
+glTexGenf: procedure(cord, pname: GLenum; param: Single);
+glTexGeni: procedure(cord, pname: GLenum; param: LongInt);
+glTexGendv: procedure(cord, pname: GLenum; params : PDouble);
+glTexGenfv: procedure(cord, pname: GLenum; params : PSingle);
+glTexGeniv: procedure(cord, pname: GLenum; params : PLongInt);
+glGetTexGendv: procedure(cord, pname: GLenum; params : PDouble);
+glGetTexGenfv: procedure(cord, pname: GLenum; params : PSingle);
+glGetTexGeniv: procedure(cord, pname: GLenum; params : PLongInt);
+glTexEnvf: procedure(target, pname: GLenum; param: Single);
+glTexEnvi: procedure(target, pname: GLenum; param: LongInt);
+glTexEnvfv: procedure(target, pname: GLenum; params : PSingle);
+glTexEnviv: procedure(target, pname: GLenum; params : PLongInt);
+glGetTexEnvfv: procedure(target, pname: GLenum; params : PSingle);
+glGetTexEnviv: procedure(target, pname: GLenum; params : PLongInt);
+glTexParameterf: procedure(target, pname: GLenum; param: Single);
+glTexParameteri: procedure(target, pname: GLenum; param: LongInt);
+glTexParameterfv: procedure(target, pname: GLenum; params : PSingle);
+glTexParameteriv: procedure(target, pname: GLenum; params : PLongInt);
+glGetTexParameterfv: procedure(target, pname: GLenum; params : PSingle);
+glGetTexParameteriv: procedure(target, pname: GLenum; params : PLongInt);
+glGetTexLevelParameterfv: procedure(target: GLenum; level: LongInt; pname: GLenum; params : PSingle);
+glGetTexLevelParameteriv: procedure(target: GLenum; level: LongInt; pname: GLenum; params : PLongInt);
+glTexImage1D: procedure(target: GLenum; level, internalFormat, width, border: LongInt; format, AType: GLenum; var pixels);
+glTexImage2D: procedure(target: GLenum; level, internalFormat, width, height, border: LongInt; format, AType: GLenum; var pixels);
+glGetTexImage: procedure(target: GLenum; level: LongInt; format, AType: GLenum; var pixels);
+
+// Evaluators
+glMap1d: procedure(target: GLenum; u1, u2: Double; stride, order: LongInt; var points: Double);
+glMap1f: procedure(target: GLenum; u1, u2: Single; stride, order: LongInt; var points: Single);
+glMap2d: procedure(target: GLenum; u1, u2: Double; ustride, uorder: LongInt; v1, v2: Double; vstride, vorder: LongInt; var points: Double);
+glMap2f: procedure(target: GLenum; u1, u2: Single; ustride, uorder: LongInt; v1, v2: Single; vstride, vorder: LongInt; var points: Single);
+glGetMapdv: procedure(target, query: GLenum; var v: Double);
+glGetMapfv: procedure(target, query: GLenum; var v: Single);
+glGetMapiv: procedure(target, query: GLenum; var v: LongInt);
+glEvalCoord1d: procedure(u: Double);
+glEvalCoord1f: procedure(u: Single);
+glEvalCoord1dv: procedure(var u: Double);
+glEvalCoord1fv: procedure(var u: Single);
+glEvalCoord2d: procedure(u, v: Double);
+glEvalCoord2f: procedure(u, v: Single);
+glEvalCoord2dv: procedure(var u, v: Double);
+glEvalCoord2fv: procedure(var u, v: Single);
+glMapGrid1d: procedure(un: LongInt; u1, u2: Double);
+glMapGrid1f: procedure(un: LongInt; u1, u2: Single);
+glMapGrid2d: procedure(un: LongInt; u1, u2: Double; vn: LongInt; v1, v2: Double);
+glMapGrid2f: procedure(un: LongInt; u1, u2: Single; vn: LongInt; v1, v2: Single);
+glEvalPoint1: procedure(i: LongInt);
+glEvalPoint2: procedure(i, j: LongInt);
+glEvalMesh1: procedure(mode: GLenum; i1, i2: LongInt);
+glEvalMesh2: procedure(mode: GLenum; i1, i2, j1, j2: LongInt);
+
+// Fog
+glFogf: procedure(pname: GLenum; param: Single);
+glFogi: procedure(pname: GLenum; param: LongInt);
+glFogfv: procedure(pname: GLenum; params : PSingle);
+glFogiv: procedure(pname: GLenum; params : PLongInt);
+
+// Selection and Feedback
+glFeedbackBuffer: procedure(size: LongInt; AType: GLenum; var buffer: Single);
+glPassThrough: procedure(token: Single);
+glSelectBuffer: procedure(size: LongInt; var buffer: LongWord);
+glInitNames: procedure;
+glLoadName: procedure(name: LongWord);
+glPushName: procedure(name: LongWord);
+glPopName: procedure;
+
+%END

+ 176 - 0
packages/opengl/build/gl10ext.def

@@ -0,0 +1,176 @@
+# This is the definition file for all GL 1.0 Extensions stuff
+
+%COPY_INTERFACE
+
+const
+  // GL_EXT_blend_minmax and GL_EXT_blend_color
+  GL_CONSTANT_COLOR_EXT                 = $8001;
+  GL_ONE_MINUS_CONSTANT_COLOR_EXT       = $8002;
+  GL_CONSTANT_ALPHA_EXT                 = $8003;
+  GL_ONE_MINUS_CONSTANT_ALPHA_EXT       = $8004;
+  GL_BLEND_EQUATION_EXT                 = $8009;
+  GL_MIN_EXT                            = $8007;
+  GL_MAX_EXT                            = $8008;
+  GL_FUNC_ADD_EXT                       = $8006;
+  GL_FUNC_SUBTRACT_EXT                  = $800A;
+  GL_FUNC_REVERSE_SUBTRACT_EXT          = $800B;
+  GL_BLEND_COLOR_EXT                    = $8005;
+
+  // GL_EXT_polygon_offset
+  GL_POLYGON_OFFSET_EXT                 = $8037;
+  GL_POLYGON_OFFSET_FACTOR_EXT          = $8038;
+  GL_POLYGON_OFFSET_BIAS_EXT            = $8039;
+
+  // GL_EXT_vertex_array
+  GL_VERTEX_ARRAY_EXT                   = $8074;
+  GL_NORMAL_ARRAY_EXT                   = $8075;
+  GL_COLOR_ARRAY_EXT                    = $8076;
+  GL_INDEX_ARRAY_EXT                    = $8077;
+  GL_TEXTURE_COORD_ARRAY_EXT            = $8078;
+  GL_EDGE_FLAG_ARRAY_EXT                = $8079;
+  GL_VERTEX_ARRAY_SIZE_EXT              = $807A;
+  GL_VERTEX_ARRAY_TYPE_EXT              = $807B;
+  GL_VERTEX_ARRAY_STRIDE_EXT            = $807C;
+  GL_VERTEX_ARRAY_COUNT_EXT             = $807D;
+  GL_NORMAL_ARRAY_TYPE_EXT              = $807E;
+  GL_NORMAL_ARRAY_STRIDE_EXT            = $807F;
+  GL_NORMAL_ARRAY_COUNT_EXT             = $8080;
+  GL_COLOR_ARRAY_SIZE_EXT               = $8081;
+  GL_COLOR_ARRAY_TYPE_EXT               = $8082;
+  GL_COLOR_ARRAY_STRIDE_EXT             = $8083;
+  GL_COLOR_ARRAY_COUNT_EXT              = $8084;
+  GL_INDEX_ARRAY_TYPE_EXT               = $8085;
+  GL_INDEX_ARRAY_STRIDE_EXT             = $8086;
+  GL_INDEX_ARRAY_COUNT_EXT              = $8087;
+  GL_TEXTURE_COORD_ARRAY_SIZE_EXT       = $8088;
+  GL_TEXTURE_COORD_ARRAY_TYPE_EXT       = $8089;
+  GL_TEXTURE_COORD_ARRAY_STRIDE_EXT     = $808A;
+  GL_TEXTURE_COORD_ARRAY_COUNT_EXT      = $808B;
+  GL_EDGE_FLAG_ARRAY_STRIDE_EXT         = $808C;
+  GL_EDGE_FLAG_ARRAY_COUNT_EXT          = $808D;
+  GL_VERTEX_ARRAY_POINTER_EXT           = $808E;
+  GL_NORMAL_ARRAY_POINTER_EXT           = $808F;
+  GL_COLOR_ARRAY_POINTER_EXT            = $8090;
+  GL_INDEX_ARRAY_POINTER_EXT            = $8091;
+  GL_TEXTURE_COORD_ARRAY_POINTER_EXT    = $8092;
+  GL_EDGE_FLAG_ARRAY_POINTER_EXT        = $8093;
+
+  // GL_EXT_texture_object
+  GL_TEXTURE_PRIORITY_EXT               = $8066;
+  GL_TEXTURE_RESIDENT_EXT               = $8067;
+  GL_TEXTURE_1D_BINDING_EXT             = $8068;
+  GL_TEXTURE_2D_BINDING_EXT             = $8069;
+
+  // GL_EXT_texture3D
+  GL_PACK_SKIP_IMAGES_EXT               = $806B;
+  GL_PACK_IMAGE_HEIGHT_EXT              = $806C;
+  GL_UNPACK_SKIP_IMAGES_EXT             = $806D;
+  GL_UNPACK_IMAGE_HEIGHT_EXT            = $806E;
+  GL_TEXTURE_3D_EXT                     = $806F;
+  GL_PROXY_TEXTURE_3D_EXT               = $8070;
+  GL_TEXTURE_DEPTH_EXT                  = $8071;
+  GL_TEXTURE_WRAP_R_EXT                 = $8072;
+  GL_MAX_3D_TEXTURE_SIZE_EXT            = $8073;
+  GL_TEXTURE_3D_BINDING_EXT             = $806A;
+
+  // GL_EXT_paletted_texture
+  GL_TABLE_TOO_LARGE_EXT                = $8031;
+  GL_COLOR_TABLE_FORMAT_EXT             = $80D8;
+  GL_COLOR_TABLE_WIDTH_EXT              = $80D9;
+  GL_COLOR_TABLE_RED_SIZE_EXT           = $80DA;
+  GL_COLOR_TABLE_GREEN_SIZE_EXT         = $80DB;
+  GL_COLOR_TABLE_BLUE_SIZE_EXT          = $80DC;
+  GL_COLOR_TABLE_ALPHA_SIZE_EXT         = $80DD;
+  GL_COLOR_TABLE_LUMINANCE_SIZE_EXT     = $80DE;
+  GL_COLOR_TABLE_INTENSITY_SIZE_EXT     = $80DF;
+  GL_TEXTURE_INDEX_SIZE_EXT             = $80ED;
+  GL_COLOR_INDEX1_EXT                   = $80E2;
+  GL_COLOR_INDEX2_EXT                   = $80E3;
+  GL_COLOR_INDEX4_EXT                   = $80E4;
+  GL_COLOR_INDEX8_EXT                   = $80E5;
+  GL_COLOR_INDEX12_EXT                  = $80E6;
+  GL_COLOR_INDEX16_EXT                  = $80E7;
+
+  // GL_EXT_shared_texture_palette
+  GL_SHARED_TEXTURE_PALETTE_EXT         = $81FB;
+
+  // GL_EXT_point_parameters
+  GL_POINT_SIZE_MIN_EXT                 = $8126;
+  GL_POINT_SIZE_MAX_EXT                 = $8127;
+  GL_POINT_FADE_THRESHOLD_SIZE_EXT      = $8128;
+  GL_DISTANCE_ATTENUATION_EXT           = $8129;
+
+  // GL_EXT_rescale_normal
+  GL_RESCALE_NORMAL_EXT                 = $803A;
+
+  // GL_EXT_abgr
+  GL_ABGR_EXT                           = $8000;
+
+const
+  // GL_EXT_multitexture
+  GL_SELECTED_TEXTURE_EXT               = $83C0;
+  GL_SELECTED_TEXTURE_COORD_SET_EXT     = $83C1;
+  GL_SELECTED_TEXTURE_TRANSFORM_EXT     = $83C2;
+  GL_MAX_TEXTURES_EXT                   = $83C3;
+  GL_MAX_TEXTURE_COORD_SETS_EXT         = $83C4;
+  GL_TEXTURE_ENV_COORD_SET_EXT          = $83C5;
+  GL_TEXTURE0_EXT                       = $83C6;
+  GL_TEXTURE1_EXT                       = $83C7;
+  GL_TEXTURE2_EXT                       = $83C8;
+  GL_TEXTURE3_EXT                       = $83C9;
+
+%END
+
+
+#=====================================================================
+# Procedures and functions
+#=====================================================================
+
+%PROCS
+
+// === 1.0 Extensions ===
+
+// GL_EXT_blend_minmax
+glBlendEquationEXT: procedure(mode: GLenum);
+
+// GL_EXT_blend_color
+glBlendColorEXT: procedure(red, green, blue, alpha: GLclampf);
+
+// GL_EXT_polygon_offset
+glPolygonOffsetEXT: procedure(factor, bias: Single);
+
+// GL_EXT_vertex_array
+glVertexPointerEXT: procedure(size: LongInt; AType: GLenum; stride, count: LongInt; var ptr);
+glNormalPointerEXT: procedure(AType: GLenum; stride, count: LongInt; var ptr);
+glColorPointerEXT: procedure(size: LongInt; AType: GLenum; stride, count: LongInt; var ptr);
+glIndexPointerEXT: procedure(AType: GLenum; stride, count: LongInt; var ptr);
+glTexCoordPointerEXT: procedure(size: LongInt; AType: GLenum; stride, count: LongInt; var ptr);
+glEdgeFlagPointerEXT: procedure(stride, count: LongInt; var ptr: Boolean);
+glGetPointervEXT: procedure(pname: GLenum; var params: Pointer);
+glArrayElementEXT: procedure(i: LongInt);
+glDrawArraysEXT: procedure(mode: GLEnum; first, count: LongInt);
+
+// GL_EXT_texture_object
+glGenTexturesEXT: procedure(n: LongInt; var textures: LongWord);
+glDeleteTexturesEXT: procedure(n: LongInt; var textures: LongWord);
+glBindTextureEXT: procedure(target: GLenum; texture: LongWord);
+glPrioritizeTexturesEXT: procedure(n: LongInt; var textures: LongWord; var priorities: GLClampf);
+glAreTexturesResidentEXT: function(n: LongInt; var textures: LongWord; var residences: Boolean): Boolean;
+glIsTextureEXT: function(texture: LongWord): Boolean;
+
+// GL_EXT_texture3D
+glTexImage3DEXT: procedure(target: GLenum; level: LongInt; internalFormat: GLenum; width, height, depth, border: LongInt; format, AType: GLenum; var pixels);
+glTexSubImage3DEXT: procedure(target: GLenum; level, xoffset, yoffset, zoffset, width, height, depth: LongInt; format, AType: GLenum; var pixels);
+glCopyTexSubImage3DEXT: procedure(target: GLenum; level, xoffset, yoffset, zoffset, x, y, width, height: LongInt);
+
+// GL_EXT_color_table
+glColorTableEXT: procedure(target, internalformat: GLenum; width: LongInt; format, AType: GLenum; var table);
+glColorSubTableEXT: procedure(target: GLenum; start, count: LongInt; format, AType: GLEnum; var data);
+glGetColorTableEXT: procedure(target, format, AType: GLenum; var table);
+glGetColorTableParameterfvEXT: procedure(target, pname: GLenum; var params: Single);
+glGetColorTableParameterivEXT: procedure(target, pname: GLenum; var params: LongInt);
+
+%END
+
+
+

+ 40 - 0
packages/opengl/build/gl10mesa.def

@@ -0,0 +1,40 @@
+# This is the definition file for all GL mesa stuff
+
+%COPY_INTERFACE
+%END
+
+
+#=====================================================================
+# Procedures and functions
+#=====================================================================
+
+%PROCS
+// GL_MESA_window_pos
+glWindowPos2iMESA: procedure(x, y: LongInt);
+glWindowPos2sMESA: procedure(x, y: ShortInt);
+glWindowPos2fMESA: procedure(x, y: Single);
+glWindowPos2dMESA: procedure(x, y: Double);
+glWindowPos2ivMESA: procedure(var p: LongInt);
+glWindowPos2svMESA: procedure(var p: ShortInt);
+glWindowPos2fvMESA: procedure(var p: Single);
+glWindowPos2dvMESA: procedure(var p: Double);
+glWindowPos3iMESA: procedure(x, y, z: LongInt);
+glWindowPos3sMESA: procedure(x, y, z: ShortInt);
+glWindowPos3fMESA: procedure(x, y, z: Single);
+glWindowPos3dMESA: procedure(x, y, z: Double);
+glWindowPos3ivMESA: procedure(var p: LongInt);
+glWindowPos3svMESA: procedure(var p: ShortInt);
+glWindowPos3fvMESA: procedure(var p: Single);
+glWindowPos3dvMESA: procedure(var p: Double);
+glWindowPos4iMESA: procedure(x, y, z, w: LongInt);
+glWindowPos4sMESA: procedure(x, y, z, w: ShortInt);
+glWindowPos4fMESA: procedure(x, y, z, w: Single);
+glWindowPos4dMESA: procedure(x, y, z, w: Double);
+glWindowPos4ivMESA: procedure(var p: LongInt);
+glWindowPos4svMESA: procedure(var p: ShortInt);
+glWindowPos4fvMESA: procedure(var p: Single);
+glWindowPos4dvMESA: procedure(var p: Double);
+
+// GL_MESA_resize_buffers
+glResizeBuffersMESA: procedure;
+%END

+ 109 - 0
packages/opengl/build/gl10sgi.def

@@ -0,0 +1,109 @@
+# This is the definition file for all GL 1.0 SGI stuff
+
+%COPY_INTERFACE
+
+const
+  // GL_SGIS_multitexture
+  GL_SELECTED_TEXTURE_SGIS              = $835C;
+  GL_SELECTED_TEXTURE_COORD_SET_SGIS    = $835D;
+  GL_MAX_TEXTURES_SGIS                  = $835E;
+  GL_TEXTURE0_SGIS                      = $835F;
+  GL_TEXTURE1_SGIS                      = $8360;
+  GL_TEXTURE2_SGIS                      = $8361;
+  GL_TEXTURE3_SGIS                      = $8362;
+  GL_TEXTURE_COORD_SET_SOURCE_SGIS      = $8363;
+
+const
+  // GL_SGIS_texture_edge_clamp
+  GL_CLAMP_TO_EDGE_SGIS                 = $812F;
+
+%END
+
+
+#=====================================================================
+# Procedures and functions
+#=====================================================================
+
+%PROCS
+
+// GL_SGIS_multitexture
+glMultiTexCoord1dSGIS: procedure(target: GLenum; s: Double);
+glMultiTexCoord1dvSGIS: procedure(target: GLenum; var v: Double);
+glMultiTexCoord1fSGIS: procedure(target: GLenum; s: Single);
+glMultiTexCoord1fvSGIS: procedure(target: GLenum; var v: Single);
+glMultiTexCoord1iSGIS: procedure(target: GLenum; s: LongInt);
+glMultiTexCoord1ivSGIS: procedure(target: GLenum; var v: LongInt);
+glMultiTexCoord1sSGIS: procedure(target: GLenum; s: ShortInt);
+glMultiTexCoord1svSGIS: procedure(target: GLenum; var v: ShortInt);
+glMultiTexCoord2dSGIS: procedure(target: GLenum; s, t: Double);
+glMultiTexCoord2dvSGIS: procedure(target: GLenum; var v: Double);
+glMultiTexCoord2fSGIS: procedure(target: GLenum; s, t: Single);
+glMultiTexCoord2fvSGIS: procedure(target: GLenum; var v: Single);
+glMultiTexCoord2iSGIS: procedure(target: GLenum; s, t: LongInt);
+glMultiTexCoord2ivSGIS: procedure(target: GLenum; var v: LongInt);
+glMultiTexCoord2sSGIS: procedure(target: GLenum; s, t: ShortInt);
+glMultiTexCoord2svSGIS: procedure(target: GLenum; var v: ShortInt);
+glMultiTexCoord3dSGIS: procedure(target: GLenum; s, t, r: Double);
+glMultiTexCoord3dvSGIS: procedure(target: GLenum; var v: Double);
+glMultiTexCoord3fSGIS: procedure(target: GLenum; s, t, r: Single);
+glMultiTexCoord3fvSGIS: procedure(target: GLenum; var v: Single);
+glMultiTexCoord3iSGIS: procedure(target: GLenum; s, t, r: LongInt);
+glMultiTexCoord3ivSGIS: procedure(target: GLenum; var v: LongInt);
+glMultiTexCoord3sSGIS: procedure(target: GLenum; s, t, r: ShortInt);
+glMultiTexCoord3svSGIS: procedure(target: GLenum; var v: ShortInt);
+glMultiTexCoord4dSGIS: procedure(target: GLenum; s, t, r, q: Double);
+glMultiTexCoord4dvSGIS: procedure(target: GLenum; var v: Double);
+glMultiTexCoord4fSGIS: procedure(target: GLenum; s, t, r, q: Single);
+glMultiTexCoord4fvSGIS: procedure(target: GLenum; var v: Single);
+glMultiTexCoord4iSGIS: procedure(target: GLenum; s, t, r, q: LongInt);
+glMultiTexCoord4ivSGIS: procedure(target: GLenum; var v: LongInt);
+glMultiTexCoord4sSGIS: procedure(target: GLenum; s, t, r, q: ShortInt);
+glMultiTexCoord4svSGIS: procedure(target: GLenum; var v: ShortInt);
+glMultiTexCoordPointerSGIS: procedure(target: GLenum; size: LongInt; AType: GLEnum; stride: LongInt; var APointer);
+glSelectTextureSGIS: procedure(target: GLenum);
+glSelectTextureCoordSetSGIS: procedure(target: GLenum);
+
+// GL_EXT_multitexture
+glMultiTexCoord1dEXT: procedure(target: GLenum; s: Double);
+glMultiTexCoord1dvEXT: procedure(target: GLenum; var v: Double);
+glMultiTexCoord1fEXT: procedure(target: GLenum; s: Single);
+glMultiTexCoord1fvEXT: procedure(target: GLenum; var v: Single);
+glMultiTexCoord1iEXT: procedure(target: GLenum; s: LongInt);
+glMultiTexCoord1ivEXT: procedure(target: GLenum; var v: LongInt);
+glMultiTexCoord1sEXT: procedure(target: GLenum; s: ShortInt);
+glMultiTexCoord1svEXT: procedure(target: GLenum; var v: ShortInt);
+glMultiTexCoord2dEXT: procedure(target: GLenum; s, t: Double);
+glMultiTexCoord2dvEXT: procedure(target: GLenum; var v: Double);
+glMultiTexCoord2fEXT: procedure(target: GLenum; s, t: Single);
+glMultiTexCoord2fvEXT: procedure(target: GLenum; var v: Single);
+glMultiTexCoord2iEXT: procedure(target: GLenum; s, t: LongInt);
+glMultiTexCoord2ivEXT: procedure(target: GLenum; var v: LongInt);
+glMultiTexCoord2sEXT: procedure(target: GLenum; s, t: ShortInt);
+glMultiTexCoord2svEXT: procedure(target: GLenum; var v: ShortInt);
+glMultiTexCoord3dEXT: procedure(target: GLenum; s, t, r: Double);
+glMultiTexCoord3dvEXT: procedure(target: GLenum; var v: Double);
+glMultiTexCoord3fEXT: procedure(target: GLenum; s, t, r: Single);
+glMultiTexCoord3fvEXT: procedure(target: GLenum; var v: Single);
+glMultiTexCoord3iEXT: procedure(target: GLenum; s, t, r: LongInt);
+glMultiTexCoord3ivEXT: procedure(target: GLenum; var v: LongInt);
+glMultiTexCoord3sEXT: procedure(target: GLenum; s, t, r: ShortInt);
+glMultiTexCoord3svEXT: procedure(target: GLenum; var v: ShortInt);
+glMultiTexCoord4dEXT: procedure(target: GLenum; s, t, r, q: Double);
+glMultiTexCoord4dvEXT: procedure(target: GLenum; var v: Double);
+glMultiTexCoord4fEXT: procedure(target: GLenum; s, t, r, q: Single);
+glMultiTexCoord4fvEXT: procedure(target: GLenum; var v: Single);
+glMultiTexCoord4iEXT: procedure(target: GLenum; s, t, r, q: LongInt);
+glMultiTexCoord4ivEXT: procedure(target: GLenum; var v: LongInt);
+glMultiTexCoord4sEXT: procedure(target: GLenum; s, t, r, q: ShortInt);
+glMultiTexCoord4svEXT: procedure(target: GLenum; var v: ShortInt);
+glInterleavedTextureCoordSetsEXT: procedure(factor: LongInt);
+glSelectTextureEXT: procedure(target: GLenum);
+glSelectTextureCoordSetEXT: procedure(target: GLenum);
+glSelectTextureTransformEXT: procedure(target: GLenum);
+
+// GL_EXT_point_parameters
+glPointParameterfEXT: procedure(pname: GLenum; param: Single);
+glPointParameterfvEXT: procedure(pname: GLenum; var params: Single);
+
+%END
+

+ 96 - 0
packages/opengl/build/gl11.def

@@ -0,0 +1,96 @@
+# This is the definition file for all GL 1.1 stuff
+
+%COPY_INTERFACE
+
+const
+  // GL 1.1 texturing
+  GL_PROXY_TEXTURE_1D                   = $8063;
+  GL_PROXY_TEXTURE_2D                   = $8064;
+  GL_TEXTURE_PRIORITY                   = $8066;
+  GL_TEXTURE_RESIDENT                   = $8067;
+  GL_TEXTURE_BINDING_1D                 = $8068;
+  GL_TEXTURE_BINDING_2D                 = $8069;
+  GL_TEXTURE_INTERNAL_FORMAT            = $1003;
+
+  // Internal texture formats (GL 1.1)
+  GL_ALPHA4                             = $803B;
+  GL_ALPHA8                             = $803C;
+  GL_ALPHA12                            = $803D;
+  GL_ALPHA16                            = $803E;
+  GL_LUMINANCE4                         = $803F;
+  GL_LUMINANCE8                         = $8040;
+  GL_LUMINANCE12                        = $8041;
+  GL_LUMINANCE16                        = $8042;
+  GL_LUMINANCE4_ALPHA4                  = $8043;
+  GL_LUMINANCE6_ALPHA2                  = $8044;
+  GL_LUMINANCE8_ALPHA8                  = $8045;
+  GL_LUMINANCE12_ALPHA4                 = $8046;
+  GL_LUMINANCE12_ALPHA12                = $8047;
+  GL_LUMINANCE16_ALPHA16                = $8048;
+  GL_INTENSITY                          = $8049;
+  GL_INTENSITY4                         = $804A;
+  GL_INTENSITY8                         = $804B;
+  GL_INTENSITY12                        = $804C;
+  GL_INTENSITY16                        = $804D;
+  GL_R3_G3_B2                           = $2A10;
+  GL_RGB4                               = $804F;
+  GL_RGB5                               = $8050;
+  GL_RGB8                               = $8051;
+  GL_RGB10                              = $8052;
+  GL_RGB12                              = $8053;
+  GL_RGB16                              = $8054;
+  GL_RGBA2                              = $8055;
+  GL_RGBA4                              = $8056;
+  GL_RGB5_A1                            = $8057;
+  GL_RGBA8                              = $8058;
+  GL_RGB10_A2                           = $8059;
+  GL_RGBA12                             = $805A;
+  GL_RGBA16                             = $805B;
+
+%END
+
+
+#=====================================================================
+# Procedures and functions
+#=====================================================================
+
+%PROCS
+
+// Miscellaneous
+glEnableClientState: procedure(cap: GLenum);
+glDisableClientState: procedure(cap: GLenum);
+glPushClientAttrib: procedure(mask: GLbitfield);
+glPopClientAttrib: procedure;
+
+// Drawing Functions
+glIndexub: procedure(c: Byte);
+glIndexubv: procedure(var c: Byte);
+
+// Vertex Arrays
+glVertexPointer: procedure(size: LongInt; AType: GLenum; stride: LongInt; var ptr);
+glNormalPointer: procedure(AType: GLenum; stride: LongInt; var ptr);
+glColorPointer: procedure(size: LongInt; AType: GLenum; stride: LongInt; var ptr);
+glIndexPointer: procedure(AType: GLenum; stride: LongInt; var ptr);
+glTexCoordPointer: procedure(size: LongInt; AType: GLenum; stride: LongInt; var ptr);
+glEdgeFlagPointer: procedure(stride: LongInt; var ptr);
+glGetPointerv: procedure(pname: GLenum; var params: Pointer);
+glArrayElement: procedure(i: LongInt);
+glDrawArrays: procedure(mode: GLenum; first, count: LongInt);
+glDrawElements: procedure(mode: GLenum; count: Integer; AType: GLenum; var indices);
+glInterleavedArrays: procedure(format: GLenum; stride: LongInt; var pointer);
+
+// Texture Mapping
+glGenTextures: procedure(n: LongInt; var textures: LongWord);
+glDeleteTextures: procedure(n: LongInt; var textures: LongWord);
+glBindTexture: procedure(target: GLenum; texture: LongWord);
+glPrioritizeTextures: procedure(n: LongInt; var textures: LongWord; var priorities: GLclampf);
+glAreTexturesResident: function(n: LongInt; var textures: LongWord; var residences: Boolean): Boolean;
+glIsTexture: function(texture: LongWord): Boolean;
+glTexSubImage1D: procedure(target: GLenum; level, xoffset, width: LongInt; format, AType: GLenum; var pixels);
+glTexSubImage2D: procedure(target: GLenum; level, xoffset, yoffset, width, height: LongInt; format, AType: GLenum; var pixels);
+glCopyTexImage1D: procedure(target: GLenum; level: LongInt; format: GLenum; x, y, width, border: LongInt);
+glCopyTexImage2D: procedure(target: GLenum; level: LongInt; format: GLenum; x, y, width, height, border: LongInt);
+glCopyTexSubImage1D: procedure(target: GLenum; level, xoffset, x, y, width: LongInt);
+glCopyTexSubImage2D: procedure(target: GLenum; level, xoffset, yoffset, x, y, width, height: LongInt);
+
+%END

+ 58 - 0
packages/opengl/build/gl12.def

@@ -0,0 +1,58 @@
+# This is the definition file for all GL 1.2 stuff
+
+%COPY_INTERFACE
+
+const
+  // GL 1.2 texturing
+  GL_PACK_SKIP_IMAGES                   = $806B;
+  GL_PACK_IMAGE_HEIGHT                  = $806C;
+  GL_UNPACK_SKIP_IMAGES                 = $806D;
+  GL_UNPACK_IMAGE_HEIGHT                = $806E;
+  GL_TEXTURE_3D                         = $806F;
+  GL_PROXY_TEXTURE_3D                   = $8070;
+  GL_TEXTURE_DEPTH                      = $8071;
+  GL_TEXTURE_WRAP_R                     = $8072;
+  GL_MAX_3D_TEXTURE_SIZE                = $8073;
+  GL_TEXTURE_BINDING_3D                 = $806A;
+
+const
+  GL_RESCALE_NORMAL                     = $803A;
+  GL_CLAMP_TO_EDGE                      = $812F;
+  GL_MAX_ELEMENTS_VERTICES              = $F0E8;
+  GL_MAX_ELEMENTS_INDICES               = $F0E9;
+  GL_BGR                                = $80E0;
+  GL_BGRA                               = $80E1;
+  GL_UNSIGNED_BYTE_3_3_2                = $8032;
+  GL_UNSIGNED_BYTE_2_3_3_REV            = $8362;
+  GL_UNSIGNED_SHORT_5_6_5               = $8363;
+  GL_UNSIGNED_SHORT_5_6_5_REV           = $8364;
+  GL_UNSIGNED_SHORT_4_4_4_4             = $8033;
+  GL_UNSIGNED_SHORT_4_4_4_4_REV         = $8365;
+  GL_UNSIGNED_SHORT_5_5_5_1             = $8034;
+  GL_UNSIGNED_SHORT_1_5_5_5_REV         = $8366;
+  GL_UNSIGNED_INT_8_8_8_8               = $8035;
+  GL_UNSIGNED_INT_8_8_8_8_REV           = $8367;
+  GL_UNSIGNED_INT_10_10_10_2            = $8036;
+  GL_UNSIGNED_INT_2_10_10_10_REV        = $8368;
+  GL_LIGHT_MODEL_COLOR_CONTROL          = $81F8;
+  GL_SINGLE_COLOR                       = $81F9;
+  GL_SEPARATE_SPECULAR_COLOR            = $81FA;
+  GL_TEXTURE_MIN_LOD                    = $813A;
+  GL_TEXTURE_MAX_LOD                    = $813B;
+  GL_TEXTURE_BASE_LEVEL                 = $813C;
+  GL_TEXTURE_MAX_LEVEL                  = $813D;
+
+%END
+
+
+#=====================================================================
+# Procedures and functions
+#=====================================================================
+
+%PROCS
+glDrawRangeElements: procedure(mode: GLenum; AStart, AEnd: LongWord; count: LongInt; AType: GLenum; var indices);
+glTexImage3D: procedure(target: GLenum; level: LongInt; internalFormat: GLenum; width, height, depth, border: LongInt; format, AType: GLEnum; var pixels);
+glTexSubImage3D: procedure(target: GLenum; level: LongInt; xoffset, yoffset, zoffset, width, height, depth: LongInt; format, AType: GLEnum; var pixels);
+glCopyTexSubImage3D: procedure(target: GLenum; level: LongInt; xoffset, yoffset, zoffset, x, y, width, height: LongInt);
+%END
+

+ 310 - 0
packages/opengl/build/gl_linux.tem

@@ -0,0 +1,310 @@
+{
+  $Id$
+
+  Translation of the Mesa GL headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GL;
+
+interface
+
+{$DEFINE GL1_0}
+{$DEFINE GL1_1}
+{$DEFINE GL1_2}
+{$DEFINE MESA}                 {enable if you want to use some special mesa extensions}
+{$DEFINE EXTENSIONS}           {enable if you need one/all of extensions}
+{$DEFINE SGI_EXTENSIONS}       {enable if you need one/all of extensions}
+
+{$MACRO ON}
+
+{$IFDEF Linux}
+  {$LINKLIB c}
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+function InitGLFromLibrary(libname: PChar): Boolean;
+
+// determines automatically which libraries to use:
+function InitGL: Boolean;
+
+
+var
+  GLDumpUnresolvedFunctions,
+  GLInitialized: Boolean;
+
+
+// =======================================================
+//   GL consts, types and functions
+// =======================================================
+
+
+// -------------------------------------------------------
+//   GL types
+// -------------------------------------------------------
+
+type
+  PSingle   = ^Single;
+  PDouble   = ^Double;
+
+  GLvoid    = Pointer;
+  GLboolean = Byte;
+
+  GLbyte    = ShortInt; // 1-byte signed
+  GLshort   = Integer;  // 2-byte signed
+  GLint     = LongInt;  // 4-byte signed
+
+  GLubyte   = Byte;     // 1-byte unsigned
+  GLushort  = Word;     // 2-byte unsigned
+  GLuint    = DWord;    // 4-byte signed
+
+  GLsizei   = LongInt;  // 4-byte signed
+
+  GLfloat   = Single;   // single precision float
+  GLclampf  = Single;   // single precision float in [0,1]
+  GLdouble  = Double;   // double precision float
+  GLclampd  = Double;   // double precision float in [0,1]
+
+  GLenum    = DWord;
+
+  PGLBoolean = ^GLBoolean;
+  PGLFloat   = ^GLfloat;
+  PGLDouble  = ^GLDouble;
+
+type
+  GLbitfield = DWord;  { was an enum - no corresponding thing in pascal }
+const
+  GL_CURRENT_BIT        = $00000001;
+  GL_POINT_BIT          = $00000002;
+  GL_LINE_BIT           = $00000004;
+  GL_POLYGON_BIT        = $00000008;
+  GL_POLYGON_STIPPLE_BIT= $00000010;
+  GL_PIXEL_MODE_BIT     = $00000020;
+  GL_LIGHTING_BIT       = $00000040;
+  GL_FOG_BIT            = $00000080;
+  GL_DEPTH_BUFFER_BIT   = $00000100;
+  GL_ACCUM_BUFFER_BIT   = $00000200;
+  GL_STENCIL_BUFFER_BIT = $00000400;
+  GL_VIEWPORT_BIT       = $00000800;
+  GL_TRANSFORM_BIT      = $00001000;
+  GL_ENABLE_BIT         = $00002000;
+  GL_COLOR_BUFFER_BIT   = $00004000;
+  GL_HINT_BIT           = $00008000;
+  GL_EVAL_BIT           = $00010000;
+  GL_LIST_BIT           = $00020000;
+  GL_TEXTURE_BIT        = $00040000;
+  GL_SCISSOR_BIT        = $00080000;
+  GL_ALL_ATTRIB_BITS    = $000fffff;
+
+
+// -------------------------------------------------------
+//   GL constants
+// -------------------------------------------------------
+
+{$IFDEF GL1_0}
+%GLDeclsIF10
+{$ENDIF GL1_0}
+
+{$IFDEF GL1_1}
+%GLDeclsIF11
+{$ENDIF GL1_1}
+
+{$IFDEF GL1_2}
+%GLDeclsIF12
+{$ENDIF GL1_2}
+
+const
+  // Utility
+  GL_VENDOR                             = $1F00;
+  GL_RENDERER                           = $1F01;
+  GL_VERSION                            = $1F02;
+  GL_EXTENSIONS                         = $1F03;
+
+  // Errors
+  GL_INVALID_VALUE                      = $0501;
+  GL_INVALID_ENUM                       = $0500;
+  GL_INVALID_OPERATION                  = $0502;
+  GL_STACK_OVERFLOW                     = $0503;
+  GL_STACK_UNDERFLOW                    = $0504;
+  GL_OUT_OF_MEMORY                      = $0505;
+
+
+// -------------------------------------------------------
+//   GL extensions constants
+// -------------------------------------------------------
+
+{$IFDEF EXTENSIONS}
+%GLDeclsIF10Ext
+{$ENDIF EXTENSIONS}
+
+{$IFDEF SGI_EXTENSIONS}
+%GLDeclsIF10SGI
+{$ENDIF SGI_EXTENSIONS}
+
+{$IFDEF MESA}
+%GLDeclsIF10Mesa
+{$ENDIF MESA}
+
+
+// -------------------------------------------------------
+//   GL procedures and functions
+// -------------------------------------------------------
+
+{$IFDEF GL1_0}
+var
+%GLProcsPD10
+{$ENDIF GL1_0}
+
+{$IFDEF GL1_1}
+var
+%GLProcsPD11
+{$ENDIF GL1_1}
+
+{$IFDEF GL1_2}
+var
+%GLProcsPD12
+{$ENDIF GL1_2}
+
+
+// -------------------------------------------------------
+//   GL Extensions
+// -------------------------------------------------------
+
+{$IFDEF EXTENSIONS}
+var
+%GLProcsPD10Ext
+{$ENDIF EXTENSIONS}
+
+// library dependent extensions
+
+{$IFDEF SGI_EXTENSIONS}
+var
+%GLProcsPD10SGI
+{$ENDIF SGI_EXTENSIONS}
+
+{$ifdef MESA}
+var
+%GLProcsPD10Mesa
+{$endif MESA}
+
+
+// =======================================================
+// =======================================================
+
+implementation
+
+
+{$LINKLIB m}
+
+function dlopen(AFile: PChar; mode: LongInt): Pointer; external 'dl';
+function dlclose(handle: Pointer): LongInt; external 'dl';
+function dlsym(handle: Pointer; name: PChar): Pointer; external 'dl';
+
+function LoadLibrary(name: PChar): Pointer;
+begin
+  Result := dlopen(name, $101 {RTLD_GLOBAL or RTLD_LAZY});
+end;
+
+function GetProc(handle: Pointer; name: PChar): Pointer;
+begin
+  Result := dlsym(handle, name);
+  if (Result = nil) and  GLDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+var
+  libGL : Pointer;
+
+function InitGLFromLibrary(libname: PChar): Boolean;
+begin
+  Result := False;
+  libGL := LoadLibrary(libname);
+  if not Assigned(libGL) then exit;
+
+{$ifdef GL1_0}
+%GLProcsPL10
+{$endif GL1_0}
+
+{$ifdef GL1_1}
+%GLProcsPL11
+{$endif GL1_1}
+
+{$ifdef GL1_2}
+%GLProcsPL12
+{$endif GL1_2}
+
+{$ifdef EXTENSIONS}
+%GLProcsPL10Ext
+{$endif EXTENSIONS}
+
+{$ifdef SGI_EXTENSIONS}
+%GLProcsPL10SGI
+{$endif SGI_EXTENSIONS}
+
+{$ifdef MESA}
+%GLProcsPL10Mesa
+{$endif MESA}
+
+  GLInitialized := True;
+  Result := True;
+end;
+
+function InitGL: Boolean;
+begin
+  Result := InitGLFromLibrary('libGL.so') or
+            InitGLFromLibrary('libGL.so.1') or
+            InitGLFromLibrary('libMesaGL.so') or
+            InitGLFromLibrary('libMesaGL.so.3');
+end;
+
+initialization
+  InitGL;
+finalization
+  if Assigned(libGL)  then dlclose(libGL);
+end.
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:17  michael
+  + Initial import
+
+  Revision 1.2  2000/05/31 00:34:28  alex
+  made templates work
+
+}

+ 303 - 0
packages/opengl/build/gl_w32d.tem

@@ -0,0 +1,303 @@
+{
+  $Id$
+
+  Translation of the Mesa GL headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GL;
+
+interface
+
+{$DEFINE GL1_0}
+{x$DEFINE GL1_1}
+{x$DEFINE GL1_2}
+{x$DEFINE MESA}                 {enable if you want to use some special mesa extensions}
+{x$DEFINE EXTENSIONS}           {enable if you need one/all of extensions}
+{x$DEFINE SGI_EXTENSIONS}       {enable if you need one/all of extensions}
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE ogl_dll := }
+  uses Windows;
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+function InitGLFromLibrary(libname: PChar): Boolean;
+
+// determines automatically which libraries to use:
+function InitGL: Boolean;
+
+
+var
+  GLDumpUnresolvedFunctions,
+  GLInitialized: Boolean;
+
+
+// =======================================================
+//   GL consts, types and functions
+// =======================================================
+
+
+// -------------------------------------------------------
+//   GL types
+// -------------------------------------------------------
+
+type
+  PSingle   = ^Single;
+  PDouble   = ^Double;
+
+  GLvoid    = Pointer;
+  GLboolean = Byte;
+
+  GLbyte    = ShortInt; // 1-byte signed
+  GLshort   = Integer;  // 2-byte signed
+  GLint     = LongInt;  // 4-byte signed
+
+  GLubyte   = Byte;     // 1-byte unsigned
+  GLushort  = Word;     // 2-byte unsigned
+  GLuint    = DWord;    // 4-byte signed
+
+  GLsizei   = LongInt;  // 4-byte signed
+
+  GLfloat   = Single;   // single precision float
+  GLclampf  = Single;   // single precision float in [0,1]
+  GLdouble  = Double;   // double precision float
+  GLclampd  = Double;   // double precision float in [0,1]
+
+  GLenum    = DWord;
+
+  PGLBoolean = ^GLBoolean;
+  PGLFloat   = ^GLfloat;
+  PGLDouble  = ^GLDouble;
+
+type
+  GLbitfield = DWord;  { was an enum - no corresponding thing in pascal }
+const
+  GL_CURRENT_BIT        = $00000001;
+  GL_POINT_BIT          = $00000002;
+  GL_LINE_BIT           = $00000004;
+  GL_POLYGON_BIT        = $00000008;
+  GL_POLYGON_STIPPLE_BIT= $00000010;
+  GL_PIXEL_MODE_BIT     = $00000020;
+  GL_LIGHTING_BIT       = $00000040;
+  GL_FOG_BIT            = $00000080;
+  GL_DEPTH_BUFFER_BIT   = $00000100;
+  GL_ACCUM_BUFFER_BIT   = $00000200;
+  GL_STENCIL_BUFFER_BIT = $00000400;
+  GL_VIEWPORT_BIT       = $00000800;
+  GL_TRANSFORM_BIT      = $00001000;
+  GL_ENABLE_BIT         = $00002000;
+  GL_COLOR_BUFFER_BIT   = $00004000;
+  GL_HINT_BIT           = $00008000;
+  GL_EVAL_BIT           = $00010000;
+  GL_LIST_BIT           = $00020000;
+  GL_TEXTURE_BIT        = $00040000;
+  GL_SCISSOR_BIT        = $00080000;
+  GL_ALL_ATTRIB_BITS    = $000fffff;
+
+
+// -------------------------------------------------------
+//   GL constants
+// -------------------------------------------------------
+
+{$IFDEF GL1_0}
+%GLDeclsIF10
+{$ENDIF GL1_0}
+
+{$IFDEF GL1_1}
+%GLDeclsIF11
+{$ENDIF GL1_1}
+
+{$IFDEF GL1_2}
+%GLDeclsIF12
+{$ENDIF GL1_2}
+
+const
+  // Utility
+  GL_VENDOR                             = $1F00;
+  GL_RENDERER                           = $1F01;
+  GL_VERSION                            = $1F02;
+  GL_EXTENSIONS                         = $1F03;
+
+  // Errors
+  GL_INVALID_VALUE                      = $0501;
+  GL_INVALID_ENUM                       = $0500;
+  GL_INVALID_OPERATION                  = $0502;
+  GL_STACK_OVERFLOW                     = $0503;
+  GL_STACK_UNDERFLOW                    = $0504;
+  GL_OUT_OF_MEMORY                      = $0505;
+
+
+// -------------------------------------------------------
+//   GL extensions constants
+// -------------------------------------------------------
+
+{$IFDEF EXTENSIONS}
+%GLDeclsIF10Ext
+{$ENDIF EXTENSIONS}
+
+{$IFDEF SGI_EXTENSIONS}
+%GLDeclsIF10SGI
+{$ENDIF SGI_EXTENSIONS}
+
+{$IFDEF MESA}
+%GLDeclsIF10Mesa
+{$ENDIF MESA}
+
+
+// -------------------------------------------------------
+//   GL procedures and functions
+// -------------------------------------------------------
+
+{$IFDEF GL1_0}
+var
+%GLProcsPD10
+{$ENDIF GL1_0}
+
+{$IFDEF GL1_1}
+var
+%GLProcsPD11
+{$ENDIF GL1_1}
+
+{$IFDEF GL1_2}
+var
+%GLProcsPD12
+{$ENDIF GL1_2}
+
+
+// -------------------------------------------------------
+//   GL Extensions
+// -------------------------------------------------------
+
+{$IFDEF EXTENSIONS}
+var
+%GLProcsPD10Ext
+{$ENDIF EXTENSIONS}
+
+// library dependent extensions
+
+{$IFDEF SGI_EXTENSIONS}
+var
+%GLProcsPD10SGI
+{$ENDIF SGI_EXTENSIONS}
+
+{$ifdef MESA}
+var
+%GLProcsPD10Mesa
+{$endif MESA}
+
+
+// =======================================================
+// =======================================================
+
+implementation
+
+type
+  HInstance = LongWord;
+
+var
+  libGL : HInstance;
+
+function GetProc(handle: HInstance; name: PChar): Pointer;
+begin
+  Result := GetProcAddress(handle, name);
+  if (Result = nil) and GLUDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+function InitGLFromLibrary(libname: PChar): Boolean;
+begin
+  Result := False;
+  libGL := LoadLibrary(libname);
+  if libGL = 0 then exit;
+
+{$ifdef GL1_0}
+%GLProcsPL10
+{$endif GL1_0}
+
+{$ifdef GL1_1}
+%GLProcsPL11
+{$endif GL1_1}
+
+{$ifdef GL1_2}
+%GLProcsPL12
+{$endif GL1_2}
+
+{$ifdef EXTENSIONS}
+%GLProcsPL10Ext
+{$endif EXTENSIONS}
+
+{$ifdef SGI_EXTENSIONS}
+%GLProcsPL10SGI
+{$endif SGI_EXTENSIONS}
+
+{$ifdef MESA}
+%GLProcsPL10Mesa
+{$endif MESA}
+
+  GLInitialized := True;
+  Result := True;
+end;
+
+
+function InitGL: Boolean;
+begin
+  Result := InitGLFromLibrary('opengl32.dll');
+end;
+
+
+initialization
+  InitGL;
+finalization
+  if libGL <> 0 then FreeLibrary(libGL);
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:17  michael
+  + Initial import
+
+  Revision 1.2  2000/05/31 00:34:28  alex
+  made templates work
+
+}

+ 227 - 0
packages/opengl/build/gl_w32s.tem

@@ -0,0 +1,227 @@
+{
+  Translation of the Mesa GL headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+  Template for static linking in Win32 environment by Alexander Stohr.
+
+  Original copyright notice:
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{
+  You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+  This is necessary for supporting different platforms with different calling
+  conventions via a single unit.
+}
+
+unit GL_SL;
+
+
+interface
+
+{$DEFINE GL1_0}
+{x$DEFINE GL1_1}
+{x$DEFINE GL1_2}
+{x$DEFINE MESA}                 {enable if you want to use some special mesa extensions}
+{x$DEFINE EXTENSIONS}           {enable if you need one/all of extensions}
+{x$DEFINE SGI_EXTENSIONS}       {enable if you need one/all of extensions}
+
+{
+  *** Note: ***
+  There is currently one importants side effect when doing static linking.
+
+  If you include a function statically than its required to be present
+  in the supplied DLLs of your OS and Hardware.
+  This means if the DLL is not present your program will not run.
+  In Win95 it appears that you will be informined you about
+  the name of the first missing symbol while loading the executable.
+}
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE ogl_dll := external 'opengl32.dll'}
+  uses Windows;
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+// none - no special init required
+
+
+// =======================================================
+//   GL consts, types and functions
+// =======================================================
+
+
+// -------------------------------------------------------
+//   GL types
+// -------------------------------------------------------
+
+type
+  PSingle   = ^Single;
+  PDouble   = ^Double;
+
+  GLvoid    = Pointer;
+  GLboolean = Byte;
+
+  GLbyte    = ShortInt; // 1-byte signed
+  GLshort   = Integer;  // 2-byte signed
+  GLint     = LongInt;  // 4-byte signed
+
+  GLubyte   = Byte;     // 1-byte unsigned
+  GLushort  = Word;     // 2-byte unsigned
+  GLuint    = DWord;    // 4-byte signed
+
+  GLsizei   = LongInt;  // 4-byte signed
+
+  GLfloat   = Single;   // single precision float
+  GLclampf  = Single;   // single precision float in [0,1]
+  GLdouble  = Double;   // double precision float
+  GLclampd  = Double;   // double precision float in [0,1]
+
+  GLenum    = DWord;
+
+  PGLBoolean = ^GLBoolean;
+  PGLFloat   = ^GLfloat;
+  PGLDouble  = ^GLDouble;
+
+type
+  GLbitfield = DWord;  { was an enum - no corresponding thing in pascal }
+const
+  GL_CURRENT_BIT        = $00000001;
+  GL_POINT_BIT          = $00000002;
+  GL_LINE_BIT           = $00000004;
+  GL_POLYGON_BIT        = $00000008;
+  GL_POLYGON_STIPPLE_BIT= $00000010;
+  GL_PIXEL_MODE_BIT     = $00000020;
+  GL_LIGHTING_BIT       = $00000040;
+  GL_FOG_BIT            = $00000080;
+  GL_DEPTH_BUFFER_BIT   = $00000100;
+  GL_ACCUM_BUFFER_BIT   = $00000200;
+  GL_STENCIL_BUFFER_BIT = $00000400;
+  GL_VIEWPORT_BIT       = $00000800;
+  GL_TRANSFORM_BIT      = $00001000;
+  GL_ENABLE_BIT         = $00002000;
+  GL_COLOR_BUFFER_BIT   = $00004000;
+  GL_HINT_BIT           = $00008000;
+  GL_EVAL_BIT           = $00010000;
+  GL_LIST_BIT           = $00020000;
+  GL_TEXTURE_BIT        = $00040000;
+  GL_SCISSOR_BIT        = $00080000;
+  GL_ALL_ATTRIB_BITS    = $000fffff;
+
+
+// -------------------------------------------------------
+//   GL constants
+// -------------------------------------------------------
+
+{$IFDEF GL1_0}
+%GLDeclsIF10
+{$ENDIF GL1_0}
+
+{$IFDEF GL1_1}
+%GLDeclsIF11
+{$ENDIF GL1_1}
+
+{$IFDEF GL1_2}
+%GLDeclsIF12
+{$ENDIF GL1_2}
+
+const
+  // Utility
+  GL_VENDOR                             = $1F00;
+  GL_RENDERER                           = $1F01;
+  GL_VERSION                            = $1F02;
+  GL_EXTENSIONS                         = $1F03;
+
+  // Errors
+  GL_INVALID_VALUE                      = $0501;
+  GL_INVALID_ENUM                       = $0500;
+  GL_INVALID_OPERATION                  = $0502;
+  GL_STACK_OVERFLOW                     = $0503;
+  GL_STACK_UNDERFLOW                    = $0504;
+  GL_OUT_OF_MEMORY                      = $0505;
+
+
+// -------------------------------------------------------
+//   GL extensions constants
+// -------------------------------------------------------
+
+{$IFDEF EXTENSIONS}
+%GLDeclsIF10Ext
+{$ENDIF EXTENSIONS}
+
+{$IFDEF SGI_EXTENSIONS}
+%GLDeclsIF10SGI
+{$ENDIF SGI_EXTENSIONS}
+
+{$IFDEF MESA}
+%GLDeclsIF10Mesa
+{$ENDIF MESA}
+
+
+// -------------------------------------------------------
+//   GL procedures and functions
+// -------------------------------------------------------
+
+{$IFDEF GL1_0}
+%GLProcsPS10
+{$ENDIF GL1_0}
+
+{$IFDEF GL1_1}
+%GLProcsPS11
+{$ENDIF GL1_1}
+
+{$IFDEF GL1_2}
+%GLProcsPS12
+{$ENDIF GL1_2}
+
+
+// -------------------------------------------------------
+//   GL Extensions
+// -------------------------------------------------------
+
+{$IFDEF EXTENSIONS}
+%GLProcsPS10Ext
+{$ENDIF EXTENSIONS}
+
+// library dependent extensions
+
+{$IFDEF SGI_EXTENSIONS}
+%GLProcsPS10SGI
+{$ENDIF SGI_EXTENSIONS}
+
+{$ifdef MESA}
+%GLProcsPS10Mesa
+{$endif MESA}
+
+
+// =======================================================
+// =======================================================
+
+implementation
+
+{BEGIN}{OF INIT}
+END.

+ 12 - 0
packages/opengl/build/glaux.def

@@ -0,0 +1,12 @@
+# This is the definition file for all GLAUX stuff
+
+%COPY_INTERFACE
+%END
+
+
+#=====================================================================
+# Procedures and functions
+#=====================================================================
+
+%PROCS
+%END

+ 504 - 0
packages/opengl/build/glaux_w32d.tem

@@ -0,0 +1,504 @@
+{
+  $Id$
+
+  Translation of the GLaux headers for FreePascal
+  Version for static linking in Win32 environment by Alexander Stohr.
+  Latest change: 1999-11-13
+
+  Further information:
+
+  GLaux is an outdated toolkit from SGI and later used by Microsoft.
+}
+{*++ BUILD Version: 0004    // Increment this if a change has global effects
+
+Copyright (c) 1985-95, Microsoft Corporation
+
+Module Name:
+
+    glaux.h
+
+Abstract:
+
+    Procedure declarations, constant definitions and macros for the OpenGL
+    Auxiliary Library.
+
+--*}
+{*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ *}
+
+{$MODE delphi}
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+{$define WINNT}
+{$define GLauximp}
+{x$define UNICODE}
+
+unit GLaux; { version which does statically linking }
+
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glaux_dll := external 'Glauximp.dll'}
+  {$DEFINE glaux_callback := cdecl}
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+USES
+  windows,
+  GL;
+{
+#include <windows.h>
+#include <GL/glu.h>
+}
+
+TYPE
+  LPCSTR  = Pointer;   { pointer on a zero terminated string }
+  LPCWSTR = Pointer;   { pointer on a zero terminated unicode string }
+
+{*
+** ToolKit Window Types
+** In the future, AUX_RGBA may be a combination of both RGB and ALPHA
+*}
+
+const
+    AUX_RGB             = 0;
+    AUX_RGBA            = AUX_RGB;
+    AUX_INDEX           = 1;
+    AUX_SINGLE          = 0;
+    AUX_DOUBLE          = 2;
+    AUX_DIRECT          = 0;
+    AUX_INDIRECT        = 4;
+
+    AUX_ACCUM           = 8;
+    AUX_ALPHA           = 16;
+    AUX_DEPTH24         = 32;      {* 24-bit depth buffer *}
+    AUX_STENCIL         = 64;
+    AUX_AUX             = 128;
+    AUX_DEPTH16         = 256;     {* 16-bit depth buffer *}
+    AUX_FIXED_332_PAL   = 512;
+    AUX_DEPTH           = AUX_DEPTH16; {* default is 16-bit depth buffer *}
+
+{*
+** Window Masks
+*}
+
+{ These have been macros and were converted to boolean funtions }
+FUNCTION AUX_WIND_IS_RGB            (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_INDEX          (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_SINGLE         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_DOUBLE         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_INDIRECT       (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_DIRECT         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_ACCUM         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_ALPHA         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_DEPTH         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_STENCIL       (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_USES_FIXED_332_PAL(x : DWORD) : BOOLEAN;
+
+{*
+** ToolKit Event Structure
+*}
+type
+    AUX_EVENTREC = RECORD
+    {BEGIN}
+        event : GLint;
+        data  : ARRAY[0..3] OF GLint;
+    END;
+
+{*
+** ToolKit Event Types
+*}
+CONST
+    AUX_EXPOSE      = 1;
+    AUX_CONFIG      = 2;
+    AUX_DRAW        = 4;
+    AUX_KEYEVENT    = 8;
+    AUX_MOUSEDOWN   = 16;
+    AUX_MOUSEUP     = 32;
+    AUX_MOUSELOC    = 64;
+
+{*
+** Toolkit Event Data Indices
+*}
+    AUX_WINDOWX             = 0;
+    AUX_WINDOWY             = 1;
+    AUX_MOUSEX              = 0;
+    AUX_MOUSEY              = 1;
+    AUX_MOUSESTATUS         = 3;
+    AUX_KEY                 = 0;
+    AUX_KEYSTATUS           = 1;
+
+{*
+** ToolKit Event Status Messages
+*}
+    AUX_LEFTBUTTON          = 1;
+    AUX_RIGHTBUTTON         = 2;
+    AUX_MIDDLEBUTTON        = 4;
+    AUX_SHIFT               = 1;
+    AUX_CONTROL             = 2;
+
+{*
+** ToolKit Key Codes
+*}
+    AUX_RETURN              = #$0D;
+    AUX_ESCAPE              = #$1B;
+    AUX_SPACE               = #$20;
+    AUX_LEFT                = #$25;
+    AUX_UP                  = #$26;
+    AUX_RIGHT               = #$27;
+    AUX_DOWN                = #$28;
+    AUX_A                   = 'A';
+    AUX_B                   = 'B';
+    AUX_C                   = 'C';
+    AUX_D                   = 'D';
+    AUX_E                   = 'E';
+    AUX_F                   = 'F';
+    AUX_G                   = 'G';
+    AUX_H                   = 'H';
+    AUX_I                   = 'I';
+    AUX_J                   = 'J';
+    AUX_K                   = 'K';
+    AUX_L                   = 'L';
+    AUX_M                   = 'M';
+    AUX_N                   = 'N';
+    AUX_O                   = 'O';
+    AUX_P                   = 'P';
+    AUX_Q                   = 'Q';
+    AUX_R                   = 'R';
+    AUX_S                   = 'S';
+    AUX_T                   = 'T';
+    AUX_U                   = 'U';
+    AUX_V                   = 'V';
+    AUX_W                   = 'W';
+    AUX_X                   = 'X';
+    AUX_Y                   = 'Y';
+    AUX_Z                   = 'Z';
+    AUX_a_                  = 'a';
+    AUX_b_                  = 'b';
+    AUX_c_                  = 'c';
+    AUX_d_                  = 'd';
+    AUX_e_                  = 'e';
+    AUX_f_                  = 'f';
+    AUX_g_                  = 'g';
+    AUX_h_                  = 'h';
+    AUX_i_                  = 'i';
+    AUX_j_                  = 'j';
+    AUX_k_                  = 'k';
+    AUX_l_                  = 'l';
+    AUX_m_                  = 'm';
+    AUX_n_                  = 'n';
+    AUX_o_                  = 'o';
+    AUX_p_                  = 'p';
+    AUX_q_                  = 'q';
+    AUX_r_                  = 'r';
+    AUX_s_                  = 's';
+    AUX_t_                  = 't';
+    AUX_u_                  = 'u';
+    AUX_v_                  = 'v';
+    AUX_w_                  = 'w';
+    AUX_x_                  = 'x';
+    AUX_y_                  = 'y';
+    AUX_z_                  = 'z';
+    AUX_0                   = '0';
+    AUX_1                   = '1';
+    AUX_2                   = '2';
+    AUX_3                   = '3';
+    AUX_4                   = '4';
+    AUX_5                   = '5';
+    AUX_6                   = '6';
+    AUX_7                   = '7';
+    AUX_8                   = '8';
+    AUX_9                   = '9';
+
+{*
+** ToolKit Gets and Sets
+*}
+    AUX_FD                  = 1;  {* return fd (long) *}
+    AUX_COLORMAP            = 3;  {* pass buf of r, g and b (unsigned char) *}
+    AUX_GREYSCALEMAP        = 4;
+    AUX_FOGMAP              = 5;  {* pass fog and color bits (long) *}
+    AUX_ONECOLOR            = 6;  {* pass index, r, g, and b (long) *}
+
+{*
+** Color Macros
+*}
+
+    AUX_BLACK               = 0;
+    AUX_RED                 = 13;
+    AUX_GREEN               = 14;
+    AUX_YELLOW              = 15;
+    AUX_BLUE                = 16;
+    AUX_MAGENTA             = 17;
+    AUX_CYAN                = 18;
+    AUX_WHITE               = 19;
+
+{ this was a macro and is now a procedure }
+{ PROCEDURE AUX_SETCOLOR(x, y); - TODO }
+
+{*
+** RGB Image Structure
+*}
+
+type
+    AUX_RGBImageRec = RECORD
+    {BEGIN}
+        sizeX, sizeY : GLint;
+        data : ^BYTE;
+    END;
+    pAUX_RGBImageRec = ^AUX_RGBImageRec;
+
+{*
+** Prototypes
+*}
+
+Procedure auxInitDisplayMode(mode:GLenum); glaux_dll;
+Procedure auxInitPosition(x,y,w,h:Integer); glaux_dll;
+
+{$ifndef WINNT}
+FUNCTION  auxInitWindow(name:LPCSTR)  : GLenum; glaux_dll;
+{$else}
+{$ifdef UNICODE }
+FUNCTION  auxInitWindow (name:LPCWSTR) : GLenum; glaux_dll name 'auxInitWindowW';
+{$else}
+FUNCTION  auxInitWindow (name:LPCSTR)  : GLenum; glaux_dll name 'auxInitWindowA';
+{$endif}
+FUNCTION  auxInitWindowA(name:LPCSTR)  : GLenum; glaux_dll;
+FUNCTION  auxInitWindowW(name:LPCWSTR) : GLenum; glaux_dll;
+{$endif}
+
+PROCEDURE auxCloseWindow; glaux_dll;
+PROCEDURE auxQuit;        glaux_dll;
+PROCEDURE auxSwapBuffers; glaux_dll;
+
+{ callbacks }
+type
+  TAUXMAINPROC    = PROCEDURE;                           glaux_callback;
+  TAUXEXPOSEPROC  = PROCEDURE(w, h : integer);           glaux_callback;
+  TAUXRESHAPEPROC = PROCEDURE(w, h : GLsizei);           glaux_callback;
+  TAUXIDLEPROC    = PROCEDURE;                           glaux_callback;
+  TAUXKEYPROC     = PROCEDURE;                           glaux_callback;
+  TAUXMOUSEPROC   = PROCEDURE(VAR event : AUX_EVENTREC); glaux_callback;
+
+{ callback setup routines }
+PROCEDURE auxMainLoop   (func : TAUXMAINPROC); glaux_dll;
+PROCEDURE auxExposeFunc (func : TAUXEXPOSEPROC); glaux_dll;
+PROCEDURE auxReshapeFunc(func : TAUXRESHAPEPROC); glaux_dll;
+PROCEDURE auxIdleFunc   (func : TAUXIDLEPROC); glaux_dll;
+PROCEDURE auxKeyFunc    (val : integer; func : TAUXKEYPROC); glaux_dll;
+PROCEDURE auxMouseFunc  (v1, v2 :integer; func : TAUXMOUSEPROC); glaux_dll;
+
+FUNCTION  auxGetColorMapSize : integer; glaux_dll;
+PROCEDURE auxGetMouseLoc(var x, y : integer); glaux_dll;
+PROCEDURE auxSetOneColor(id : integer; r, g, b : GLfloat); glaux_dll;
+PROCEDURE auxSetFogRamp(v1, v2 : integer); glaux_dll;
+PROCEDURE auxSetGreyRamp; glaux_dll;
+PROCEDURE auxSetRGBMap(id : integer; var map : GLfloat); glaux_dll;
+
+{$ifndef WINNT}
+FUNCTION auxRGBImageLoad(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+{$else}
+{$ifndef GLAUXIMP}{ not present in GLauximp.dll }
+{$ifdef UNICODE}
+FUNCTION auxRGBImageLoad (name : LPCWSTR): pAUX_RGBImageRec; glaux_dll name 'auxRGBImageLoadW';
+{$else}
+FUNCTION auxRGBImageLoad (name : LPCSTR) : pAUX_RGBImageRec; glaux_dll name 'auxRGBImageLoadA';
+{$endif}
+FUNCTION auxRGBImageLoadA(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+FUNCTION auxRGBImageLoadW(name : LPCWSTR): pAUX_RGBImageRec; glaux_dll;
+{$endif}
+{$endif}
+
+{$ifndef WINNT}
+{ this function is Windows specific! }
+FUNCTION auxDIBImageLoad(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+{$else}
+{$ifndef GLAUXIMP}{ not present in GLauximp.dll }
+{$ifdef UNICODE }
+FUNCTION auxDIBImageLoad (name : LPCWSTR): pAUX_RGBImageRec; glaux_dll name 'auxDIBImageLoadW';
+{$else}
+FUNCTION auxDIBImageLoad (name : LPCSTR) : pAUX_RGBImageRec; glaux_dll name 'auxDIBImageLoadA';
+{$endif}
+FUNCTION auxDIBImageLoadA(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+FUNCTION auxDIBImageLoadW(name : LPCWSTR): pAUX_RGBImageRec; glaux_dll;
+{$endif}
+{$endif}
+
+PROCEDURE auxCreateFont; glaux_dll;
+
+{$ifndef WINNT}
+PROCEDURE auxDrawStr (name : LPCSTR);  glaux_dll;
+{$else}
+{$ifndef GLAUXIMP}{ not present in GLauximp.dll }
+{$ifdef UNICODE }
+PROCEDURE auxDrawStr (name : LPCWSTR); glaux_dll name 'auxDrawStrW';
+{$else}
+PROCEDURE auxDrawStr (name : LPCSTR);  glaux_dll name 'auxDrawStrA';
+{$endif}
+PROCEDURE auxDrawStrA(name : LPCSTR);  glaux_dll;
+PROCEDURE auxDrawStrW(name : LPCWSTR); glaux_dll;
+{$endif}
+{$endif}
+
+PROCEDURE auxWireSphere(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidSphere(v : GLdouble); glaux_dll;
+PROCEDURE auxWireCube(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidCube(v : GLdouble); glaux_dll;
+PROCEDURE auxWireBox(v1, v2, v3 : GLdouble); glaux_dll;
+PROCEDURE auxSolidBox(v1, v2, v3 : GLdouble); glaux_dll;
+PROCEDURE auxWireTorus(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxSolidTorus(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxWireCylinder(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxSolidCylinder(v1, v2 :  GLdouble); glaux_dll;
+PROCEDURE auxWireIcosahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidIcosahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireOctahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidOctahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireTetrahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidTetrahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireDodecahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidDodecahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireCone(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxSolidCone(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxWireTeapot(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidTeapot(v: GLdouble); glaux_dll;
+
+{*
+** Window specific functions
+** hwnd, hdc, and hglrc valid after auxInitWindow()
+*}
+FUNCTION  auxGetHWND : HWND; glaux_dll;
+FUNCTION  auxGetHDC : HDC; glaux_dll;
+FUNCTION  auxGetHGLRC : HGLRC; glaux_dll;
+
+{*
+** Viewperf support functions and constants
+*}
+{* Display Mode Selection Criteria *}
+
+CONST { was an unnamed enum }
+    AUX_USE_ID                  = 1;
+    AUX_EXACT_MATCH             = 2;
+    AUX_MINIMUM_CRITERIA        = 3;
+
+PROCEDURE auxInitDisplayModePolicy(val : GLenum); glaux_dll;
+FUNCTION  auxInitDisplayModeID(val : GLint) : GLenum; glaux_dll;
+FUNCTION  auxGetDisplayModePolicy : GLenum; glaux_dll;
+FUNCTION  auxGetDisplayModeID : GLint; glaux_dll;
+FUNCTION  auxGetDisplayMode : GLenum; glaux_dll;
+
+
+implementation
+
+{ these functions are resolved macros -
+  they should be "inline" if compile can do this }
+
+FUNCTION AUX_WIND_IS_RGB(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_RGB := ((x AND AUX_INDEX) = 0);
+END;
+
+FUNCTION AUX_WIND_IS_INDEX(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_INDEX := ((x AND AUX_INDEX) <> 0);
+END;
+
+FUNCTION AUX_WIND_IS_SINGLE(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_SINGLE := ((x AND AUX_DOUBLE) = 0);
+END;
+
+FUNCTION AUX_WIND_IS_DOUBLE(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_DOUBLE := ((x AND AUX_DOUBLE) <> 0);
+END;
+
+FUNCTION AUX_WIND_IS_INDIRECT(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_INDIRECT := ((x AND AUX_INDIRECT) <> 0);
+END;
+
+FUNCTION AUX_WIND_IS_DIRECT(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_DIRECT := ((x AND AUX_INDIRECT) = 0);
+END;
+
+FUNCTION AUX_WIND_HAS_ACCUM(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_ACCUM := ((x AND AUX_ACCUM) <> 0);
+END;
+
+FUNCTION AUX_WIND_HAS_ALPHA(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_ALPHA := ((x AND AUX_ALPHA) <> 0);
+END;
+
+FUNCTION AUX_WIND_HAS_DEPTH(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_DEPTH := ((x AND (AUX_DEPTH24 OR AUX_DEPTH16)) <> 0);
+END;
+
+FUNCTION AUX_WIND_HAS_STENCIL(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_STENCIL := ((x AND AUX_STENCIL) <> 0);
+END;
+
+FUNCTION AUX_WIND_USES_FIXED_332_PAL(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_USES_FIXED_332_PAL := ((x AND AUX_FIXED_332_PAL) <> 0);
+END;
+
+{extern float auxRGBMap[20][3];
+
+PROCEDURE AUX_SETCOLOR(x, y);
+BEGIN
+  IF (AUX_WIND_IS_RGB((x))
+  THEN glColor3fv(auxRGBMap[y])
+  ELSE glIndexf(y));
+END;
+ - TODO}
+
+
+{begin{of init}
+end.

+ 504 - 0
packages/opengl/build/glaux_w32s.tem

@@ -0,0 +1,504 @@
+{
+  $Id$
+
+  Translation of the GLaux headers for FreePascal
+  Version for static linking in Win32 environment by Alexander Stohr.
+  Latest change: 1999-11-13
+
+  Further information:
+
+  GLaux is an outdated toolkit from SGI and later used by Microsoft.
+}
+{*++ BUILD Version: 0004    // Increment this if a change has global effects
+
+Copyright (c) 1985-95, Microsoft Corporation
+
+Module Name:
+
+    glaux.h
+
+Abstract:
+
+    Procedure declarations, constant definitions and macros for the OpenGL
+    Auxiliary Library.
+
+--*}
+{*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ *}
+
+{$MODE delphi}
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+{$define WINNT}
+{$define GLauximp}
+{x$define UNICODE}
+
+unit GLaux_SL; { version which does statically linking }
+
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glaux_dll := external 'Glauximp.dll'}
+  {$DEFINE glaux_callback := cdecl}
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+USES
+  windows,
+  GL;
+{
+#include <windows.h>
+#include <GL/glu.h>
+}
+
+TYPE
+  LPCSTR  = Pointer;   { pointer on a zero terminated string }
+  LPCWSTR = Pointer;   { pointer on a zero terminated unicode string }
+
+{*
+** ToolKit Window Types
+** In the future, AUX_RGBA may be a combination of both RGB and ALPHA
+*}
+
+const
+    AUX_RGB             = 0;
+    AUX_RGBA            = AUX_RGB;
+    AUX_INDEX           = 1;
+    AUX_SINGLE          = 0;
+    AUX_DOUBLE          = 2;
+    AUX_DIRECT          = 0;
+    AUX_INDIRECT        = 4;
+
+    AUX_ACCUM           = 8;
+    AUX_ALPHA           = 16;
+    AUX_DEPTH24         = 32;      {* 24-bit depth buffer *}
+    AUX_STENCIL         = 64;
+    AUX_AUX             = 128;
+    AUX_DEPTH16         = 256;     {* 16-bit depth buffer *}
+    AUX_FIXED_332_PAL   = 512;
+    AUX_DEPTH           = AUX_DEPTH16; {* default is 16-bit depth buffer *}
+
+{*
+** Window Masks
+*}
+
+{ These have been macros and were converted to boolean funtions }
+FUNCTION AUX_WIND_IS_RGB            (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_INDEX          (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_SINGLE         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_DOUBLE         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_INDIRECT       (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_DIRECT         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_ACCUM         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_ALPHA         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_DEPTH         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_STENCIL       (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_USES_FIXED_332_PAL(x : DWORD) : BOOLEAN;
+
+{*
+** ToolKit Event Structure
+*}
+type
+    AUX_EVENTREC = RECORD
+    {BEGIN}
+        event : GLint;
+        data  : ARRAY[0..3] OF GLint;
+    END;
+
+{*
+** ToolKit Event Types
+*}
+CONST
+    AUX_EXPOSE      = 1;
+    AUX_CONFIG      = 2;
+    AUX_DRAW        = 4;
+    AUX_KEYEVENT    = 8;
+    AUX_MOUSEDOWN   = 16;
+    AUX_MOUSEUP     = 32;
+    AUX_MOUSELOC    = 64;
+
+{*
+** Toolkit Event Data Indices
+*}
+    AUX_WINDOWX             = 0;
+    AUX_WINDOWY             = 1;
+    AUX_MOUSEX              = 0;
+    AUX_MOUSEY              = 1;
+    AUX_MOUSESTATUS         = 3;
+    AUX_KEY                 = 0;
+    AUX_KEYSTATUS           = 1;
+
+{*
+** ToolKit Event Status Messages
+*}
+    AUX_LEFTBUTTON          = 1;
+    AUX_RIGHTBUTTON         = 2;
+    AUX_MIDDLEBUTTON        = 4;
+    AUX_SHIFT               = 1;
+    AUX_CONTROL             = 2;
+
+{*
+** ToolKit Key Codes
+*}
+    AUX_RETURN              = #$0D;
+    AUX_ESCAPE              = #$1B;
+    AUX_SPACE               = #$20;
+    AUX_LEFT                = #$25;
+    AUX_UP                  = #$26;
+    AUX_RIGHT               = #$27;
+    AUX_DOWN                = #$28;
+    AUX_A                   = 'A';
+    AUX_B                   = 'B';
+    AUX_C                   = 'C';
+    AUX_D                   = 'D';
+    AUX_E                   = 'E';
+    AUX_F                   = 'F';
+    AUX_G                   = 'G';
+    AUX_H                   = 'H';
+    AUX_I                   = 'I';
+    AUX_J                   = 'J';
+    AUX_K                   = 'K';
+    AUX_L                   = 'L';
+    AUX_M                   = 'M';
+    AUX_N                   = 'N';
+    AUX_O                   = 'O';
+    AUX_P                   = 'P';
+    AUX_Q                   = 'Q';
+    AUX_R                   = 'R';
+    AUX_S                   = 'S';
+    AUX_T                   = 'T';
+    AUX_U                   = 'U';
+    AUX_V                   = 'V';
+    AUX_W                   = 'W';
+    AUX_X                   = 'X';
+    AUX_Y                   = 'Y';
+    AUX_Z                   = 'Z';
+    AUX_a_                  = 'a';
+    AUX_b_                  = 'b';
+    AUX_c_                  = 'c';
+    AUX_d_                  = 'd';
+    AUX_e_                  = 'e';
+    AUX_f_                  = 'f';
+    AUX_g_                  = 'g';
+    AUX_h_                  = 'h';
+    AUX_i_                  = 'i';
+    AUX_j_                  = 'j';
+    AUX_k_                  = 'k';
+    AUX_l_                  = 'l';
+    AUX_m_                  = 'm';
+    AUX_n_                  = 'n';
+    AUX_o_                  = 'o';
+    AUX_p_                  = 'p';
+    AUX_q_                  = 'q';
+    AUX_r_                  = 'r';
+    AUX_s_                  = 's';
+    AUX_t_                  = 't';
+    AUX_u_                  = 'u';
+    AUX_v_                  = 'v';
+    AUX_w_                  = 'w';
+    AUX_x_                  = 'x';
+    AUX_y_                  = 'y';
+    AUX_z_                  = 'z';
+    AUX_0                   = '0';
+    AUX_1                   = '1';
+    AUX_2                   = '2';
+    AUX_3                   = '3';
+    AUX_4                   = '4';
+    AUX_5                   = '5';
+    AUX_6                   = '6';
+    AUX_7                   = '7';
+    AUX_8                   = '8';
+    AUX_9                   = '9';
+
+{*
+** ToolKit Gets and Sets
+*}
+    AUX_FD                  = 1;  {* return fd (long) *}
+    AUX_COLORMAP            = 3;  {* pass buf of r, g and b (unsigned char) *}
+    AUX_GREYSCALEMAP        = 4;
+    AUX_FOGMAP              = 5;  {* pass fog and color bits (long) *}
+    AUX_ONECOLOR            = 6;  {* pass index, r, g, and b (long) *}
+
+{*
+** Color Macros
+*}
+
+    AUX_BLACK               = 0;
+    AUX_RED                 = 13;
+    AUX_GREEN               = 14;
+    AUX_YELLOW              = 15;
+    AUX_BLUE                = 16;
+    AUX_MAGENTA             = 17;
+    AUX_CYAN                = 18;
+    AUX_WHITE               = 19;
+
+{ this was a macro and is now a procedure }
+{ PROCEDURE AUX_SETCOLOR(x, y); - TODO }
+
+{*
+** RGB Image Structure
+*}
+
+type
+    AUX_RGBImageRec = RECORD
+    {BEGIN}
+        sizeX, sizeY : GLint;
+        data : ^BYTE;
+    END;
+    pAUX_RGBImageRec = ^AUX_RGBImageRec;
+
+{*
+** Prototypes
+*}
+
+Procedure auxInitDisplayMode(mode:GLenum); glaux_dll;
+Procedure auxInitPosition(x,y,w,h:Integer); glaux_dll;
+
+{$ifndef WINNT}
+FUNCTION  auxInitWindow(name:LPCSTR)  : GLenum; glaux_dll;
+{$else}
+{$ifdef UNICODE }
+FUNCTION  auxInitWindow (name:LPCWSTR) : GLenum; glaux_dll name 'auxInitWindowW';
+{$else}
+FUNCTION  auxInitWindow (name:LPCSTR)  : GLenum; glaux_dll name 'auxInitWindowA';
+{$endif}
+FUNCTION  auxInitWindowA(name:LPCSTR)  : GLenum; glaux_dll;
+FUNCTION  auxInitWindowW(name:LPCWSTR) : GLenum; glaux_dll;
+{$endif}
+
+PROCEDURE auxCloseWindow; glaux_dll;
+PROCEDURE auxQuit;        glaux_dll;
+PROCEDURE auxSwapBuffers; glaux_dll;
+
+{ callbacks }
+type
+  TAUXMAINPROC    = PROCEDURE;                           glaux_callback;
+  TAUXEXPOSEPROC  = PROCEDURE(w, h : integer);           glaux_callback;
+  TAUXRESHAPEPROC = PROCEDURE(w, h : GLsizei);           glaux_callback;
+  TAUXIDLEPROC    = PROCEDURE;                           glaux_callback;
+  TAUXKEYPROC     = PROCEDURE;                           glaux_callback;
+  TAUXMOUSEPROC   = PROCEDURE(VAR event : AUX_EVENTREC); glaux_callback;
+
+{ callback setup routines }
+PROCEDURE auxMainLoop   (func : TAUXMAINPROC); glaux_dll;
+PROCEDURE auxExposeFunc (func : TAUXEXPOSEPROC); glaux_dll;
+PROCEDURE auxReshapeFunc(func : TAUXRESHAPEPROC); glaux_dll;
+PROCEDURE auxIdleFunc   (func : TAUXIDLEPROC); glaux_dll;
+PROCEDURE auxKeyFunc    (val : integer; func : TAUXKEYPROC); glaux_dll;
+PROCEDURE auxMouseFunc  (v1, v2 :integer; func : TAUXMOUSEPROC); glaux_dll;
+
+FUNCTION  auxGetColorMapSize : integer; glaux_dll;
+PROCEDURE auxGetMouseLoc(var x, y : integer); glaux_dll;
+PROCEDURE auxSetOneColor(id : integer; r, g, b : GLfloat); glaux_dll;
+PROCEDURE auxSetFogRamp(v1, v2 : integer); glaux_dll;
+PROCEDURE auxSetGreyRamp; glaux_dll;
+PROCEDURE auxSetRGBMap(id : integer; var map : GLfloat); glaux_dll;
+
+{$ifndef WINNT}
+FUNCTION auxRGBImageLoad(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+{$else}
+{$ifndef GLAUXIMP}{ not present in GLauximp.dll }
+{$ifdef UNICODE}
+FUNCTION auxRGBImageLoad (name : LPCWSTR): pAUX_RGBImageRec; glaux_dll name 'auxRGBImageLoadW';
+{$else}
+FUNCTION auxRGBImageLoad (name : LPCSTR) : pAUX_RGBImageRec; glaux_dll name 'auxRGBImageLoadA';
+{$endif}
+FUNCTION auxRGBImageLoadA(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+FUNCTION auxRGBImageLoadW(name : LPCWSTR): pAUX_RGBImageRec; glaux_dll;
+{$endif}
+{$endif}
+
+{$ifndef WINNT}
+{ this function is Windows specific! }
+FUNCTION auxDIBImageLoad(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+{$else}
+{$ifndef GLAUXIMP}{ not present in GLauximp.dll }
+{$ifdef UNICODE }
+FUNCTION auxDIBImageLoad (name : LPCWSTR): pAUX_RGBImageRec; glaux_dll name 'auxDIBImageLoadW';
+{$else}
+FUNCTION auxDIBImageLoad (name : LPCSTR) : pAUX_RGBImageRec; glaux_dll name 'auxDIBImageLoadA';
+{$endif}
+FUNCTION auxDIBImageLoadA(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+FUNCTION auxDIBImageLoadW(name : LPCWSTR): pAUX_RGBImageRec; glaux_dll;
+{$endif}
+{$endif}
+
+PROCEDURE auxCreateFont; glaux_dll;
+
+{$ifndef WINNT}
+PROCEDURE auxDrawStr (name : LPCSTR);  glaux_dll;
+{$else}
+{$ifndef GLAUXIMP}{ not present in GLauximp.dll }
+{$ifdef UNICODE }
+PROCEDURE auxDrawStr (name : LPCWSTR); glaux_dll name 'auxDrawStrW';
+{$else}
+PROCEDURE auxDrawStr (name : LPCSTR);  glaux_dll name 'auxDrawStrA';
+{$endif}
+PROCEDURE auxDrawStrA(name : LPCSTR);  glaux_dll;
+PROCEDURE auxDrawStrW(name : LPCWSTR); glaux_dll;
+{$endif}
+{$endif}
+
+PROCEDURE auxWireSphere(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidSphere(v : GLdouble); glaux_dll;
+PROCEDURE auxWireCube(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidCube(v : GLdouble); glaux_dll;
+PROCEDURE auxWireBox(v1, v2, v3 : GLdouble); glaux_dll;
+PROCEDURE auxSolidBox(v1, v2, v3 : GLdouble); glaux_dll;
+PROCEDURE auxWireTorus(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxSolidTorus(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxWireCylinder(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxSolidCylinder(v1, v2 :  GLdouble); glaux_dll;
+PROCEDURE auxWireIcosahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidIcosahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireOctahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidOctahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireTetrahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidTetrahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireDodecahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidDodecahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireCone(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxSolidCone(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxWireTeapot(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidTeapot(v: GLdouble); glaux_dll;
+
+{*
+** Window specific functions
+** hwnd, hdc, and hglrc valid after auxInitWindow()
+*}
+FUNCTION  auxGetHWND : HWND; glaux_dll;
+FUNCTION  auxGetHDC : HDC; glaux_dll;
+FUNCTION  auxGetHGLRC : HGLRC; glaux_dll;
+
+{*
+** Viewperf support functions and constants
+*}
+{* Display Mode Selection Criteria *}
+
+CONST { was an unnamed enum }
+    AUX_USE_ID                  = 1;
+    AUX_EXACT_MATCH             = 2;
+    AUX_MINIMUM_CRITERIA        = 3;
+
+PROCEDURE auxInitDisplayModePolicy(val : GLenum); glaux_dll;
+FUNCTION  auxInitDisplayModeID(val : GLint) : GLenum; glaux_dll;
+FUNCTION  auxGetDisplayModePolicy : GLenum; glaux_dll;
+FUNCTION  auxGetDisplayModeID : GLint; glaux_dll;
+FUNCTION  auxGetDisplayMode : GLenum; glaux_dll;
+
+
+implementation
+
+{ these functions are resolved macros -
+  they should be "inline" if compile can do this }
+
+FUNCTION AUX_WIND_IS_RGB(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_RGB := ((x AND AUX_INDEX) = 0);
+END;
+
+FUNCTION AUX_WIND_IS_INDEX(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_INDEX := ((x AND AUX_INDEX) <> 0);
+END;
+
+FUNCTION AUX_WIND_IS_SINGLE(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_SINGLE := ((x AND AUX_DOUBLE) = 0);
+END;
+
+FUNCTION AUX_WIND_IS_DOUBLE(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_DOUBLE := ((x AND AUX_DOUBLE) <> 0);
+END;
+
+FUNCTION AUX_WIND_IS_INDIRECT(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_INDIRECT := ((x AND AUX_INDIRECT) <> 0);
+END;
+
+FUNCTION AUX_WIND_IS_DIRECT(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_DIRECT := ((x AND AUX_INDIRECT) = 0);
+END;
+
+FUNCTION AUX_WIND_HAS_ACCUM(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_ACCUM := ((x AND AUX_ACCUM) <> 0);
+END;
+
+FUNCTION AUX_WIND_HAS_ALPHA(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_ALPHA := ((x AND AUX_ALPHA) <> 0);
+END;
+
+FUNCTION AUX_WIND_HAS_DEPTH(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_DEPTH := ((x AND (AUX_DEPTH24 OR AUX_DEPTH16)) <> 0);
+END;
+
+FUNCTION AUX_WIND_HAS_STENCIL(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_STENCIL := ((x AND AUX_STENCIL) <> 0);
+END;
+
+FUNCTION AUX_WIND_USES_FIXED_332_PAL(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_USES_FIXED_332_PAL := ((x AND AUX_FIXED_332_PAL) <> 0);
+END;
+
+{extern float auxRGBMap[20][3];
+
+PROCEDURE AUX_SETCOLOR(x, y);
+BEGIN
+  IF (AUX_WIND_IS_RGB((x))
+  THEN glColor3fv(auxRGBMap[y])
+  ELSE glIndexf(y));
+END;
+ - TODO}
+
+
+{begin{of init}
+end.

+ 300 - 0
packages/opengl/build/glext.def

@@ -0,0 +1,300 @@
+# This is the definition file for all GL extension stuff
+
+%COPY_INTERFACE
+// -------------------------------------------------------
+//   GL extensions constants
+// -------------------------------------------------------
+
+const
+  // GL_EXT_blend_minmax and GL_EXT_blend_color
+  GL_CONSTANT_COLOR_EXT                 = $8001;
+  GL_ONE_MINUS_CONSTANT_COLOR_EXT       = $8002;
+  GL_CONSTANT_ALPHA_EXT                 = $8003;
+  GL_ONE_MINUS_CONSTANT_ALPHA_EXT       = $8004;
+  GL_BLEND_EQUATION_EXT                 = $8009;
+  GL_MIN_EXT                            = $8007;
+  GL_MAX_EXT                            = $8008;
+  GL_FUNC_ADD_EXT                       = $8006;
+  GL_FUNC_SUBTRACT_EXT                  = $800A;
+  GL_FUNC_REVERSE_SUBTRACT_EXT          = $800B;
+  GL_BLEND_COLOR_EXT                    = $8005;
+
+  // GL_EXT_polygon_offset
+  GL_POLYGON_OFFSET_EXT                 = $8037;
+  GL_POLYGON_OFFSET_FACTOR_EXT          = $8038;
+  GL_POLYGON_OFFSET_BIAS_EXT            = $8039;
+
+  // GL_EXT_vertex_array
+  GL_VERTEX_ARRAY_EXT                   = $8074;
+  GL_NORMAL_ARRAY_EXT                   = $8075;
+  GL_COLOR_ARRAY_EXT                    = $8076;
+  GL_INDEX_ARRAY_EXT                    = $8077;
+  GL_TEXTURE_COORD_ARRAY_EXT            = $8078;
+  GL_EDGE_FLAG_ARRAY_EXT                = $8079;
+  GL_VERTEX_ARRAY_SIZE_EXT              = $807A;
+  GL_VERTEX_ARRAY_TYPE_EXT              = $807B;
+  GL_VERTEX_ARRAY_STRIDE_EXT            = $807C;
+  GL_VERTEX_ARRAY_COUNT_EXT             = $807D;
+  GL_NORMAL_ARRAY_TYPE_EXT              = $807E;
+  GL_NORMAL_ARRAY_STRIDE_EXT            = $807F;
+  GL_NORMAL_ARRAY_COUNT_EXT             = $8080;
+  GL_COLOR_ARRAY_SIZE_EXT               = $8081;
+  GL_COLOR_ARRAY_TYPE_EXT               = $8082;
+  GL_COLOR_ARRAY_STRIDE_EXT             = $8083;
+  GL_COLOR_ARRAY_COUNT_EXT              = $8084;
+  GL_INDEX_ARRAY_TYPE_EXT               = $8085;
+  GL_INDEX_ARRAY_STRIDE_EXT             = $8086;
+  GL_INDEX_ARRAY_COUNT_EXT              = $8087;
+  GL_TEXTURE_COORD_ARRAY_SIZE_EXT       = $8088;
+  GL_TEXTURE_COORD_ARRAY_TYPE_EXT       = $8089;
+  GL_TEXTURE_COORD_ARRAY_STRIDE_EXT     = $808A;
+  GL_TEXTURE_COORD_ARRAY_COUNT_EXT      = $808B;
+  GL_EDGE_FLAG_ARRAY_STRIDE_EXT         = $808C;
+  GL_EDGE_FLAG_ARRAY_COUNT_EXT          = $808D;
+  GL_VERTEX_ARRAY_POINTER_EXT           = $808E;
+  GL_NORMAL_ARRAY_POINTER_EXT           = $808F;
+  GL_COLOR_ARRAY_POINTER_EXT            = $8090;
+  GL_INDEX_ARRAY_POINTER_EXT            = $8091;
+  GL_TEXTURE_COORD_ARRAY_POINTER_EXT    = $8092;
+  GL_EDGE_FLAG_ARRAY_POINTER_EXT        = $8093;
+
+  // GL_EXT_texture_object
+  GL_TEXTURE_PRIORITY_EXT               = $8066;
+  GL_TEXTURE_RESIDENT_EXT               = $8067;
+  GL_TEXTURE_1D_BINDING_EXT             = $8068;
+  GL_TEXTURE_2D_BINDING_EXT             = $8069;
+
+  // GL_EXT_texture3D
+  GL_PACK_SKIP_IMAGES_EXT               = $806B;
+  GL_PACK_IMAGE_HEIGHT_EXT              = $806C;
+  GL_UNPACK_SKIP_IMAGES_EXT             = $806D;
+  GL_UNPACK_IMAGE_HEIGHT_EXT            = $806E;
+  GL_TEXTURE_3D_EXT                     = $806F;
+  GL_PROXY_TEXTURE_3D_EXT               = $8070;
+  GL_TEXTURE_DEPTH_EXT                  = $8071;
+  GL_TEXTURE_WRAP_R_EXT                 = $8072;
+  GL_MAX_3D_TEXTURE_SIZE_EXT            = $8073;
+  GL_TEXTURE_3D_BINDING_EXT             = $806A;
+
+  // GL_EXT_paletted_texture
+  GL_TABLE_TOO_LARGE_EXT                = $8031;
+  GL_COLOR_TABLE_FORMAT_EXT             = $80D8;
+  GL_COLOR_TABLE_WIDTH_EXT              = $80D9;
+  GL_COLOR_TABLE_RED_SIZE_EXT           = $80DA;
+  GL_COLOR_TABLE_GREEN_SIZE_EXT         = $80DB;
+  GL_COLOR_TABLE_BLUE_SIZE_EXT          = $80DC;
+  GL_COLOR_TABLE_ALPHA_SIZE_EXT         = $80DD;
+  GL_COLOR_TABLE_LUMINANCE_SIZE_EXT     = $80DE;
+  GL_COLOR_TABLE_INTENSITY_SIZE_EXT     = $80DF;
+  GL_TEXTURE_INDEX_SIZE_EXT             = $80ED;
+  GL_COLOR_INDEX1_EXT                   = $80E2;
+  GL_COLOR_INDEX2_EXT                   = $80E3;
+  GL_COLOR_INDEX4_EXT                   = $80E4;
+  GL_COLOR_INDEX8_EXT                   = $80E5;
+  GL_COLOR_INDEX12_EXT                  = $80E6;
+  GL_COLOR_INDEX16_EXT                  = $80E7;
+
+  // GL_EXT_shared_texture_palette
+  GL_SHARED_TEXTURE_PALETTE_EXT         = $81FB;
+
+  // GL_EXT_point_parameters
+  GL_POINT_SIZE_MIN_EXT                 = $8126;
+  GL_POINT_SIZE_MAX_EXT                 = $8127;
+  GL_POINT_FADE_THRESHOLD_SIZE_EXT      = $8128;
+  GL_DISTANCE_ATTENUATION_EXT           = $8129;
+
+  // GL_EXT_rescale_normal
+  GL_RESCALE_NORMAL_EXT                 = $803A;
+
+  // GL_EXT_abgr
+  GL_ABGR_EXT                           = $8000;
+
+  // GL_SGIS_multitexture
+  GL_SELECTED_TEXTURE_SGIS              = $835C;
+  GL_SELECTED_TEXTURE_COORD_SET_SGIS    = $835D;
+  GL_MAX_TEXTURES_SGIS                  = $835E;
+  GL_TEXTURE0_SGIS                      = $835F;
+  GL_TEXTURE1_SGIS                      = $8360;
+  GL_TEXTURE2_SGIS                      = $8361;
+  GL_TEXTURE3_SGIS                      = $8362;
+  GL_TEXTURE_COORD_SET_SOURCE_SGIS      = $8363;
+
+  // GL_EXT_multitexture
+  GL_SELECTED_TEXTURE_EXT               = $83C0;
+  GL_SELECTED_TEXTURE_COORD_SET_EXT     = $83C1;
+  GL_SELECTED_TEXTURE_TRANSFORM_EXT     = $83C2;
+  GL_MAX_TEXTURES_EXT                   = $83C3;
+  GL_MAX_TEXTURE_COORD_SETS_EXT         = $83C4;
+  GL_TEXTURE_ENV_COORD_SET_EXT          = $83C5;
+  GL_TEXTURE0_EXT                       = $83C6;
+  GL_TEXTURE1_EXT                       = $83C7;
+  GL_TEXTURE2_EXT                       = $83C8;
+  GL_TEXTURE3_EXT                       = $83C9;
+
+  // GL_SGIS_texture_edge_clamp
+  GL_CLAMP_TO_EDGE_SGIS                 = $812F;
+
+
+// -------------------------------------------------------
+//   GL Extension Procedures
+// -------------------------------------------------------
+
+var
+%END
+
+
+#=====================================================================
+# Procedures and functions
+#=====================================================================
+
+%PROCS
+  // === 1.0 Extensions ===
+
+  // GL_EXT_blend_minmax
+  glBlendEquationEXT: procedure(mode: GLenum);
+
+  // GL_EXT_blend_color
+  glBlendColorEXT: procedure(red, green, blue, alpha: GLclampf);
+
+  // GL_EXT_polygon_offset
+  glPolygonOffsetEXT: procedure(factor, bias: Single);
+
+  // GL_EXT_vertex_array
+  glVertexPointerEXT: procedure(size: LongInt; AType: GLenum; stride, count: LongInt; var ptr);
+  glNormalPointerEXT: procedure(AType: GLenum; stride, count: LongInt; var ptr);
+  glColorPointerEXT: procedure(size: LongInt; AType: GLenum; stride, count: LongInt; var ptr);
+  glIndexPointerEXT: procedure(AType: GLenum; stride, count: LongInt; var ptr);
+  glTexCoordPointerEXT: procedure(size: LongInt; AType: GLenum; stride, count: LongInt; var ptr);
+  glEdgeFlagPointerEXT: procedure(stride, count: LongInt; var ptr: Boolean);
+  glGetPointervEXT: procedure(pname: GLenum; var params: Pointer);
+  glArrayElementEXT: procedure(i: LongInt);
+  glDrawArraysEXT: procedure(mode: GLEnum; first, count: LongInt);
+
+  // GL_EXT_texture_object
+  glGenTexturesEXT: procedure(n: LongInt; var textures: LongWord);
+  glDeleteTexturesEXT: procedure(n: LongInt; var textures: LongWord);
+  glBindTextureEXT: procedure(target: GLenum; texture: LongWord);
+  glPrioritizeTexturesEXT: procedure(n: LongInt; var textures: LongWord; var priorities: GLClampf);
+  glAreTexturesResidentEXT: function(n: LongInt; var textures: LongWord; var residences: Boolean): Boolean;
+  glIsTextureEXT: function(texture: LongWord): Boolean;
+
+  // GL_EXT_texture3D
+  glTexImage3DEXT: procedure(target: GLenum; level: LongInt; internalFormat: GLenum; width, height, depth, border: LongInt; format, AType: GLenum; var pixels);
+  glTexSubImage3DEXT: procedure(target: GLenum; level, xoffset, yoffset, zoffset, width, height, depth: LongInt; format, AType: GLenum; var pixels);
+  glCopyTexSubImage3DEXT: procedure(target: GLenum; level, xoffset, yoffset, zoffset, x, y, width, height: LongInt);
+
+  // GL_EXT_color_table
+  glColorTableEXT: procedure(target, internalformat: GLenum; width: LongInt; format, AType: GLenum; var table);
+  glColorSubTableEXT: procedure(target: GLenum; start, count: LongInt; format, AType: GLEnum; var data);
+  glGetColorTableEXT: procedure(target, format, AType: GLenum; var table);
+  glGetColorTableParameterfvEXT: procedure(target, pname: GLenum; var params: Single);
+  glGetColorTableParameterivEXT: procedure(target, pname: GLenum; var params: LongInt);
+
+  // GL_SGIS_multitexture
+  glMultiTexCoord1dSGIS: procedure(target: GLenum; s: Double);
+  glMultiTexCoord1dvSGIS: procedure(target: GLenum; var v: Double);
+  glMultiTexCoord1fSGIS: procedure(target: GLenum; s: Single);
+  glMultiTexCoord1fvSGIS: procedure(target: GLenum; var v: Single);
+  glMultiTexCoord1iSGIS: procedure(target: GLenum; s: LongInt);
+  glMultiTexCoord1ivSGIS: procedure(target: GLenum; var v: LongInt);
+  glMultiTexCoord1sSGIS: procedure(target: GLenum; s: ShortInt);
+  glMultiTexCoord1svSGIS: procedure(target: GLenum; var v: ShortInt);
+  glMultiTexCoord2dSGIS: procedure(target: GLenum; s, t: Double);
+  glMultiTexCoord2dvSGIS: procedure(target: GLenum; var v: Double);
+  glMultiTexCoord2fSGIS: procedure(target: GLenum; s, t: Single);
+  glMultiTexCoord2fvSGIS: procedure(target: GLenum; var v: Single);
+  glMultiTexCoord2iSGIS: procedure(target: GLenum; s, t: LongInt);
+  glMultiTexCoord2ivSGIS: procedure(target: GLenum; var v: LongInt);
+  glMultiTexCoord2sSGIS: procedure(target: GLenum; s, t: ShortInt);
+  glMultiTexCoord2svSGIS: procedure(target: GLenum; var v: ShortInt);
+  glMultiTexCoord3dSGIS: procedure(target: GLenum; s, t, r: Double);
+  glMultiTexCoord3dvSGIS: procedure(target: GLenum; var v: Double);
+  glMultiTexCoord3fSGIS: procedure(target: GLenum; s, t, r: Single);
+  glMultiTexCoord3fvSGIS: procedure(target: GLenum; var v: Single);
+  glMultiTexCoord3iSGIS: procedure(target: GLenum; s, t, r: LongInt);
+  glMultiTexCoord3ivSGIS: procedure(target: GLenum; var v: LongInt);
+  glMultiTexCoord3sSGIS: procedure(target: GLenum; s, t, r: ShortInt);
+  glMultiTexCoord3svSGIS: procedure(target: GLenum; var v: ShortInt);
+  glMultiTexCoord4dSGIS: procedure(target: GLenum; s, t, r, q: Double);
+  glMultiTexCoord4dvSGIS: procedure(target: GLenum; var v: Double);
+  glMultiTexCoord4fSGIS: procedure(target: GLenum; s, t, r, q: Single);
+  glMultiTexCoord4fvSGIS: procedure(target: GLenum; var v: Single);
+  glMultiTexCoord4iSGIS: procedure(target: GLenum; s, t, r, q: LongInt);
+  glMultiTexCoord4ivSGIS: procedure(target: GLenum; var v: LongInt);
+  glMultiTexCoord4sSGIS: procedure(target: GLenum; s, t, r, q: ShortInt);
+  glMultiTexCoord4svSGIS: procedure(target: GLenum; var v: ShortInt);
+  glMultiTexCoordPointerSGIS: procedure(target: GLenum; size: LongInt; AType: GLEnum; stride: LongInt; var APointer);
+  glSelectTextureSGIS: procedure(target: GLenum);
+  glSelectTextureCoordSetSGIS: procedure(target: GLenum);
+
+  // GL_EXT_multitexture
+  glMultiTexCoord1dEXT: procedure(target: GLenum; s: Double);
+  glMultiTexCoord1dvEXT: procedure(target: GLenum; var v: Double);
+  glMultiTexCoord1fEXT: procedure(target: GLenum; s: Single);
+  glMultiTexCoord1fvEXT: procedure(target: GLenum; var v: Single);
+  glMultiTexCoord1iEXT: procedure(target: GLenum; s: LongInt);
+  glMultiTexCoord1ivEXT: procedure(target: GLenum; var v: LongInt);
+  glMultiTexCoord1sEXT: procedure(target: GLenum; s: ShortInt);
+  glMultiTexCoord1svEXT: procedure(target: GLenum; var v: ShortInt);
+  glMultiTexCoord2dEXT: procedure(target: GLenum; s, t: Double);
+  glMultiTexCoord2dvEXT: procedure(target: GLenum; var v: Double);
+  glMultiTexCoord2fEXT: procedure(target: GLenum; s, t: Single);
+  glMultiTexCoord2fvEXT: procedure(target: GLenum; var v: Single);
+  glMultiTexCoord2iEXT: procedure(target: GLenum; s, t: LongInt);
+  glMultiTexCoord2ivEXT: procedure(target: GLenum; var v: LongInt);
+  glMultiTexCoord2sEXT: procedure(target: GLenum; s, t: ShortInt);
+  glMultiTexCoord2svEXT: procedure(target: GLenum; var v: ShortInt);
+  glMultiTexCoord3dEXT: procedure(target: GLenum; s, t, r: Double);
+  glMultiTexCoord3dvEXT: procedure(target: GLenum; var v: Double);
+  glMultiTexCoord3fEXT: procedure(target: GLenum; s, t, r: Single);
+  glMultiTexCoord3fvEXT: procedure(target: GLenum; var v: Single);
+  glMultiTexCoord3iEXT: procedure(target: GLenum; s, t, r: LongInt);
+  glMultiTexCoord3ivEXT: procedure(target: GLenum; var v: LongInt);
+  glMultiTexCoord3sEXT: procedure(target: GLenum; s, t, r: ShortInt);
+  glMultiTexCoord3svEXT: procedure(target: GLenum; var v: ShortInt);
+  glMultiTexCoord4dEXT: procedure(target: GLenum; s, t, r, q: Double);
+  glMultiTexCoord4dvEXT: procedure(target: GLenum; var v: Double);
+  glMultiTexCoord4fEXT: procedure(target: GLenum; s, t, r, q: Single);
+  glMultiTexCoord4fvEXT: procedure(target: GLenum; var v: Single);
+  glMultiTexCoord4iEXT: procedure(target: GLenum; s, t, r, q: LongInt);
+  glMultiTexCoord4ivEXT: procedure(target: GLenum; var v: LongInt);
+  glMultiTexCoord4sEXT: procedure(target: GLenum; s, t, r, q: ShortInt);
+  glMultiTexCoord4svEXT: procedure(target: GLenum; var v: ShortInt);
+  glInterleavedTextureCoordSetsEXT: procedure(factor: LongInt);
+  glSelectTextureEXT: procedure(target: GLenum);
+  glSelectTextureCoordSetEXT: procedure(target: GLenum);
+  glSelectTextureTransformEXT: procedure(target: GLenum);
+
+  // GL_EXT_point_parameters
+  glPointParameterfEXT: procedure(pname: GLenum; param: Single);
+  glPointParameterfvEXT: procedure(pname: GLenum; var params: Single);
+
+  // GL_MESA_window_pos
+  glWindowPos2iMESA: procedure(x, y: LongInt);
+  glWindowPos2sMESA: procedure(x, y: ShortInt);
+  glWindowPos2fMESA: procedure(x, y: Single);
+  glWindowPos2dMESA: procedure(x, y: Double);
+  glWindowPos2ivMESA: procedure(var p: LongInt);
+  glWindowPos2svMESA: procedure(var p: ShortInt);
+  glWindowPos2fvMESA: procedure(var p: Single);
+  glWindowPos2dvMESA: procedure(var p: Double);
+  glWindowPos3iMESA: procedure(x, y, z: LongInt);
+  glWindowPos3sMESA: procedure(x, y, z: ShortInt);
+  glWindowPos3fMESA: procedure(x, y, z: Single);
+  glWindowPos3dMESA: procedure(x, y, z: Double);
+  glWindowPos3ivMESA: procedure(var p: LongInt);
+  glWindowPos3svMESA: procedure(var p: ShortInt);
+  glWindowPos3fvMESA: procedure(var p: Single);
+  glWindowPos3dvMESA: procedure(var p: Double);
+  glWindowPos4iMESA: procedure(x, y, z, w: LongInt);
+  glWindowPos4sMESA: procedure(x, y, z, w: ShortInt);
+  glWindowPos4fMESA: procedure(x, y, z, w: Single);
+  glWindowPos4dMESA: procedure(x, y, z, w: Double);
+  glWindowPos4ivMESA: procedure(var p: LongInt);
+  glWindowPos4svMESA: procedure(var p: ShortInt);
+  glWindowPos4fvMESA: procedure(var p: Single);
+  glWindowPos4dvMESA: procedure(var p: Double);
+
+  // GL_MESA_resize_buffers
+  glResizeBuffersMESA: procedure;
+%END

+ 197 - 0
packages/opengl/build/glu.def

@@ -0,0 +1,197 @@
+# This is the definition file for all GLU stuff
+
+%COPY_INTERFACE
+const
+  GLU_TRUE                              = GL_TRUE;
+  GLU_FALSE                             = GL_FALSE;
+
+  // Normal vectors
+  GLU_SMOOTH                            = 100000;
+  GLU_FLAT                              = 100001;
+  GLU_NONE                              = 100002;
+
+  // Quadric draw styles
+  GLU_POINT                             = 100010;
+  GLU_LINE                              = 100011;
+  GLU_FILL                              = 100012;
+  GLU_SILHOUETTE                        = 100013;
+
+  // Quadric orientation
+  GLU_OUTSIDE                           = 100020;
+  GLU_INSIDE                            = 100021;
+
+  // Tesselator
+  GLU_BEGIN                             = 100100;
+  GLU_VERTEX                            = 100101;
+  GLU_END                               = 100102;
+  GLU_ERROR                             = 100103;
+  GLU_EDGE_FLAG                         = 100104;
+
+  // Contour types
+  GLU_CW                                = 100120;
+  GLU_CCW                               = 100121;
+  GLU_INTERIOR                          = 100122;
+  GLU_EXTERIOR                          = 100123;
+  GLU_UNKNOWN                           = 100124;
+
+  // Tesselation errors
+  GLU_TESS_ERROR1                       = 100151;  // missing gluEndPolygon
+  GLU_TESS_ERROR2                       = 100152;  // missing gluBeginPolygon
+  GLU_TESS_ERROR3                       = 100153;  // misoriented contour
+  GLU_TESS_ERROR4                       = 100154;  // vertex/edge intersection
+  GLU_TESS_ERROR5                       = 100155;  // misoriented or self-intersecting loops
+  GLU_TESS_ERROR6                       = 100156;  // coincident vertices
+  GLU_TESS_ERROR7                       = 100157;  // all vertices collinear
+  GLU_TESS_ERROR8                       = 100158;  // intersecting edges
+  GLU_TESS_ERROR9                       = 100159;  // not coplanar contours
+
+  // NURBS
+  GLU_AUTO_LOAD_MATRIX                  = 100200;
+  GLU_CULLING                           = 100201;
+  GLU_PARAMETRIC_TOLERANCE              = 100202;
+  GLU_SAMPLING_TOLERANCE                = 100203;
+  GLU_DISPLAY_MODE                      = 100204;
+  GLU_SAMPLING_METHOD                   = 100205;
+  GLU_U_STEP                            = 100206;
+  GLU_V_STEP                            = 100207;
+
+  GLU_PATH_LENGTH                       = 100215;
+  GLU_PARAMETRIC_ERROR                  = 100216;
+  GLU_DOMAIN_DISTANCE                   = 100217;
+
+  GLU_MAP1_TRIM_2                       = 100210;
+  GLU_MAP1_TRIM_3                       = 100211;
+
+  GLU_OUTLINE_POLYGON                   = 100240;
+  GLU_OUTLINE_PATCH                     = 100241;
+
+  GLU_NURBS_ERROR1                      = 100251;   // spline order un-supported
+  GLU_NURBS_ERROR2                      = 100252;   // too few knots
+  GLU_NURBS_ERROR3                      = 100253;   // valid knot range is empty
+  GLU_NURBS_ERROR4                      = 100254;   // decreasing knot sequence
+  GLU_NURBS_ERROR5                      = 100255;   // knot multiplicity > spline order
+  GLU_NURBS_ERROR6                      = 100256;   // endcurve() must follow bgncurve()
+  GLU_NURBS_ERROR7                      = 100257;   // bgncurve() must precede endcurve()
+  GLU_NURBS_ERROR8                      = 100258;   // ctrlarray or knot vector is NULL
+  GLU_NURBS_ERROR9                      = 100259;   // cannot draw pwlcurves
+  GLU_NURBS_ERROR10                     = 100260;   // missing gluNurbsCurve()
+  GLU_NURBS_ERROR11                     = 100261;   // missing gluNurbsSurface()
+  GLU_NURBS_ERROR12                     = 100262;   // endtrim() must precede endsurface()
+  GLU_NURBS_ERROR13                     = 100263;   // bgnsurface() must precede endsurface()
+  GLU_NURBS_ERROR14                     = 100264;   // curve of improper type passed as trim curve
+  GLU_NURBS_ERROR15                     = 100265;   // bgnsurface() must precede bgntrim()
+  GLU_NURBS_ERROR16                     = 100266;   // endtrim() must follow bgntrim()
+  GLU_NURBS_ERROR17                     = 100267;   // bgntrim() must precede endtrim()*/
+  GLU_NURBS_ERROR18                     = 100268;   // invalid or missing trim curve*/
+  GLU_NURBS_ERROR19                     = 100269;   // bgntrim() must precede pwlcurve()
+  GLU_NURBS_ERROR20                     = 100270;   // pwlcurve referenced twice*/
+  GLU_NURBS_ERROR21                     = 100271;   // pwlcurve and nurbscurve mixed
+  GLU_NURBS_ERROR22                     = 100272;   // improper usage of trim data type
+  GLU_NURBS_ERROR23                     = 100273;   // nurbscurve referenced twice
+  GLU_NURBS_ERROR24                     = 100274;   // nurbscurve and pwlcurve mixed
+  GLU_NURBS_ERROR25                     = 100275;   // nurbssurface referenced twice
+  GLU_NURBS_ERROR26                     = 100276;   // invalid property
+  GLU_NURBS_ERROR27                     = 100277;   // endsurface() must follow bgnsurface()
+  GLU_NURBS_ERROR28                     = 100278;   // intersecting or misoriented trim curves
+  GLU_NURBS_ERROR29                     = 100279;   // intersecting trim curves
+  GLU_NURBS_ERROR30                     = 100280;   // UNUSED
+  GLU_NURBS_ERROR31                     = 100281;   // unconnected trim curves
+  GLU_NURBS_ERROR32                     = 100282;   // unknown knot error
+  GLU_NURBS_ERROR33                     = 100283;   // negative vertex count encountered
+  GLU_NURBS_ERROR34                     = 100284;   // negative byte-stride
+  GLU_NURBS_ERROR35                     = 100285;   // unknown type descriptor
+  GLU_NURBS_ERROR36                     = 100286;   // null control point reference
+  GLU_NURBS_ERROR37                     = 100287;   // duplicate point on pwlcurve
+
+  // Errors
+  GLU_INVALID_ENUM                      = 100900;
+  GLU_INVALID_VALUE                     = 100901;
+  GLU_OUT_OF_MEMORY                     = 100902;
+  GLU_INCOMPATIBLE_GL_VERSION           = 100903;
+
+  // New in GLU 1.1
+  GLU_VERSION                           = 100800;
+  GLU_EXTENSIONS                        = 100801;
+
+type
+  PGLUquadricObj = ^TGLUquadricObj;
+  TGLUquadricObj = record end;
+  PGLUtriangulatorObj = ^TGLUtriangulatorObj;
+  TGLUtriangulatorObj = record end;
+  PGLUnurbsObj = ^TGLUnurbsObj;
+  TGLUnurbsObj = record end;
+
+  TGLUQuadricCallback = procedure; cdecl;
+  TGLUNurbsCallback = procedure; cdecl;
+  TGLUTessCallback = procedure; cdecl;
+
+  TGLUViewport = array[0..3] of LongInt;
+  TGLUMatrixd = array[0..15] of Double;
+  TGLUMatrixf = array[0..15] of Single;
+  TGLUVectord = array[0..2] of Double;
+
+%END
+
+
+#=====================================================================
+# Procedures and functions
+#=====================================================================
+
+%PROCS
+  // Miscellaneous functions
+  gluLookAt: procedure(eye, eyey, eyez, centerx, centery, centerz, upx, upy, upz: Double);
+  gluOrtho2D: procedure(left, right, bottom, top: Double);
+  gluPerspective: procedure(fovy, aspect, zNear, zFar: Double);
+  gluPickMatrix: procedure(x, y, width, height: Double; const viewport: TGLUViewport);
+  gluProject: procedure(objx, objy, objz: Double; const modelMatrix, projMatrix: TGLUMatrixd; const viewport: TGLUViewport; winx, winy, winz: Double);
+  gluUnProject: procedure(winx, winy, winz: Double; const modelMatrix, projMatrix: TGLUMatrixd; const viewport: TGLUViewport; objx, objy, objz: Double);
+  gluErrorString: procedure(errorCode: GLenum);
+
+  // Mipmapping and image scaling
+  gluScaleImage: procedure(format: GLenum; within, heightin: LongInt; typein: GLenum; var datain; widthout, heightout: LongInt; typeout: GLenum; var dataout);
+  gluBuild1DMipmaps: procedure(target: GLenum; components, width: LongInt; format, AType: GLEnum; var data);
+  gluBuild2DMipmaps: procedure(target: GLenum; components, width, height: LongInt; format, AType: GLEnum; var data);
+
+  // Quadrics
+  gluNewQuadric: function: PGLUquadricObj;
+  gluDeleteQuadric: procedure(state: PGLUquadricObj);
+  gluQuadricDrawStyle: procedure(quadObject: PGLUquadricObj; drawStyle: GLenum);
+  gluQuadricOrientation: procedure(quadObject: PGLUquadricObj; orientation: GLenum);
+  gluQuadricNormals: procedure(quadObject: PGLUquadricObj; normals: GLenum);
+  gluQuadricTexture: procedure(quadObject: PGLUquadricObj; textureCoords: Boolean);
+  gluQuadricCallback: procedure(quadObject: PGLUquadricObj; which: GLenum; fn: TGLUQuadricCallback);
+  gluCylinder: procedure(qobj: PGLUquadricObj; baseRadius, topRadius, height: Double; slices, stacks: LongInt);
+  gluSphere: procedure(qobj: PGLUquadricObj; radius: Double; slices, stacks: LongInt);
+  gluDisk: procedure(qobj: PGLUquadricObj; innerRadius, outerRadius: Double; slices, loops: LongInt);
+  gluPartialDisk: procedure(qobj: PGLUquadricObj; innerRadius, outerRadius: Double; slices, loops: LongInt; startAngle, sweepAngle: Double);
+
+  // Nurbs
+  gluNewNurbsRenderer: function: PGLUnurbsObj;
+  gluDeleteNurbsRenderer: procedure(nobj: PGLUnurbsObj);
+  gluLoadSamplingMatrices: procedure(nobj: PGLUnurbsObj; const modelMatrix, projMatrix: TGLUMatrixf; const viewport: TGLUViewport);
+  gluNurbsProperty: procedure(nobj: PGLUnurbsObj; AProperty: GLenum; value: Single);
+  gluGetNurbsProperty: procedure(nobj: PGLUnurbsObj; AProperty: GLEnum; var value: Single);
+  gluBeginCurve: procedure(nobj: PGLUnurbsObj);
+  gluEndCurve: procedure(nobj: PGLUnurbsObj);
+  gluNurbsCurve: procedure(nobj: PGLUnurbsObj; nknots: LongInt; var know: Single; stride: LongInt; var ctlarray: Single; order: LongInt; AType: GLenum);
+  gluBeginSurface: procedure(nobj: PGLUnurbsObj);
+  gluEndSurface: procedure(nobj: PGLUnurbsObj);
+  gluNurbsSurface: procedure(nobj: PGLUnurbsObj; sknot_count: LongInt; var sknot: Single; tknot_count: LongInt; var tknot: Single; s_stride, t_stride: LongInt; var ctlarray: Single; sorder, torder: LongInt; AType: GLenum);
+  gluBeginTrim: procedure(nobj: PGLUnurbsObj);
+  gluEndTrim: procedure(nobj: PGLUnurbsObj);
+  gluPwlCurve: procedure(nobj: PGLUnurbsObj; count: LongInt; var AArray: Single; stride: LongInt; AType: GLenum);
+  gluNurbsCallback: procedure(nobj: PGLUnurbsObj; which: GLenum; fn: TGLUNurbsCallback);
+
+  // Polygon tesselation
+  gluNewTess: function: PGLUtriangulatorObj;
+  gluTessCallback: procedure(tobj: PGLUtriangulatorObj; which: GLenum; fn: TGLUTessCallback);
+
+  gluDeleteTess: procedure(tobj: PGLUtriangulatorObj);
+  gluBeginPolygon: procedure(tobj: PGLUtriangulatorObj);
+  gluEndPolygon: procedure(tobj: PGLUtriangulatorObj);
+  gluNextContour: procedure(tobj: PGLUtriangulatorObj; AType: GLenum);
+  gluTessVertex: procedure(tobj: PGLUtriangulatorObj; v: TGLUVectord; var data);
+
+  // New functions in GLU 1.1
+  gluGetString: function(name: GLenum): PChar;
+%END

+ 142 - 0
packages/opengl/build/glu_linux.tem

@@ -0,0 +1,142 @@
+{
+  $Id$
+
+  Translation of the Mesa GLU headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GLU;
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Linux}
+  uses GL;
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+function InitGLUFromLibrary(libname: PChar): Boolean;
+
+
+// determines automatically which libraries to use:
+function InitGLU: Boolean;
+
+
+var
+  GLUDumpUnresolvedFunctions,
+  GLUInitialized: Boolean;
+
+
+// =======================================================
+//   GLU consts, types and functions
+// =======================================================
+
+%GLUDeclsIF
+
+var
+%GLUProcsPD
+
+
+// =======================================================
+//
+// =======================================================
+
+implementation
+
+{$LINKLIB m}
+
+function dlopen(AFile: PChar; mode: LongInt): Pointer; external 'dl';
+function dlclose(handle: Pointer): LongInt; external 'dl';
+function dlsym(handle: Pointer; name: PChar): Pointer; external 'dl';
+
+function LoadLibrary(name: PChar): Pointer;
+begin
+  Result := dlopen(name, $101 {RTLD_GLOBAL or RTLD_LAZY});
+end;
+
+function GetProc(handle: Pointer; name: PChar): Pointer;
+begin
+  Result := dlsym(handle, name);
+  if (Result = nil) and GLUDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+var
+  libGLU : Pointer;
+
+function InitGLUFromLibrary(libname: PChar): Boolean;
+begin
+  Result := False;
+  libGLU := LoadLibrary(libname);
+  if not Assigned(libGLU) then exit;
+
+%GLUProcsPL
+
+  GLUInitialized := True;
+  Result := True;
+end;
+
+
+function InitGLU: Boolean;
+begin
+  Result := InitGLUFromLibrary('libGLU.so') or
+            InitGLUFromLibrary('libGLU.so.1') or
+            InitGLUFromLibrary('libMesaGLU.so') or
+            InitGLUFromLibrary('libMesaGLU.so.3');
+end;
+
+
+initialization
+  InitGlU;
+finalization
+  if Assigned(libGLU) then dlclose(libGLU);
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:18  michael
+  + Initial import
+
+  Revision 1.1  2000/05/31 00:35:14  alex
+  added working templates
+
+}

+ 132 - 0
packages/opengl/build/glu_w32d.tem

@@ -0,0 +1,132 @@
+{
+  $Id$
+
+  Translation of the Mesa GLU headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GLU;
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glu_dll := }
+  uses Windows, GL;
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+function InitGLUFromLibrary(libname: PChar): Boolean;
+
+
+// determines automatically which libraries to use:
+function InitGLU: Boolean;
+
+
+var
+  GLUDumpUnresolvedFunctions,
+  GLUInitialized: Boolean;
+
+
+// =======================================================
+//   GLU consts, types and functions
+// =======================================================
+
+%GLUDeclsIF
+
+var
+%GLUProcsPD
+
+
+// =======================================================
+//
+// =======================================================
+
+implementation
+
+type
+  HInstance = LongWord;
+
+var
+  libGLU : HInstance;
+
+function GetProc(handle: HInstance; name: PChar): Pointer;
+begin
+  Result := GetProcAddress(handle, name);
+  if (Result = nil) and GLUDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+function InitGLUFromLibrary(libname: PChar): Boolean;
+begin
+  Result := False;
+  libGLU := LoadLibrary(libname);
+  if libGLU = 0 then exit;
+
+%GLUProcsPL
+
+  GLUInitialized := True;
+  Result := True;
+end;
+
+
+function InitGLU: Boolean;
+begin
+  Result := InitGLUFromLibrary('glu32.dll');
+end;
+
+
+initialization
+  InitGl;
+finalization
+  if libGLU <> 0 then FreeLibrary(libGLU);
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:18  michael
+  + Initial import
+
+  Revision 1.1  2000/05/31 00:35:14  alex
+  added working templates
+
+}

+ 92 - 0
packages/opengl/build/glu_w32s.tem

@@ -0,0 +1,92 @@
+{
+  $Id$
+
+  Translation of the Mesa GLU headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+  Version for static linking in Win32 environment.
+  Latest change: 1999-11-11
+
+  Original copyright notice:
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GLU; // version with static linking
+
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glu_dll := external 'glu32.dll'}
+  uses
+    Windows,
+    GL;        { for definition of GL_TRUE/FALS }
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+// none - no special init required
+
+
+// =======================================================
+//   GLU consts, types and functions
+// =======================================================
+
+%GLUDeclsIF
+
+%GLUProcsPS
+
+// =======================================================
+//
+// =======================================================
+
+implementation
+
+
+{BEGIN{OF INIT}
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:18  michael
+  + Initial import
+
+  Revision 1.1  2000/05/31 00:35:14  alex
+  added working templates
+
+}

+ 271 - 0
packages/opengl/build/glut.def

@@ -0,0 +1,271 @@
+# This is the definition file for all GLUT stuff
+
+%COPY_INTERFACE
+const
+  // Display mode bit masks
+  GLUT_RGB                      = 0;
+  GLUT_RGBA                     = GLUT_RGB;
+  GLUT_INDEX                    = 1;
+  GLUT_SINGLE                   = 0;
+  GLUT_DOUBLE                   = 2;
+  GLUT_ACCUM                    = 4;
+  GLUT_ALPHA                    = 8;
+  GLUT_DEPTH                    = 16;
+  GLUT_STENCIL                  = 32;
+  GLUT_MULTISAMPLE              = 128;
+  GLUT_STEREO                   = 256;
+  GLUT_LUMINANCE                = 512;
+
+  // Mouse buttons
+  GLUT_LEFT_BUTTON              = 0;
+  GLUT_MIDDLE_BUTTON            = 1;
+  GLUT_RIGHT_BUTTON             = 2;
+
+  // Mouse button state
+  GLUT_DOWN                     = 0;
+  GLUT_UP                       = 1;
+
+  // Keys ###
+
+  // Enter / exit state
+  GLUT_LEFT                     = 0;
+  GLUT_ENTERED                  = 1;
+
+  // Menu usage state
+  GLUT_MENU_NOT_IN_USE          = 0;
+  GLUT_MENU_IN_USE              = 1;
+
+  // Visibility state
+  GLUT_NOT_VISIBLE              = 0;
+  GLUT_VISIBLE                  = 1;
+
+  // Window status state
+  GLUT_HIDDEN                   = 0;
+  GLUT_FULLY_RETAINED           = 1;
+  GLUT_PARTIALLY_RETAINED       = 2;
+  GLUT_FULLY_COVERED            = 3;
+
+  // Color index component selection values
+  GLUT_RED                      = 0;
+  GLUT_GREEN                    = 1;
+  GLUT_BLUE                     = 2;
+
+  // Layers for use
+  GLUT_NORMAL                   = 0;
+  GLUT_OVERLAY                  = 1;
+
+  // Bitmap stuff###
+
+
+  // glutGet parameters
+  GLUT_WINDOW_X                 = 100;
+  GLUT_WINDOW_Y                 = 101;
+  GLUT_WINDOW_WIDTH             = 102;
+  GLUT_WINDOW_HEIGHT            = 103;
+  GLUT_WINDOW_BUFFER_SIZE       = 104;
+  GLUT_WINDOW_STENCIL_SIZE      = 105;
+  GLUT_WINDOW_DEPTH_SIZE        = 106;
+  GLUT_WINDOW_RED_SIZE          = 107;
+  GLUT_WINDOW_GREEN_SIZE        = 108;
+  GLUT_WINDOW_BLUE_SIZE         = 109;
+  GLUT_WINDOW_ALPHA_SIZE        = 110;
+  GLUT_WINDOW_ACCUM_RED_SIZE    = 111;
+  GLUT_WINDOW_ACCUM_GREEN_SIZE  = 112;
+  GLUT_WINDOW_ACCUM_BLUE_SIZE   = 113;
+  GLUT_WINDOW_ACCUM_ALPHA_SIZE  = 114;
+  GLUT_WINDOW_DOUBLEBUFFER      = 115;
+  GLUT_WINDOW_RGBA              = 116;
+  GLUT_WINDOW_PARENT            = 117;
+  GLUT_WINDOW_NUM_CHILDREN      = 118;
+  GLUT_WINDOW_COLORMAP_SIZE     = 119;
+  GLUT_WINDOW_NUM_SAMPLES       = 120;
+  GLUT_WINDOW_STEREO            = 121;
+  GLUT_WINDOW_CURSOR            = 122;
+  GLUT_SCREEN_WIDTH             = 200;
+  GLUT_SCREEN_HEIGHT            = 201;
+  GLUT_SCREEN_WIDTH_MM          = 202;
+  GLUT_SCREEN_HEIGHT_MM         = 203;
+  GLUT_MENU_NUM_ITEMS           = 300;
+  GLUT_DISPLAY_MODE_POSSIBLE    = 400;
+  GLUT_INIT_WINDOW_X            = 500;
+  GLUT_INIT_WINDOW_Y            = 501;
+  GLUT_INIT_WINDOW_WIDTH        = 502;
+  GLUT_INIT_WINDOW_HEIGHT       = 503;
+  GLUT_INIT_DISPLAY_MODE        = 504;
+  GLUT_ELAPSED_TIME             = 700;
+  GLUT_WINDOW_FORMAT_ID         = 123;
+
+  // glutDeviceGet parameters
+  GLUT_HAS_KEYBOARD             = 600;
+  GLUT_HAS_MOUSE                = 601;
+  GLUT_HAS_SPACEBALL            = 602;
+  GLUT_HAS_DIAL_AND_BUTTON_BOX  = 603;
+  GLUT_HAS_TABLET               = 604;
+  GLUT_NUM_MOUSE_BUTTONS        = 605;
+  GLUT_NUM_SPACEBALL_BUTTONS    = 606;
+  GLUT_NUM_BUTTON_BOX_BUTTONS   = 607;
+  GLUT_NUM_DIALS                = 608;
+  GLUT_NUM_TABLET_BUTTONS       = 609;
+  GLUT_DEVICE_IGNORE_KEY_REPEAT = 610;
+  GLUT_DEVICE_KEY_REPEAT        = 611;
+  GLUT_HAS_JOYSTICK             = 612;
+  GLUT_OWNS_JOYSTICK            = 613;
+  GLUT_JOYSTICK_BUTTONS         = 614;
+  GLUT_JOYSTICK_AXES            = 615;
+  GLUT_JOYSTICK_POLL_RATE       = 616;
+
+  // glutLayerGet parameters
+  GLUT_OVERLAY_POSSIBLE         = 800;
+  GLUT_LAYER_IN_USE             = 801;
+  GLUT_HAS_OVERLAY              = 802;
+  GLUT_TRANSPARENT_INDEX        = 803;
+  GLUT_NORMAL_DAMAGED           = 804;
+  GLUT_OVERLAY_DAMAGED          = 805;
+
+  // glutVideoResizeGet parameters
+  GLUT_VIDEO_RESIZE_POSSIBLE    = 900;
+  GLUT_VIDEO_RESIZE_IN_USE      = 901;
+  GLUT_VIDEO_RESIZE_X_DELTA     = 902;
+  GLUT_VIDEO_RESIZE_Y_DELTA     = 903;
+  GLUT_VIDEO_RESIZE_WIDTH_DELTA = 904;
+  GLUT_VIDEO_RESIZE_HEIGHT_DELTA= 905;
+  GLUT_VIDEO_RESIZE_X           = 906;
+  GLUT_VIDEO_RESIZE_Y           = 907;
+  GLUT_VIDEO_RESIZE_WIDTH       = 908;
+  GLUT_VIDEO_RESIZE_HEIGHT      = 909;
+
+  // glutGetModifiers return mask
+  GLUT_ACTIVE_SHIFT             = 1;
+  GLUT_ACTIVE_CTRL              = 2;
+  GLUT_ACTIVE_ALT               = 4;
+
+  // Cursor stuff ###
+
+// GLUT window callback sub-API
+type
+  TGlutDisplayFunc = procedure; extdecl
+  TGlutReshapeFunc = procedure(width, height: Integer); extdecl
+  TGlutTimerFunc = procedure(value: Integer); extdecl
+  TGlutKeyboardFunc = procedure(key: char;x,y:Integer); extdecl
+  TGlutIdleFunc = procedure; extdecl
+
+// GLUT game mode sub-API
+{$ifdef GLUT_GAME}
+// glutGameModeGet
+const
+  GLUT_GAME_MODE_ACTIVE         = 0;
+  GLUT_GAME_MODE_POSSIBLE       = 1;
+  GLUT_GAME_MODE_WIDTH          = 2;
+  GLUT_GAME_MODE_HEIGHT         = 3;
+  GLUT_GAME_MODE_PIXEL_DEPTH    = 4;
+  GLUT_GAME_MODE_REFRESH_RATE   = 5;
+  GLUT_GAME_MODE_DISPLAY_CHANGED= 6;
+{$endif GLUT_GAME}
+%END
+
+
+#=====================================================================
+# Procedures and functions
+#=====================================================================
+
+%PROCS
+// GLUT initialization sub-API
+  glutInit: procedure(var argcp: Integer; var argv: PChar);
+  glutInitDisplayMode: procedure(mode: LongWord);
+  glutInitDisplayString: procedure(AString: PChar);
+  glutInitWindowPosition: procedure(x, y: Integer);
+  glutInitWindowSize: procedure(width, height: Integer);
+  glutMainLoop: procedure;
+
+// GLUT window sub-API
+  glutCreateWindow: function(title: PChar): Integer;
+  glutCreateSubWindow: function(win, x, y, width, height: Integer): Integer;
+  glutDestroyWindow: procedure(win: Integer);
+  glutPostRedisplay: procedure;
+  glutPostWindowRedisplay: procedure(win: Integer);
+  glutSwapBuffers: procedure;
+  glutGetWindow: function: Integer;
+  glutSetWindow: procedure(win: Integer);
+  glutSetWindowTitle: procedure(title: PChar);
+  glutSetIconTitle: procedure(title: PChar);
+  glutPositionWindow: procedure(x, y: Integer);
+  glutReshapeWindow: procedure(width, height: Integer);
+  glutPopWindow: procedure;
+  glutPushWindow: procedure;
+  glutIconifyWindow: procedure;
+  glutShowWindow: procedure;
+  glutHideWindow: procedure;
+  glutFullScreen: procedure;
+  glutSetCursor: procedure(cursor: Integer);
+  glutWarpPointer: procedure(x, y: Integer);
+
+//overlays ###
+
+//menus ###
+
+// GLUT window callback sub-API
+  glutDisplayFunc: procedure(func: TGlutDisplayFunc);
+  glutReshapeFunc: procedure(func: TGlutReshapeFunc);
+
+  glutTimerFunc: procedure(millis: LongWord; func: TGlutTimerFunc; value: longint);
+  glutKeyboardFunc : procedure(func: TGlutKeyboardFunc);
+  glutIdleFunc : procedure(func: TGlutIdleFunc);
+
+
+// GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK * func)(int width, int height));
+// GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK * func)(unsigned char key, int x, int y));
+// GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK * func)(int button, int state, int x, int y));
+// GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK * func)(int value), int value);
+// GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutSpecialFunc(void (GLUTCALLBACK * func)(int key, int x, int y));
+// GLUTAPI void APIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK * func)(int x, int y, int z));
+// GLUTAPI void APIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK * func)(int x, int y, int z));
+// GLUTAPI void APIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK * func)(int button, int state));
+// GLUTAPI void APIENTRY glutButtonBoxFunc(void (GLUTCALLBACK * func)(int button, int state));
+// GLUTAPI void APIENTRY glutDialsFunc(void (GLUTCALLBACK * func)(int dial, int value));
+// GLUTAPI void APIENTRY glutTabletMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutTabletButtonFunc(void (GLUTCALLBACK * func)(int button, int state, int x, int y));
+// GLUTAPI void APIENTRY glutMenuStatusFunc(void (GLUTCALLBACK * func)(int status, int x, int y));
+// GLUTAPI void APIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutWindowStatusFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK * func)(unsigned char key, int x, int y));
+// GLUTAPI void APIENTRY glutSpecialUpFunc(void (GLUTCALLBACK * func)(int key, int x, int y));
+// GLUTAPI void APIENTRY glutJoystickFunc(void (GLUTCALLBACK * func)(unsigned int buttonMask, int x, int y, int z), int pollInterval)
+
+// GLUT color index sub-API
+  glutSetColor: procedure(index: Integer; red, green, blue: Single);
+  glutGetColor: function(ndx, component: Integer): Single;
+  glutCopyColormap: procedure(win: Integer);
+
+// GLUT state retrieval sub-API
+  glutGet: function(AType: GLEnum): Integer;
+  glutDeviceGet: function(AType: GLEnum): Integer;
+  glutExtensionSupported: function(name: PChar): Integer;
+  glutGetModifiers: function: Integer;
+  glutLayerGet: function(AType: GLEnum): Integer;
+
+// fonts ###
+
+// pre-built models ###
+
+// video resize ###
+
+// debugging ###
+
+// device control ###
+
+
+// GLUT game mode sub-API
+{$ifdef GLUT_GAME}
+  glutGameModeString: procedure(AString: PChar);
+  glutEnterGameMode: function: Integer;
+  glutLeaveGameMode: procedure;
+  glutGameModeGet: function(mode: GLEnum): Integer;
+{$endif GLUT_GAME}
+%END

+ 108 - 0
packages/opengl/build/glut_linux.tem

@@ -0,0 +1,108 @@
+{
+  $Id$
+
+  Translation of the Mesa GLUT headers for FreePascal
+  Linux Version, Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}
+
+unit GLUT;
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Linux}
+  {$DEFINE gldecl := cdecl;}
+  {$DEFINE extdecl := cdecl;}
+  uses GL;
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+function InitGLUTFromLibrary(libname: PChar): Boolean;
+
+// determines automatically which library to use:
+function InitGLUT: Boolean;
+
+
+var
+  GLUTDumpUnresolvedFunctions,
+  GLUTInitialized: Boolean;
+
+
+%GLUTDeclsIF
+
+var
+%GLUTProcsPD
+
+
+implementation
+
+{$LINKLIB Xmu}
+
+function dlopen(AFile: PChar; mode: LongInt): Pointer; external 'dl';
+function dlclose(handle: Pointer): LongInt; external 'dl';
+function dlsym(handle: Pointer; name: PChar): Pointer; external 'dl';
+
+function LoadLibrary(name: PChar): Pointer;
+begin
+  Result := dlopen(name, $101 {RTLD_GLOBAL or RTLD_LAZY});
+end;
+
+function GetProc(handle: Pointer; name: PChar): Pointer;
+begin
+  Result := dlsym(handle, name);
+  if (Result = nil) and GLUTDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+var
+  libGLUT: Pointer;
+
+function InitGLUTFromLibrary(libname: PChar): Boolean;
+begin
+  Result := False;
+  libGLUT := LoadLibrary(libname);
+  if not Assigned(libGLUT) then exit;
+
+%GLUTProcsPL
+
+  GLUTInitialized := True;
+  Result := True;
+end;
+
+
+function InitGLUT: Boolean;
+begin
+  Result := InitGLUTFromLibrary('libglut.so') or
+            InitGLUTFromLibrary('libglut.so.3');
+end;
+
+
+initialization
+  InitGLUT;
+finalization
+  if Assigned(libGLUT) then dlClose(libGLUT);
+end.

+ 75 - 0
packages/opengl/build/glut_w32d.tem

@@ -0,0 +1,75 @@
+{$MODE delphi}
+
+unit GLUT;
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glut_dll := }
+  {$DEFINE gldecl := stdcall;}
+  {$DEFINE extdecl := stdcall;}
+  uses windows, GL;
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+function InitGLUTFromLibrary(libname: PChar): Boolean;
+
+// determines automatically which library to use:
+function InitGLUT: Boolean;
+
+
+var
+  GLUTDumpUnresolvedFunctions,
+  GLUTInitialized: Boolean;
+
+
+%GLUTDeclsIF
+
+var
+%GLUTProcsPD
+
+
+implementation
+
+
+type
+  HInstance = LongWord;
+
+var
+  libGLUT: HInstance;
+
+function GetProc(handle: HInstance; name: PChar): Pointer;
+begin
+  Result := GetProcAddress(handle, name);
+  if (Result = nil) and GLUDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+function InitGLUTFromLibrary(libname: PChar): Boolean;
+begin
+  Result := False;
+  libGLUT := LoadLibrary(libname);
+  if libGLUT = 0 then exit;
+
+%GLUTProcsPL
+
+  GLUTInitialized := True;
+  Result := True;
+end;
+
+
+function InitGLUT: Boolean;
+begin
+  Result := InitGLUTFromLibrary('glut32.dll');
+end;
+
+
+initialization
+  InitGLUT;
+finalization
+  if libGLUT <> 0 then FreeLibrary(libGLUT);
+end.

+ 53 - 0
packages/opengl/build/glut_w32s.tem

@@ -0,0 +1,53 @@
+{
+  $Id$
+
+  Translation of the GLUT headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+  Version for static linking in Win32 environment by Alexander Stohr.
+  Latest change: 1999-11-13
+
+  Further information:
+
+  GLUT is a powerful toolkit for programming multiplatform OpenGL
+  applications. It was designed by Mark J. Kilgard while working for SGI,
+  he is now working for nVidia.
+}
+{ this translation of the c header files is done by Sebastian Guenther 1999 }
+{ version for static linking for Win32 platforms done by Alexander Stohr 1999 }
+
+{$MODE delphi}
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GLUT_SL; { version which does statically linking }
+
+
+interface
+
+uses GL_SL;
+
+{x$DEFINE GLUT_GAME} {enable if you need game mode sub api}
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glut_dll := external 'glut32.dll'}
+  {$DEFINE glut_callback := cdecl}
+  {$DEFINE extdecl := }
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+%GLUTDeclsIF
+
+%GLUTProcsPS
+
+
+implementation
+
+
+{begin{of init}
+end.

+ 106 - 0
packages/opengl/build/glx.def

@@ -0,0 +1,106 @@
+# This is the definition file for all GLX stuff
+
+%COPY_INTERFACE
+// Tokens for glXChooseVisual and glXGetConfig:
+const
+  GLX_USE_GL                            = 1;
+  GLX_BUFFER_SIZE                       = 2;
+  GLX_LEVEL                             = 3;
+  GLX_RGBA                              = 4;
+  GLX_DOUBLEBUFFER                      = 5;
+  GLX_STEREO                            = 6;
+  GLX_AUX_BUFFERS                       = 7;
+  GLX_RED_SIZE                          = 8;
+  GLX_GREEN_SIZE                        = 9;
+  GLX_BLUE_SIZE                         = 10;
+  GLX_ALPHA_SIZE                        = 11;
+  GLX_DEPTH_SIZE                        = 12;
+  GLX_STENCIL_SIZE                      = 13;
+  GLX_ACCUM_RED_SIZE                    = 14;
+  GLX_ACCUM_GREEN_SIZE                  = 15;
+  GLX_ACCUM_BLUE_SIZE                   = 16;
+  GLX_ACCUM_ALPHA_SIZE                  = 17;
+
+  // GLX_EXT_visual_info extension
+  GLX_X_VISUAL_TYPE_EXT                 = $22;
+  GLX_TRANSPARENT_TYPE_EXT              = $23;
+  GLX_TRANSPARENT_INDEX_VALUE_EXT       = $24;
+  GLX_TRANSPARENT_RED_VALUE_EXT         = $25;
+  GLX_TRANSPARENT_GREEN_VALUE_EXT       = $26;
+  GLX_TRANSPARENT_BLUE_VALUE_EXT        = $27;
+  GLX_TRANSPARENT_ALPHA_VALUE_EXT       = $28;
+
+
+  // Error codes returned by glXGetConfig:
+  GLX_BAD_SCREEN                        = 1;
+  GLX_BAD_ATTRIBUTE                     = 2;
+  GLX_NO_EXTENSION                      = 3;
+  GLX_BAD_VISUAL                        = 4;
+  GLX_BAD_CONTEXT                       = 5;
+  GLX_BAD_VALUE                         = 6;
+  GLX_BAD_ENUM                          = 7;
+
+  // GLX 1.1 and later:
+  GLX_VENDOR                            = 1;
+  GLX_VERSION                           = 2;
+  GLX_EXTENSIONS                        = 3;
+
+  // GLX_visual_info extension
+  GLX_TRUE_COLOR_EXT                    = $8002;
+  GLX_DIRECT_COLOR_EXT                  = $8003;
+  GLX_PSEUDO_COLOR_EXT                  = $8004;
+  GLX_STATIC_COLOR_EXT                  = $8005;
+  GLX_GRAY_SCALE_EXT                    = $8006;
+  GLX_STATIC_GRAY_EXT                   = $8007;
+  GLX_NONE_EXT                          = $8000;
+  GLX_TRANSPARENT_RGB_EXT               = $8008;
+  GLX_TRANSPARENT_INDEX_EXT             = $8009;
+
+type
+  // From XLib:
+  XPixmap = TXID;
+  XFont = TXID;
+  XColormap = TXID;
+
+  GLXContext = Pointer;
+  GLXPixmap = TXID;
+  GLXDrawable = TXID;
+  GLXContextID = TXID;
+%END
+
+
+#=====================================================================
+# Procedures and functions
+#=====================================================================
+
+%PROCS
+  glXChooseVisual: function(dpy: PDisplay; screen: Integer; var attribList: Integer): PXVisualInfo; cdecl;
+  glXCreateContext: function(dpy: PDisplay; vis: PXVisualInfo; shareList: GLXContext; direct: Boolean): GLXContext; cdecl;
+  glXDestroyContext: procedure(dpy: PDisplay; ctx: GLXContext); cdecl;
+  glXMakeCurrent: function(dpy: PDisplay; drawable: GLXDrawable; ctx: GLXContext): Boolean; cdecl;
+  glXCopyContext: procedure(dpy: PDisplay; src, dst: GLXContext; mask: LongWord); cdecl;
+  glXSwapBuffers: procedure(dpy: PDisplay; drawable: GLXDrawable); cdecl;
+  glXCreateGLXPixmap: function(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap): GLXPixmap; cdecl;
+  glXDestroyGLXPixmap: procedure(dpy: PDisplay; pixmap: GLXPixmap); cdecl;
+  glXQueryExtension: function(dpy: PDisplay; var errorb, event: Integer): Boolean; cdecl;
+  glXQueryVersion: function(dpy: PDisplay; var maj, min: Integer): Boolean; cdecl;
+  glXIsDirect: function(dpy: PDisplay; ctx: GLXContext): Boolean; cdecl;
+  glXGetConfig: function(dpy: PDisplay; visual: PXVisualInfo; attrib: Integer; var value: Integer): Integer; cdecl;
+  glXGetCurrentContext: function: GLXContext; cdecl;
+  glXGetCurrentDrawable: function: GLXDrawable; cdecl;
+  glXWaitGL: procedure; cdecl;
+  glXWaitX: procedure; cdecl;
+  glXUseXFont: procedure(font: XFont; first, count, list: Integer); cdecl;
+
+  // GLX 1.1 and later
+  glXQueryExtensionsString: function(dpy: PDisplay; screen: Integer): PChar; cdecl;
+  glXQueryServerString: function(dpy: PDisplay; screen, name: Integer): PChar; cdecl;
+  glXGetClientString: function(dpy: PDisplay; name: Integer): PChar; cdecl;
+
+  // Mesa GLX Extensions
+  glXCreateGLXPixmapMESA: function(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap; cmap: XColormap): GLXPixmap; cdecl;
+  glXReleaseBufferMESA: function(dpy: PDisplay; d: GLXDrawable): Boolean; cdecl;
+  glXCopySubBufferMESA: procedure(dpy: PDisplay; drawbale: GLXDrawable; x, y, width, height: Integer); cdecl;
+  glXGetVideoSyncSGI: function(var counter: LongWord): Integer; cdecl;
+  glXWaitVideoSyncSGI: function(divisor, remainder: Integer; var count: LongWord): Integer; cdecl;
+%END

+ 143 - 0
packages/opengl/build/glx_linux.tem

@@ -0,0 +1,143 @@
+{
+  $Id$
+
+  Translation of the Mesa GLX headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GLX;
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Linux}
+  uses
+    X, XLib, XUtil;
+  {$DEFINE HasGLX}  // Activate GLX stuff
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+{$IFNDEF HasGLX}
+  {$MESSAGE GLX not present on this platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+// Note: Requires that the GL library has already been initialized
+function InitGLX: Boolean;
+
+var
+  GLXDumpUnresolvedFunctions,
+  GLXInitialized: Boolean;
+
+
+// =======================================================
+//   GLX consts, types and functions
+// =======================================================
+
+%GLXDeclsIF
+
+var
+%GLXProcsPD
+
+
+// =======================================================
+//
+// =======================================================
+
+implementation
+
+{$LINKLIB m}
+
+function dlopen(AFile: PChar; mode: LongInt): Pointer; external 'dl';
+function dlclose(handle: Pointer): LongInt; external 'dl';
+function dlsym(handle: Pointer; name: PChar): Pointer; external 'dl';
+
+function LoadLibrary(name: PChar): Pointer;
+begin
+  Result := dlopen(name, $101 {RTLD_GLOBAL or RTLD_LAZY});
+end;
+
+function GetProc(handle: Pointer; name: PChar): Pointer;
+begin
+  Result := dlsym(handle, name);
+  if (Result = nil) and GLXDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+var
+  libGLX: Pointer;
+
+function InitGLXFromLibrary(libname:pchar): Boolean;
+begin
+  Result := False;
+  libGLX := LoadLibrary(libname);
+  if not Assigned(libGLX) then exit;
+
+%GLXProcsPL
+
+  GLXInitialized := True;
+  Result := True;
+end;
+
+function InitGLX: Boolean;
+begin
+  Result := InitGLXFromLibrary('libGL.so') or
+            InitGLXFromLibrary('libGL.so.1') or
+            InitGLXFromLibrary('libMesaGL.so') or
+            InitGLXFromLibrary('libMesaGL.so.3');
+end;
+
+
+initialization
+  InitGLX;
+finalization
+  if Assigned(libGLX) then dlclose(libGLX);
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:18  michael
+  + Initial import
+
+  Revision 1.1  2000/05/31 00:36:08  alex
+  dummy - incomplete code.
+
+}

+ 134 - 0
packages/opengl/build/glx_w32d.tem

@@ -0,0 +1,134 @@
+{
+  $Id$
+
+  Translation of the Mesa GLX headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GLX;
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glx_dll := external 'unknown.dll'}
+  uses Windows;
+  {x$DEFINE HasGLX}  // Activate GLX stuff
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+{$IFNDEF HasGLX}
+  {$MESSAGE GLX not present on this platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+// Note: Requires that the GL library has already been initialized
+function InitGLX: Boolean;
+
+var
+  GLXDumpUnresolvedFunctions,
+  GLXInitialized: Boolean;
+
+
+// =======================================================
+//   GLX consts, types and functions
+// =======================================================
+
+%GLXDeclsIF
+
+var
+%GLXProcsPD
+
+
+// =======================================================
+//
+// =======================================================
+
+implementation
+
+type
+  HInstance = LongWord;
+
+{$IFDEF HasGLX}
+
+var
+  libGLX : HInstance;
+
+function GetProc(handle: HInstance; name: PChar): Pointer;
+begin
+  Result := GetProcAddress(handle, name);
+  if (Result = nil) and GLXDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+function InitGLX: Boolean;
+begin
+  Result := False;
+  { Unix GLX is implemented as special subset of the GL interface }
+  if libGL = 0 then exit;
+
+  glXQueryVersion := GetProcAddress(libGL, 'glXQueryVersion');
+  if @glXQueryVersion = nil then exit;
+
+%GLXProcsPL
+
+  GLXInitialized := True;
+  Result := True;
+end;
+
+{$ENDIF  IFDEF HasGLX}
+
+
+initialization
+  InitGLX;
+finalization
+  if libGLX <> 0 then FreeLibrary(libGLX);
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:18  michael
+  + Initial import
+
+  Revision 1.1  2000/05/31 00:36:08  alex
+  dummy - incomplete code.
+
+}

+ 89 - 0
packages/opengl/build/glx_w32s.tem

@@ -0,0 +1,89 @@
+{
+  $Id$
+
+  Translation of the Mesa GLX headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GLX_SL;
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glx_dll := external 'unknown.dll'}
+  uses Windows;
+  {x$DEFINE HasGLX}  // Activate GLX stuff
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+{$IFNDEF HasGLX}
+  {$MESSAGE GLX not present on this platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+
+// =======================================================
+//   GLX consts, types and functions
+// =======================================================
+
+%GLXDeclsIF
+
+%GLXProcsPS
+
+
+// =======================================================
+//
+// =======================================================
+
+implementation
+
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:18  michael
+  + Initial import
+
+  Revision 1.1  2000/05/31 00:36:08  alex
+  dummy - incomplete code.
+
+}

+ 71 - 0
packages/opengl/build/ogl_linux.gen

@@ -0,0 +1,71 @@
+#
+#       build tool script for generation of OpenGL units
+#
+
+# === file format description ===
+# - any empty line is ignored
+# - aything preceeded with a #, *, ; and ' is a comment
+# - sections can be 'common' or be made of a target file name
+# - common sections define general strings, but only
+#   the value of TARGET_DIR is really important for the build
+# - filename sections contain one key for the template name to be used
+#   plus some key definitons that describe the rules of how to insert
+#   generated data.
+# - a key is structured like this:
+#     key_name, key_rule [,optional_parameters]
+# - the following key rules exist and will create somewhat like this:
+#     IG = Ignore:      <key will be ignored - no text generated>
+#     TX = InsertText:  <whole text from refered file>
+#     IF = Interface:   [line from option1]
+#     PD = ProcDecls:   [line from option1] [option2] [//comment in line]
+#     PL = ProcLoaders: [function name from line in opt1]
+#                         := GetProc([option2], '[function name from opt1]');
+#   TX, IF, PD and PL use first optional parameter as the def file name.
+#   the rule PD has second optional parameter that modifys the function.
+#   the rule PL has second optional parameter for import lib/dll name string.
+
+# ==== Linux dynamic linking ====
+[common]
+TOOL_NAME   = c_gen_linuxd
+TARGET_TEXT = Linux
+TARGET_DIR  = ../linux/
+
+[gl.pp]
+TEMPLATE=gl_linux.tem
+KEY=GLDeclsIF10,        IF, gl10.def
+KEY=GLProcsPD10,        PD, gl10.def,           cdecl;
+KEY=GLProcsPL10,        PL, gl10.def,           libgl
+KEY=GLDeclsIF10Ext,     IF, gl10ext.def
+KEY=GLProcsPD10Ext,     PD, gl10ext.def,        cdecl;
+KEY=GLProcsPL10Ext,     PL, gl10ext.def,        libgl
+KEY=GLDeclsIF10SGI,     IF, gl10sgi.def
+KEY=GLProcsPD10SGI,     PD, gl10sgi.def,        cdecl;
+KEY=GLProcsPL10SGI,     PL, gl10sgi.def,        libgl
+KEY=GLDeclsIF10Mesa,    IF, gl10mesa.def
+KEY=GLProcsPD10Mesa,    PD, gl10mesa.def,       cdecl;
+KEY=GLProcsPL10Mesa,    PL, gl10mesa.def,       libgl
+KEY=GLDeclsIF11,        IF, gl11.def
+KEY=GLProcsPD11,        PD, gl11.def,           cdecl;
+KEY=GLProcsPL11,        PL, gl11.def,           libgl
+KEY=GLDeclsIF12,        IF, gl12.def
+KEY=GLProcsPD12,        PD, gl12.def,           cdecl;
+KEY=GLProcsPL12,        PL, gl12.def,           libgl
+
+[glu.pp]
+TEMPLATE=glu_linux.tem
+KEY=GLUDeclsIF,         IF,glu.def
+KEY=GLUProcsPD,         PD,glu.def,             cdecl;
+KEY=GLUProcsPL,         PL,glu.def,             libglu
+
+[glx.pp]
+TEMPLATE=glx_linux.tem
+KEY=GLXDeclsIF,         IF,glx.def
+KEY=GLXProcsPD,         PD,glx.def,             cdecl;
+KEY=GLXProcsPL,         PL,glx.def,             libglx
+
+[glut.pp]
+TEMPLATE=glut_linux.tem
+KEY=GLUTDeclsIF,        IF,glut.def
+KEY=GLUTProcsPD,        PD,glut.def,            cdecl;
+KEY=GLUTProcsPL,        PL,glut.def,            libglut
+

+ 77 - 0
packages/opengl/build/ogl_w32d.gen

@@ -0,0 +1,77 @@
+#
+#       build tool script for generation of OpenGL units
+#
+
+# === file format description ===
+# - any empty line is ignored
+# - aything preceeded with a #, *, ; and ' is a comment
+# - sections can be 'common' or be made of a target file name
+# - common sections define general strings, but only
+#   the value of TARGET_DIR is really important for the build
+# - filename sections contain one key for the template name to be used
+#   plus some key definitons that describe the rules of how to insert
+#   generated data.
+# - a key is structured like this:
+#     key_name, key_rule [,optional_parameters]
+# - the following key rules exist and will create somewhat like this:
+#     IG = Ignore:      <key will be ignored - no text generated>
+#     TX = InsertText:  <whole text from refered file>
+#     IF = Interface:   [line from option1]
+#     PD = ProcDecls:   [line from option1] [option2] [//comment in line]
+#     PL = ProcLoaders: [function name from line in opt1]
+#                         := GetProc([option2], '[function name from opt1]');
+#   TX, IF, PD and PL use first optional parameter as the def file name.
+#   the rule PD has second optional parameter that modifys the function.
+#   the rule PL has second optional parameter for import lib/dll name string.
+
+# ==== Win32 dynamic linking ====
+[common]
+TOOL_NAME   = c_gen_win32d
+TARGET_TEXT = Win32
+TARGET_DIR  = ../win32/
+
+[gl.pp]
+TEMPLATE=gl_w32d.tem
+KEY=GLDeclsIF10,        IF, gl10.def
+KEY=GLProcsPD10,        PD, gl10.def,           ogl_dll
+KEY=GLProcsPL10,        PL, gl10.def,           libGL
+KEY=GLDeclsIF10Ext,     IF, gl10ext.def
+KEY=GLProcsPD10Ext,     PD, gl10ext.def,        ogl_dll
+KEY=GLProcsPL10Ext,     PL, gl10ext.def,        libGL
+KEY=GLDeclsIF10SGI,     IF, gl10sgi.def
+KEY=GLProcsPD10SGI,     PD, gl10sgi.def,        ogl_dll
+KEY=GLProcsPL10SGI,     PL, gl10sgi.def,        libGL
+KEY=GLDeclsIF10Mesa,    IF, gl10mesa.def
+KEY=GLProcsPD10Mesa,    PD, gl10mesa.def,       ogl_dll
+KEY=GLProcsPL10Mesa,    PL, gl10mesa.def,       libGL
+KEY=GLDeclsIF11,        IF, gl11.def
+KEY=GLProcsPD11,        PD, gl11.def,           ogl_dll
+KEY=GLProcsPL11,        PL, gl11.def,           libGL
+KEY=GLDeclsIF12,        IF, gl12.def
+KEY=GLProcsPD12,        PD, gl12.def,           ogl_dll
+KEY=GLProcsPL12,        PL, gl12.def,           libGL
+
+[glu.pp]
+TEMPLATE=glu_w32d.tem
+KEY=GLUDeclsIF,         IF,glu.def
+KEY=GLUProcsPD,         PD,glu.def,             glu_dll
+KEY=GLUProcsPL,         PL,glu.def,             libGLU
+
+[glut.pp]
+TEMPLATE=glut_w32d.tem
+KEY=GLUTDeclsIF,        IF,glut.def
+KEY=GLUTProcsPD,        PD,glut.def,            glut_dll
+KEY=GLUTProcsPL,        PL,glut.def,            libGLUT
+
+[glaux.pp]
+TEMPLATE=glaux_w32d.tem
+KEY=GLAUXDeclsIF,       IF,glaux.def
+KEY=GLAUXProcsPD,       PD,glaux.def,           glaux_dll
+KEY=GLAUXProcsPL,       PL,glaux.def,           libGLAUX
+
+[glx.pp]
+TEMPLATE=glx_w32d.tem
+KEY=GLXDeclsIF,         IF,glx.def
+KEY=GLXProcsPD,         PD,glx.def,             glx_dll
+KEY=GLXProcsPL,         PL,glx.def,             libGLX
+

+ 68 - 0
packages/opengl/build/ogl_w32s.gen

@@ -0,0 +1,68 @@
+#
+#       build tool script for generation of OpenGL units
+#
+
+# === file format description ===
+# - any empty line is ignored
+# - aything preceeded with a #, *, ; and ' is a comment
+# - sections can be 'common' or be made of a target file name
+# - common sections define general strings, but only
+#   the value of TARGET_DIR is really important for the build
+# - filename sections contain one key for the template name to be used
+#   plus some key definitons that describe the rules of how to insert
+#   generated data.
+# - a key is structured like this:
+#     key_name, key_rule [,optional_parameters]
+# - the following key rules exist and will create somewhat like this:
+#     IG = Ignore:      <key will be ignored - no text generated>
+#     TX = InsertText:  <whole text from refered file>
+#     IF = Interface:   [line from option1]
+#     PD = ProcDynamic: [line from option1] [option2] [//comment in line]
+#     PS = ProcStatic:  [swapped proc from option1] [option2] [//comment]
+#     PL = ProcLoaders: [function name from line in opt1]
+#                         := GetProc([option2], '[function name from opt1]');
+#   TX, IF, PD and PL use first optional parameter as the def file name.
+#   the rule PD has second optional parameter that modifys the function.
+#   the rule PL has second optional parameter for import lib/dll name string.
+
+# ==== Win32 static linking ====
+[common]
+TOOL_NAME   = c_gen_win32_s
+TARGET_TEXT = Win32
+TARGET_DIR  = ../win32/
+
+[gl_sl.pp]
+TEMPLATE=gl_w32s.tem
+KEY=GLDeclsIF10,        IF, gl10.def
+KEY=GLProcsPS10,        PS, gl10.def,           ogl_dll;
+KEY=GLDeclsIF10Ext,     IF, gl10ext.def
+KEY=GLProcsPS10Ext,     PS, gl10ext.def,        ogl_dll;
+KEY=GLDeclsIF10SGI,     IF, gl10sgi.def
+KEY=GLProcsPS10SGI,     PS, gl10sgi.def,        ogl_dll;
+KEY=GLDeclsIF10Mesa,    IF, gl10mesa.def
+KEY=GLProcsPS10Mesa,    PS, gl10mesa.def,       ogl_dll;
+KEY=GLDeclsIF11,        IF, gl11.def
+KEY=GLProcsPS11,        PS, gl11.def,           ogl_dll;
+KEY=GLDeclsIF12,        IF, gl12.def
+KEY=GLProcsPS12,        PS, gl12.def,           ogl_dll;
+
+[glu_sl.pp]
+TEMPLATE=glu_w32s.tem
+KEY=GLUDeclsIF,         IF, glu.def
+KEY=GLUProcsPS,         PS, glu.def,            glu_dll;
+
+[glut_sl.pp]
+TEMPLATE=glut_w32s.tem
+KEY=GLUTDeclsIF,        IF, glut.def
+KEY=GLUTProcsPS,        PS, glut.def,           glut_dll;
+
+[glaux_sl.pp]
+TEMPLATE=glaux_w32s.tem
+KEY=GLAUXDeclsIF,       IF, glaux.def
+KEY=GLAUXProcsPS,       PS, glaux.def,          glaux_dll;
+
+[glx_sl.pp]
+TEMPLATE=glx_w32s.tem
+KEY=GLXDeclsIF,         IF, glx.def
+KEY=GLXProcsPS,         PS, glx.def,            glx_dll;
+

+ 1300 - 0
packages/opengl/examples/Makefile

@@ -0,0 +1,1300 @@
+#
+# Makefile generated by fpcmake v1.00 [2000/09/02]
+#
+
+defaultrule: all
+
+#####################################################################
+# Autodetect OS (Linux or Dos or Windows NT)
+# define inlinux when running under linux
+# define inWinNT when running under WinNT
+#####################################################################
+
+# We need only / in the path
+override PATH:=$(subst \,/,$(PATH))
+
+# Search for PWD and determine also if we are under linux
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(subst ;, ,$(PATH)))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(subst :, ,$(PATH)))))
+ifeq ($(PWD),)
+nopwd:
+	@echo You need the GNU utils package to use this Makefile!
+	@echo Get ftp://ftp.freepascal.org/pub/fpc/dist/go32v2/utilgo32.zip
+	@exit
+else
+inlinux=1
+endif
+else
+PWD:=$(firstword $(PWD))
+endif
+
+# Detect NT - NT sets OS to Windows_NT
+ifndef inlinux
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+endif
+endif
+
+# Detect OS/2 - OS/2 has OS2_SHELL defined
+ifndef inlinux
+ifndef inWinNT
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+endif
+
+# The extension of executables
+ifdef inlinux
+EXEEXT=
+else
+EXEEXT=.exe
+endif
+
+# The path which is searched separated by spaces
+ifdef inlinux
+SEARCHPATH=$(subst :, ,$(PATH))
+else
+SEARCHPATH=$(subst ;, ,$(PATH))
+endif
+
+# Base dir
+ifdef PWD
+BASEDIR:=$(shell $(PWD))
+else
+BASEDIR=.
+endif
+
+#####################################################################
+# FPC version/target Detection
+#####################################################################
+
+# What compiler to use ?
+ifndef FPC
+# Compatibility with old makefiles
+ifdef PP
+FPC=$(PP)
+else
+ifdef inOS2
+FPC=ppos2
+else
+FPC=ppc386
+endif
+endif
+endif
+override FPC:=$(subst $(EXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(EXEEXT)
+
+# Target OS
+ifndef OS_TARGET
+OS_TARGET:=$(shell $(FPC) -iTO)
+endif
+
+# Source OS
+ifndef OS_SOURCE
+OS_SOURCE:=$(shell $(FPC) -iSO)
+endif
+
+# Target CPU
+ifndef CPU_TARGET
+CPU_TARGET:=$(shell $(FPC) -iTP)
+endif
+
+# Source CPU
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(shell $(FPC) -iSP)
+endif
+
+# FPC version
+ifndef FPC_VERSION
+FPC_VERSION:=$(shell $(FPC) -iV)
+endif
+
+export FPC OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FPC_VERSION
+
+#####################################################################
+# FPCDIR Setting
+#####################################################################
+
+# Test FPCDIR to look if the RTL dir exists
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=wrong
+endif
+endif
+else
+override FPCDIR=wrong
+endif
+
+# Default FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR=../../..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=wrong
+endif
+endif
+endif
+
+# Detect FPCDIR
+ifeq ($(FPCDIR),wrong)
+ifdef inlinux
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+endif
+
+ifndef PACKAGESDIR
+PACKAGESDIR=$(FPCDIR)/packages
+endif
+ifndef TOOLKITSDIR
+TOOLKITSDIR=
+endif
+ifndef COMPONENTSDIR
+COMPONENTSDIR=
+endif
+
+# Create units dir
+ifneq ($(FPCDIR),.)
+UNITSDIR=$(FPCDIR)/units/$(OS_TARGET)
+endif
+
+#####################################################################
+# User Settings
+#####################################################################
+
+
+# Targets
+
+override EXEOBJECTS+=glutdemo morph3d
+
+# Clean
+
+
+# Install
+
+ZIPTARGET=install
+
+# Defaults
+
+
+# Directories
+
+
+# Packages
+
+override PACKAGES+=rtl opengl
+ifeq ($(OS_TARGET),linux)
+override PACKAGES+=x11
+endif
+
+# Libraries
+
+override NEEDGCCLIB=1
+override NEEDOTHERLIB=1
+
+# Info
+
+INFOTARGET=fpc_infocfg fpc_infoobjects fpc_infoinstall 
+
+#####################################################################
+# Shell tools
+#####################################################################
+
+# echo
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=echo
+ECHOE:=echo
+else
+ECHO:=$(firstword $(ECHO))
+ECHOE=$(ECHO) -E
+endif
+else
+ECHO:=$(firstword $(ECHO))
+ECHOE=$(ECHO) -E
+endif
+endif
+
+# To copy pograms
+ifndef COPY
+COPY:=cp -fp
+endif
+
+# Copy a whole tree
+ifndef COPYTREE
+COPYTREE:=cp -rfp
+endif
+
+# To move pograms
+ifndef MOVE
+MOVE:=mv -f
+endif
+
+# Check delete program
+ifndef DEL
+DEL:=rm -f
+endif
+
+# Check deltree program
+ifndef DELTREE
+DELTREE:=rm -rf
+endif
+
+# To install files
+ifndef INSTALL
+ifdef inlinux
+INSTALL:=install -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+
+# To install programs
+ifndef INSTALLEXE
+ifdef inlinux
+INSTALLEXE:=install -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+
+# To make a directory.
+ifndef MKDIR
+ifdef inlinux
+MKDIR:=install -m 755 -d
+else
+MKDIR:=ginstall -m 755 -d
+endif
+endif
+
+export ECHO ECHOE COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+
+#####################################################################
+# Default Tools
+#####################################################################
+
+# assembler, redefine it if cross compiling
+ifndef AS
+AS=as
+endif
+
+# linker, but probably not used
+ifndef LD
+LD=ld
+endif
+
+# ppas.bat / ppas.sh
+ifdef inlinux
+PPAS=ppas.sh
+else
+ifdef inOS2
+PPAS=ppas.cmd
+else
+PPAS=ppas.bat
+endif
+endif
+
+# ldconfig to rebuild .so cache
+ifdef inlinux
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+
+# ppumove
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE=
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+
+# ppufiles
+ifndef PPUFILES
+PPUFILES:=$(strip $(wildcard $(addsuffix /ppufiles$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUFILES),)
+PPUFILES=
+else
+PPUFILES:=$(firstword $(PPUFILES))
+endif
+endif
+export PPUFILES
+
+# Look if UPX is found for go32v2 and win32. We can't use $UPX becuase
+# upx uses that one itself (PFV)
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+
+# ZipProg, you can't use Zip as the var name (PFV)
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG=
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+
+ZIPOPT=-9
+ZIPEXT=.zip
+
+# Tar
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG=
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+
+ifeq ($(USETAR),bz2)
+TAROPT=vI
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+
+#####################################################################
+# Default extensions
+#####################################################################
+
+# Default needed extensions (Go32v2,Linux)
+LOADEREXT=.as
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+RSTEXT=.rst
+FPCMADE=fpcmade
+
+# Go32v1
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+FPCMADE=fpcmade.v1
+endif
+
+# Go32v2
+ifeq ($(OS_TARGET),go32v2)
+FPCMADE=fpcmade.dos
+endif
+
+# Linux
+ifeq ($(OS_TARGET),linux)
+FPCMADE=fpcmade.lnx
+endif
+
+# Win32
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.w32
+endif
+
+# OS/2
+ifeq ($(OS_TARGET),os2)
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+SMARTEXT=.so
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.os2
+endif
+
+# library prefix
+LIBPREFIX=lib
+ifeq ($(OS_TARGET),go32v2)
+LIBPREFIX=
+endif
+ifeq ($(OS_TARGET),go32v1)
+LIBPREFIX=
+endif
+
+# determine which .pas extension is used
+ifndef PASEXT
+ifdef EXEOBJECTS
+override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(EXEOBJECTS)))))
+else
+override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(UNITOBJECTS)))))
+endif
+ifeq ($(TESTPAS),)
+PASEXT=.pp
+else
+PASEXT=.pas
+endif
+endif
+
+
+# Check if the dirs really exists, else turn it off
+ifeq ($(wildcard $(UNITSDIR)),)
+UNITSDIR=
+endif
+ifeq ($(wildcard $(TOOLKITSDIR)),)
+TOOLKITSDIR=
+endif
+ifeq ($(wildcard $(PACKAGESDIR)),)
+PACKAGESDIR=
+endif
+ifeq ($(wildcard $(COMPONENTSDIR)),)
+COMPONENTSDIR=
+endif
+
+
+# PACKAGESDIR packages
+
+PACKAGERTL=1
+PACKAGEOPENGL=1
+ifeq ($(OS_TARGET),linux)
+PACKAGEX11=1
+endif
+
+ifdef PACKAGERTL
+ifneq ($(wildcard $(FPCDIR)/rtl),)
+ifneq ($(wildcard $(FPCDIR)/rtl/$(OS_TARGET)),)
+PACKAGEDIR_RTL=$(FPCDIR)/rtl/$(OS_TARGET)
+else
+PACKAGEDIR_RTL=$(FPCDIR)/rtl
+endif
+ifeq ($(wildcard $(PACKAGEDIR_RTL)/$(FPCMADE)),)
+override COMPILEPACKAGES+=package_rtl
+package_rtl:
+	$(MAKE) -C $(PACKAGEDIR_RTL) all
+endif
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+else
+PACKAGEDIR_RTL=
+ifneq ($(wildcard $(UNITSDIR)/rtl),)
+ifneq ($(wildcard $(UNITSDIR)/rtl/$(OS_TARGET)),)
+UNITDIR_RTL=$(UNITSDIR)/rtl/$(OS_TARGET)
+else
+UNITDIR_RTL=$(UNITSDIR)/rtl
+endif
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override NEEDUNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifdef PACKAGEOPENGL
+ifneq ($(wildcard $(PACKAGESDIR)/opengl),)
+ifneq ($(wildcard $(PACKAGESDIR)/opengl/$(OS_TARGET)),)
+PACKAGEDIR_OPENGL=$(PACKAGESDIR)/opengl/$(OS_TARGET)
+else
+PACKAGEDIR_OPENGL=$(PACKAGESDIR)/opengl
+endif
+ifeq ($(wildcard $(PACKAGEDIR_OPENGL)/$(FPCMADE)),)
+override COMPILEPACKAGES+=package_opengl
+package_opengl:
+	$(MAKE) -C $(PACKAGEDIR_OPENGL) all
+endif
+UNITDIR_OPENGL=$(PACKAGEDIR_OPENGL)
+else
+PACKAGEDIR_OPENGL=
+ifneq ($(wildcard $(UNITSDIR)/opengl),)
+ifneq ($(wildcard $(UNITSDIR)/opengl/$(OS_TARGET)),)
+UNITDIR_OPENGL=$(UNITSDIR)/opengl/$(OS_TARGET)
+else
+UNITDIR_OPENGL=$(UNITSDIR)/opengl
+endif
+else
+UNITDIR_OPENGL=
+endif
+endif
+ifdef UNITDIR_OPENGL
+override NEEDUNITDIR+=$(UNITDIR_OPENGL)
+endif
+endif
+ifdef PACKAGEX11
+ifneq ($(wildcard $(PACKAGESDIR)/x11),)
+ifneq ($(wildcard $(PACKAGESDIR)/x11/$(OS_TARGET)),)
+PACKAGEDIR_X11=$(PACKAGESDIR)/x11/$(OS_TARGET)
+else
+PACKAGEDIR_X11=$(PACKAGESDIR)/x11
+endif
+ifeq ($(wildcard $(PACKAGEDIR_X11)/$(FPCMADE)),)
+override COMPILEPACKAGES+=package_x11
+package_x11:
+	$(MAKE) -C $(PACKAGEDIR_X11) all
+endif
+UNITDIR_X11=$(PACKAGEDIR_X11)
+else
+PACKAGEDIR_X11=
+ifneq ($(wildcard $(UNITSDIR)/x11),)
+ifneq ($(wildcard $(UNITSDIR)/x11/$(OS_TARGET)),)
+UNITDIR_X11=$(UNITSDIR)/x11/$(OS_TARGET)
+else
+UNITDIR_X11=$(UNITSDIR)/x11
+endif
+else
+UNITDIR_X11=
+endif
+endif
+ifdef UNITDIR_X11
+override NEEDUNITDIR+=$(UNITDIR_X11)
+endif
+endif
+
+
+#####################################################################
+# Default Directories
+#####################################################################
+
+# set the prefix directory where to install everything
+ifndef PREFIXINSTALLDIR
+ifdef inlinux
+PREFIXINSTALLDIR=/usr
+else
+PREFIXINSTALLDIR=/pp
+endif
+endif
+export PREFIXINSTALLDIR
+
+# Where to place the resulting zip files
+ifndef DESTZIPDIR
+DESTZIPDIR:=$(BASEDIR)
+endif
+export DESTZIPDIR
+
+# On linux, try to find where libgcc.a is.
+ifdef inlinux
+ifndef GCCLIBDIR
+GCCLIBDIR:=$(shell dirname `(gcc -v 2>&1)| head -n 1| awk '{ print $$4 } '`)
+endif
+endif
+export GCCLIBDIR
+
+# Where to find other libraries
+ifdef inlinux
+ifndef OTHERLIBDIR
+OTHERLIBDIR:=$(shell grep -v "^\#" /etc/ld.so.conf | awk '{ ORS=" "; print $1 }')
+endif
+endif
+export OTHERLIBDIR
+
+#####################################################################
+# Install Directories
+#####################################################################
+
+# set the base directory where to install everything
+ifndef BASEINSTALLDIR
+ifdef inlinux
+BASEINSTALLDIR=$(PREFIXINSTALLDIR)/lib/fpc/$(FPC_VERSION)
+else
+BASEINSTALLDIR=$(PREFIXINSTALLDIR)
+endif
+endif
+
+# set the directory where to install the binaries
+ifndef BININSTALLDIR
+ifdef inlinux
+BININSTALLDIR=$(PREFIXINSTALLDIR)/bin
+else
+BININSTALLDIR=$(BASEINSTALLDIR)/bin/$(OS_TARGET)
+endif
+endif
+
+# set the directory where to install the units.
+ifndef UNITINSTALLDIR
+UNITINSTALLDIR=$(BASEINSTALLDIR)/units/$(OS_TARGET)
+ifdef UNITSUBDIR
+UNITINSTALLDIR:=$(UNITINSTALLDIR)/$(UNITSUBDIR)
+endif
+endif
+
+# Where to install shared libraries
+ifndef LIBINSTALLDIR
+ifdef inlinux
+LIBINSTALLDIR=$(PREFIXINSTALLDIR)/lib
+else
+LIBINSTALLDIR=$(UNITINSTALLDIR)
+endif
+endif
+
+# Where the source files will be stored
+ifndef SOURCEINSTALLDIR
+ifdef inlinux
+SOURCEINSTALLDIR=$(PREFIXINSTALLDIR)/src/fpc-$(FPC_VERSION)
+else
+SOURCEINSTALLDIR=$(BASEINSTALLDIR)/source
+endif
+ifdef SOURCESUBDIR
+SOURCEINSTALLDIR:=$(SOURCEINSTALLDIR)/$(SOURCESUBDIR)
+endif
+endif
+
+# Where the doc files will be stored
+ifndef DOCINSTALLDIR
+ifdef inlinux
+DOCINSTALLDIR=$(PREFIXINSTALLDIR)/doc/fpc-$(FPC_VERSION)
+else
+DOCINSTALLDIR=$(BASEINSTALLDIR)/doc
+endif
+endif
+
+# Where to install the examples, under linux we use the doc dir
+# because the copytree command will create a subdir itself
+ifndef EXAMPLEINSTALLDIR
+ifdef inlinux
+EXAMPLEINSTALLDIR=$(DOCINSTALLDIR)/examples
+else
+EXAMPLEINSTALLDIR=$(BASEINSTALLDIR)/examples
+endif
+ifdef EXAMPLESUBDIR
+EXAMPLEINSTALLDIR:=$(EXAMPLEINSTALLDIR)/$(EXAMPLESUBDIR)
+endif
+endif
+
+# Where the some extra (data)files will be stored
+ifndef DATAINSTALLDIR
+DATAINSTALLDIR=$(BASEINSTALLDIR)
+endif
+
+#####################################################################
+# Redirection
+#####################################################################
+
+ifndef REDIRFILE
+REDIRFILE=log
+endif
+
+ifdef REDIR
+ifndef inlinux
+override FPC=redir -eo $(FPC)
+endif
+# set the verbosity to max
+override FPCOPT+=-va
+override REDIR:= >> $(REDIRFILE)
+endif
+
+
+#####################################################################
+# Compiler Command Line
+#####################################################################
+
+# Load commandline OPTDEF and add FPC_CPU define
+override FPCOPTDEF:=-d$(CPU_TARGET)
+
+# Load commandline OPT and add target and unit dir to be sure
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+
+# User dirs should be first, so they are looked at first
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+
+# Smartlinking
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+
+# Smartlinking creation
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+
+# Debug
+ifdef DEBUG
+override FPCOPT+=-g -dDEBUG
+endif
+
+# Release mode (strip, optimize and don't load ppc386.cfg)
+# 0.99.12b has a bug in the optimizer so don't use it by default
+ifdef RELEASE
+ifeq ($(FPC_VERSION),0.99.12)
+override FPCOPT+=-Xs -OGp3 -n
+else
+override FPCOPT+=-Xs -OG2p3 -n
+endif
+endif
+
+# Strip
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+
+# Optimizer
+ifdef OPTIMIZE
+override FPCOPT+=-OG2p3
+endif
+
+# Verbose settings (warning,note,info)
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+
+ifdef NEEDUNITDIR
+override FPCOPT+=$(addprefix -Fu,$(NEEDUNITDIR))
+endif
+
+ifdef UNITSDIR
+override FPCOPT+=-Fu$(UNITSDIR)
+endif
+
+# Add GCC lib path if asked
+ifdef GCCLIBDIR
+override FPCOPT+=-Fl$(GCCLIBDIR)
+endif
+
+# Add Other dirs path if asked
+ifdef OTHERLIBDIR
+override FPCOPT+=$(addprefix -Fl,$(OTHERLIBDIR))
+endif
+
+# Target dirs and the prefix to use for clean/install
+ifdef TARGETDIR
+override FPCOPT+=-FE$(TARGETDIR)
+ifeq ($(TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(TARGETDIR)/
+endif
+endif
+ifdef UNITTARGETDIR
+override FPCOPT+=-FU$(UNITTARGETDIR)
+ifeq ($(UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(TARGETDIR)/
+endif
+else
+ifdef TARGETDIR
+override UNITTARGETDIR=$(TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+
+# Add commandline options last so they can override
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+
+# Add defines from FPCOPTDEF to FPCOPT
+ifdef FPCOPTDEF
+override FPCOPT+=$(FPCOPTDEF)
+endif
+
+# Error file ?
+ifdef ERRORFILE
+override FPCOPT+=-Fr$(ERRORFILE)
+endif
+
+# Was a config file specified ?
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+
+# For win32 the options are passed using the environment FPCEXTCMD
+ifeq ($(OS_SOURCE),win32)
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+
+# Compiler commandline
+override COMPILER:=$(FPC) $(FPCOPT)
+
+# also call ppas if with command option -s
+# but only if the OS_SOURCE and OS_TARGE are equal
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(OS_SOURCE),$(OS_TARGET))
+EXECPPAS:=@$(PPAS)
+endif
+endif
+
+#####################################################################
+# Standard rules
+#####################################################################
+
+all: fpc_all
+
+debug: fpc_debug
+
+smart: fpc_smart
+
+shared: fpc_shared
+
+showinstall: fpc_showinstall
+
+install: fpc_install
+
+sourceinstall: fpc_sourceinstall
+
+exampleinstall: fpc_exampleinstall
+
+zipinstall: fpc_zipinstall
+
+zipsourceinstall: fpc_zipsourceinstall
+
+zipexampleinstall: fpc_zipexampleinstall
+
+clean: fpc_clean
+
+distclean: fpc_distclean
+
+cleanall: fpc_cleanall
+
+info: fpc_info
+
+.PHONY:  all debug smart shared showinstall install sourceinstall exampleinstall zipinstall zipsourceinstall zipexampleinstall clean distclean cleanall info
+
+#####################################################################
+# Exes
+#####################################################################
+
+.PHONY: fpc_exes
+
+ifdef EXEOBJECTS
+override EXEFILES=$(addsuffix $(EXEEXT),$(EXEOBJECTS))
+override EXEOFILES=$(addsuffix $(OEXT),$(EXEOBJECTS))
+
+override ALLTARGET+=fpc_exes
+override INSTALLEXEFILES+=$(EXEFILES)
+override CLEANEXEFILES+=$(EXEFILES) $(EXEOFILES)
+endif
+
+fpc_exes: $(EXEFILES)
+
+#####################################################################
+# General compile rules
+#####################################################################
+
+.PHONY: fpc_packages fpc_all fpc_debug
+
+$(FPCMADE): $(ALLTARGET)
+	@$(ECHO) Compiled > $(FPCMADE)
+
+fpc_packages: $(COMPILEPACKAGES)
+
+fpc_all: fpc_packages $(FPCMADE)
+
+fpc_debug:
+	$(MAKE) all DEBUG=1
+
+# Search paths for .ppu if targetdir is set
+ifdef UNITTARGETDIR
+vpath %$(PPUEXT) $(UNITTARGETDIR)
+endif
+
+# General compile rules, available for both possible PASEXT
+
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .pp
+
+%$(PPUEXT): %.pp
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(PPUEXT): %.pas
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(EXEEXT): %.pp
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(EXEEXT): %.pas
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+#####################################################################
+# Library
+#####################################################################
+
+.PHONY: fpc_smart fpc_shared
+
+ifdef LIBVERSION
+LIBFULLNAME=$(LIBNAME).$(LIBVERSION)
+else
+LIBFULLNAME=$(LIBNAME)
+endif
+
+# Default sharedlib units are all unit objects
+ifndef SHAREDLIBUNITOBJECTS
+SHAREDLIBUNITOBJECTS:=$(UNITOBJECTS)
+endif
+
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+
+fpc_shared: all
+ifdef inlinux
+ifndef LIBNAME
+	@$(ECHO) "LIBNAME not set"
+else
+	$(PPUMOVE) $(SHAREDLIBUNITOBJECTS) -o$(LIBFULLNAME)
+endif
+else
+	@$(ECHO) "Shared Libraries not supported"
+endif
+
+#####################################################################
+# Install rules
+#####################################################################
+
+.PHONY: fpc_showinstall fpc_install
+
+ifdef EXTRAINSTALLUNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(EXTRAINSTALLUNITS))
+endif
+
+ifdef INSTALLPPUFILES
+override INSTALLPPUFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLPPUFILES))
+ifdef PPUFILES
+INSTALLPPULINKFILES:=$(shell $(PPUFILES) -S -O $(INSTALLPPUFILES))
+else
+INSTALLPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(LIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))))
+endif
+override INSTALLPPULINKFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLPPULINKFILES))
+endif
+
+ifdef INSTALLEXEFILES
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLEXEFILES))
+endif
+
+fpc_showinstall: $(SHOWINSTALLTARGET)
+ifdef INSTALLEXEFILES
+	@$(ECHO) -e $(addprefix "\n"$(BININSTALLDIR)/,$(INSTALLEXEFILES))
+endif
+ifdef INSTALLPPUFILES
+	@$(ECHO) -e $(addprefix "\n"$(UNITINSTALLDIR)/,$(INSTALLPPUFILES))
+ifneq ($(INSTALLPPULINKFILES),)
+	@$(ECHO) -e $(addprefix "\n"$(UNITINSTALLDIR)/,$(INSTALLPPULINKFILES))
+endif
+ifneq ($(wildcard $(LIBFULLNAME)),)
+	@$(ECHO) $(LIBINSTALLDIR)/$(LIBFULLNAME)
+ifdef inlinux
+	@$(ECHO) $(LIBINSTALLDIR)/$(LIBNAME)
+endif
+endif
+endif
+ifdef EXTRAINSTALLFILES
+	@$(ECHO) -e $(addprefix "\n"$(DATAINSTALLDIR)/,$(EXTRAINSTALLFILES))
+endif
+
+fpc_install: $(INSTALLTARGET)
+# Create UnitInstallFiles
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(BININSTALLDIR)
+# Compress the exes if upx is defined
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(BININSTALLDIR)
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(UNITINSTALLDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(UNITINSTALLDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(UNITINSTALLDIR)
+endif
+ifneq ($(wildcard $(LIBFULLNAME)),)
+	$(MKDIR) $(LIBINSTALLDIR)
+	$(INSTALL) $(LIBFULLNAME) $(LIBINSTALLDIR)
+ifdef inlinux
+	ln -sf $(LIBFULLNAME) $(LIBINSTALLDIR)/$(LIBNAME)
+endif
+endif
+endif
+ifdef EXTRAINSTALLFILES
+	$(MKDIR) $(DATAINSTALLDIR)
+	$(INSTALL) $(EXTRAINSTALLFILES) $(DATAINSTALLDIR)
+endif
+
+#####################################################################
+# SourceInstall rules
+#####################################################################
+
+.PHONY: fpc_sourceinstall
+
+ifndef SOURCETOPDIR
+SOURCETOPDIR=$(BASEDIR)
+endif
+
+fpc_sourceinstall: clean
+	$(MKDIR) $(SOURCEINSTALLDIR)
+	$(COPYTREE) $(SOURCETOPDIR) $(SOURCEINSTALLDIR)
+
+#####################################################################
+# exampleinstall rules
+#####################################################################
+
+.PHONY: fpc_exampleinstall
+
+fpc_exampleinstall: $(addsuffix _clean,$(EXAMPLEDIROBJECTS))
+ifdef EXAMPLESOURCEFILES
+	$(MKDIR) $(EXAMPLEINSTALLDIR)
+	$(COPY) $(EXAMPLESOURCEFILES) $(EXAMPLEINSTALLDIR)
+endif
+ifdef EXAMPLEDIROBJECTS
+ifndef EXAMPLESOURCEFILES
+	$(MKDIR) $(EXAMPLEINSTALLDIR)
+endif
+	$(COPYTREE) $(addsuffix /*,$(EXAMPLEDIROBJECTS)) $(EXAMPLEINSTALLDIR)
+endif
+
+#####################################################################
+# Zip
+#####################################################################
+
+.PHONY: fpc_zipinstall
+
+# Create suffix to add
+ifndef PACKAGESUFFIX
+PACKAGESUFFIX=$(OS_TARGET)
+ifeq ($(OS_TARGET),go32v2)
+PACKAGESUFFIX=go32
+endif
+ifeq ($(OS_TARGET),win32)
+PACKAGESUFFIX=w32
+endif
+endif
+
+# Temporary path to pack a file
+ifndef PACKDIR
+ifndef inlinux
+PACKDIR=$(BASEDIR)/pack_tmp
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+
+# Maybe create default zipname from packagename
+ifndef ZIPNAME
+ifdef PACKAGENAME
+ZIPNAME=$(PACKAGEPREFIX)$(PACKAGENAME)$(PACKAGESUFFIX)
+endif
+endif
+
+# Use tar by default under linux
+ifndef USEZIP
+ifdef inlinux
+USETAR=1
+endif
+endif
+
+fpc_zipinstall:
+ifndef ZIPNAME
+	@$(ECHO) "Please specify ZIPNAME!"
+	@exit 1
+else
+	$(MAKE) $(ZIPTARGET) PREFIXINSTALLDIR=$(PACKDIR)
+ifdef USETAR
+	$(DEL) $(DESTZIPDIR)/$(ZIPNAME)$(TAREXT)
+	cd $(PACKDIR) ; $(TARPROG) c$(TAROPT) --file $(DESTZIPDIR)/$(ZIPNAME)$(TAREXT) * ; cd $(BASEDIR)
+else
+	$(DEL) $(DESTZIPDIR)/$(ZIPNAME)$(ZIPEXT)
+	cd $(PACKDIR) ; $(ZIPPROG) -Dr $(ZIPOPT) $(DESTZIPDIR)/$(ZIPNAME)$(ZIPEXT) * ; cd $(BASEDIR)
+endif
+	$(DELTREE) $(PACKDIR)
+endif
+
+.PHONY:  fpc_zipsourceinstall
+
+fpc_zipsourceinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall PACKAGESUFFIX=src
+
+.PHONY:  fpc_zipexampleinstall
+
+fpc_zipexampleinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall PACKAGESUFFIX=exm
+
+#####################################################################
+# Clean rules
+#####################################################################
+
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+
+ifdef EXTRACLEANUNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(EXTRACLEANUNITS))
+endif
+
+ifdef CLEANPPUFILES
+override CLEANPPUFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANPPUFILES))
+# Get the .o and .a files created for the units
+ifdef PPUFILES
+CLEANPPULINKFILES:=$(shell $(PPUFILES) $(CLEANPPUFILES))
+else
+CLEANPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(LIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))))
+endif
+override CLEANPPULINKFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANPPULINKFILES))
+endif
+
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef EXTRACLEANFILES
+	-$(DEL) $(EXTRACLEANFILES)
+endif
+ifdef LIBNAME
+	-$(DEL) $(LIBNAME) $(LIBFULLNAME)
+endif
+	-$(DEL) $(FPCMADE) $(PPAS) link.res $(FPCEXTFILE) $(REDIRFILE)
+
+fpc_distclean: fpc_clean
+
+# Also run clean first if targetdir is set. Unittargetdir is always
+# set if targetdir or unittargetdir is specified
+ifdef UNITTARGETDIR
+TARGETDIRCLEAN=fpc_clean
+endif
+
+fpc_cleanall: $(CLEANTARGET) $(TARGETDIRCLEAN)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) $(FPCMADE) $(PPAS) link.res $(FPCEXTFILE) $(REDIRFILE)
+
+#####################################################################
+# Info rules
+#####################################################################
+
+.PHONY: fpc_info fpc_cfginfo fpc_objectinfo fpc_toolsinfo fpc_installinfo \
+	fpc_dirinfo
+
+fpc_info: $(INFOTARGET)
+
+fpc_infocfg:
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC....... $(FPC)
+	@$(ECHO)  Version... $(FPC_VERSION)
+	@$(ECHO)  CPU....... $(CPU_TARGET)
+	@$(ECHO)  Source.... $(OS_SOURCE)
+	@$(ECHO)  Target.... $(OS_TARGET)
+	@$(ECHO)
+
+fpc_infoobjects:
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  LoaderObjects..... $(LOADEROBJECTS)
+	@$(ECHO)  UnitObjects....... $(UNITOBJECTS)
+	@$(ECHO)  ExeObjects........ $(EXEOBJECTS)
+	@$(ECHO)
+	@$(ECHO)  ExtraCleanUnits... $(EXTRACLEANUNITS)
+	@$(ECHO)  ExtraCleanFiles... $(EXTRACLEANFILES)
+	@$(ECHO)
+	@$(ECHO)  ExtraInstallUnits. $(EXTRAINSTALLUNITS)
+	@$(ECHO)  ExtraInstallFiles. $(EXTRAINSTALLFILES)
+	@$(ECHO)
+
+fpc_infoinstall:
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+ifdef DATE
+	@$(ECHO)  DateStr.............. $(DATESTR)
+endif
+ifdef PACKAGEPREFIX
+	@$(ECHO)  PackagePrefix........ $(PACKAGEPREFIX)
+endif
+ifdef PACKAGENAME
+	@$(ECHO)  PackageName.......... $(PACKAGENAME)
+endif
+	@$(ECHO)  PackageSuffix........ $(PACKAGESUFFIX)
+	@$(ECHO)
+	@$(ECHO)  BaseInstallDir....... $(BASEINSTALLDIR)
+	@$(ECHO)  BinInstallDir........ $(BININSTALLDIR)
+	@$(ECHO)  LibInstallDir........ $(LIBINSTALLDIR)
+	@$(ECHO)  UnitInstallDir....... $(UNITINSTALLDIR)
+	@$(ECHO)  SourceInstallDir..... $(SOURCEINSTALLDIR)
+	@$(ECHO)  DocInstallDir........ $(DOCINSTALLDIR)
+	@$(ECHO)  DataInstallDir....... $(DATAINSTALLDIR)
+	@$(ECHO)
+	@$(ECHO)  DestZipDir........... $(DESTZIPDIR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)
+
+#####################################################################
+# Local Makefile
+#####################################################################
+
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+

+ 17 - 0
packages/opengl/examples/Makefile.fpc

@@ -0,0 +1,17 @@
+#
+#   Makefile.fpc for GL demos
+#
+
+[targets]
+programs=glutdemo morph3d
+
+[require]
+packages=opengl
+packages_linux=x11
+
+[dirs]
+fpcdir=../../..
+
+[libs]
+libother=1
+libgcc=1

+ 159 - 0
packages/opengl/examples/glutdemo.pp

@@ -0,0 +1,159 @@
+{
+  GL units for Free Pascal - GLUT demo
+  1999 Sebastian Guenther, [email protected]
+
+  You may use this source as starting point for your own programs; consider it
+  as Public Domain.
+}
+
+
+{$MODE objfpc}
+{$H+}
+
+program GLUTDemo;
+uses
+  GL, GLU,GLUT;
+
+const
+
+  FPCImg: array[0..4, 0..10] of Byte =
+    ((1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1),
+     (1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0),
+     (1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0),
+     (1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0),
+     (1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1));
+
+var
+  counter: Integer;
+
+
+const
+  colors: array[0..7, 0..2] of Single =
+    ((0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1),
+     (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1));
+  corners: array[0..7, 0..2] of Single =
+    ((-1, -1, -1), (+1, -1, -1), (+1, +1, -1), (-1, +1, -1),
+     (-1, -1, +1), (+1, -1, +1), (+1, +1, +1), (-1, +1, +1));
+
+
+procedure DrawCube;
+  procedure DrawSide(i1, i2, i3, i4: Integer);
+  begin
+    glColor4f (colors [i1, 0], colors [i1, 1], colors [i1, 2], 0.5);
+    glVertex3f(corners[i1, 0], corners[i1, 1], corners[i1, 2]);
+    glColor4f (colors [i2, 0], colors [i2, 1], colors [i2, 2], 0.5);
+    glVertex3f(corners[i2, 0], corners[i2, 1], corners[i2, 2]);
+    glColor4f (colors [i3, 0], colors [i3, 1], colors [i3, 2], 0.5);
+    glVertex3f(corners[i3, 0], corners[i3, 1], corners[i3, 2]);
+
+    glVertex3f(corners[i4, 0], corners[i4, 1], corners[i4, 2]);
+  end;
+begin
+  glBegin(GL_QUADS);
+  DrawSide(4, 5, 6, 7);         // Front
+  DrawSide(3, 2, 1, 0);         // Back
+  DrawSide(2, 3, 7, 6);         // Top
+  DrawSide(0, 1, 5, 4);         // Bottom
+  DrawSide(4, 7, 3, 0);         // Left
+  DrawSide(1, 2, 6, 5);         // Right
+  glEnd;
+end;
+
+
+procedure DisplayWindow; cdecl;
+var
+  x, y: Integer;
+begin
+  Inc(counter);
+
+  glClearColor(0, 0, 0.2, 1);
+  glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT);
+
+  glPushMatrix;
+  glTranslatef(0, 0, Sin(Single(counter) / 20.0) * 5.0 - 5.0);
+  glRotatef(Sin(Single(counter) / 200.0) * 720.0, 0, 1, 0);
+  glRotatef(counter, 0, 0, 1);
+
+  for y := 0 to 4 do
+    for x := 0 to 10 do
+      if FPCImg[y, x] > 0 then begin
+        glPushMatrix;
+        glRotatef(x * Sin(Single(counter) / 5.0), 0, 1, 0);
+        glRotatef(y * Sin(Single(counter) / 12.0) * 4.0, 0, 0, 1);
+        glTranslatef((x - 5) * 1, (2 - y) * 1, 0);
+        glScalef(0.4, 0.4, 0.4);
+        glRotatef(counter, 0.5, 1, 0);
+        DrawCube;
+        glPopMatrix;
+      end;
+
+  glPopMatrix;
+
+  Inc(counter);
+
+  glutSwapBuffers;
+end;
+
+procedure OnTimer(value: Integer); cdecl;
+begin
+  glutPostRedisplay;
+  glutTimerFunc(20, @OnTimer, 0);
+end;
+
+begin
+
+  WriteLn('Dumping unresolved GL* function names; having unresolved functions ');
+  WriteLn('is NOT a problem as long as the application doesn''t use them!');
+  WriteLn('(Most unresolved functions will be propietary extensions which');
+  WriteLn(' should be an official GL extension)');
+  WriteLn;
+
+  GLDumpUnresolvedFunctions := True;
+  GLUDumpUnresolvedFunctions := True;
+  GLUTDumpUnresolvedFunctions := True;
+
+  if not InitGl then begin
+    WriteLn('OpenGL is not supported on this system');
+    Halt(2);
+  end;
+
+  if not InitGLU then begin
+    WriteLn('Couldn''t load GLU module');
+    Halt(3);
+  end;
+
+  if not InitGLUT then begin
+    WriteLn('Couldn''t load GLUT module');
+    Halt(5);
+  end;
+
+  glutInitDisplayMode(GLUT_RGB or GLUT_DOUBLE or GLUT_DEPTH);
+  glutCreateWindow('Free Pascal GLUT demo');
+  glutDisplayFunc(@DisplayWindow);
+  glutTimerFunc(20, @OnTimer, 0);
+
+  WriteLn;
+  WriteLn('GL info:');
+  WriteLn('  Vendor: ', glGetString(GL_VENDOR));
+  WriteLn('  Renderer: ', glGetString(GL_RENDERER));
+  WriteLn('  Version: ', glGetString(GL_VERSION));
+  WriteLn('  Extensions: ', glGetString(GL_EXTENSIONS));
+
+  // Enable backface culling
+  glEnable(GL_CULL_FACE);
+
+  // Set up depth buffer
+  glEnable(GL_DEPTH_TEST);
+  glDepthFunc(GL_LESS);
+
+  // Set up projection matrix
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity;
+  gluPerspective(90, 1.3, 0.1, 100);
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity;
+  glTranslatef(0, 0, -5.5);
+
+  glutMainLoop;
+
+end.

+ 928 - 0
packages/opengl/examples/morph3d.pp

@@ -0,0 +1,928 @@
+{
+ $Id$
+ *-
+ * morph3d.c - Shows 3D morphing objects
+ *
+ * Converted to GLUT by brianp on 1/1/98
+ * Converted to FreePascal by Peter Vreman on 9/3/2000
+ *
+ * This program was inspired on a WindowsNT(R)'s screen saver. It was written
+ * from scratch and it was not based on any other source code.
+ *
+ * Porting it to xlock (the final objective of this code since the moment I
+ * decided to create it) was possible by comparing the original Mesa's gear
+ * demo with it's ported version, so thanks for Danny Sung for his indirect
+ * help (look at gear.c in xlock source tree). NOTE: At the moment this code
+ * was sent to Brian Paul for package inclusion, the XLock Version was not
+ * available. In fact, I'll wait it to appear on the next Mesa release (If you
+ * are reading this, it means THIS release) to send it for xlock package
+ * inclusion). It will probably there be a GLUT version too.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home. *
+ * Since I'm not a native english speaker, my apologies for any gramatical
+ * mistake.
+ *
+ * My e-mail addresses are
+ *
+ * [email protected]
+ *         and
+ * [email protected]
+ *
+ * Marcelo F. Vianna (Feb-13-1997)
+ */
+}
+program morph3d;
+{$Mode objfpc}
+{$INLINE ON}
+
+{
+This document is VERY incomplete, but tries to describe the mathematics used
+in the program. At this moment it just describes how the polyhedra are
+generated. On futhurer versions, this document will be probabbly improved.
+
+Since I'm not a native english speaker, my apologies for any gramatical
+mistake.
+
+Marcelo Fernandes Vianna
+- Undergraduate in Computer Engeneering at Catholic Pontifical University
+- of Rio de Janeiro (PUC-Rio) Brasil.
+- e-mail: [email protected] or [email protected]
+- Feb-13-1997
+
+POLYHEDRA GENERATION
+
+For the purpose of this program it's not sufficient to know the polyhedra
+vertexes coordinates. Since the morphing algorithm applies a nonlinear
+transformation over the surfaces (faces) of the polyhedron, each face has
+to be divided into smaller ones. The morphing algorithm needs to transform
+each vertex of these smaller faces individually. It's a very time consoming
+task.
+
+In order to reduce calculation overload, and since all the macro faces of
+the polyhedron are transformed by the same way, the generation is made by
+creating only one face of the polyhedron, morphing it and then rotating it
+around the polyhedron center.
+
+What we need to know is the face radius of the polyhedron (the radius of
+the inscribed sphere) and the angle between the center of two adjacent
+faces using the center of the sphere as the angle's vertex.
+
+The face radius of the regular polyhedra are known values which I decided
+to not waste my time calculating. Following is a table of face radius for
+the regular polyhedra with edge length = 1:
+
+    TETRAHEDRON  : 1/(2*sqrt(2))/sqrt(3)
+    CUBE         : 1/2
+    OCTAHEDRON   : 1/sqrt(6)
+    DODECAHEDRON : T^2 * sqrt((T+2)/5) / 2     -> where T=(sqrt(5)+1)/2
+    ICOSAHEDRON  : (3*sqrt(3)+sqrt(15))/12
+
+I've not found any reference about the mentioned angles, so I needed to
+calculate them, not a trivial task until I figured out how :)
+Curiously these angles are the same for the tetrahedron and octahedron.
+A way to obtain this value is inscribing the tetrahedron inside the cube
+by matching their vertexes. So you'll notice that the remaining unmatched
+vertexes are in the same straight line starting in the cube/tetrahedron
+center and crossing the center of each tetrahedron's face. At this point
+it's easy to obtain the bigger angle of the isosceles triangle formed by
+the center of the cube and two opposite vertexes on the same cube face.
+The edges of this triangle have the following lenghts: sqrt(2) for the base
+and sqrt(3)/2 for the other two other edges. So the angle we want is:
+     +-----------------------------------------------------------+
+     | 2*ARCSIN(sqrt(2)/sqrt(3)) = 109.47122063449069174 degrees |
+     +-----------------------------------------------------------+
+For the cube this angle is obvious, but just for formality it can be
+easily obtained because we also know it's isosceles edge lenghts:
+sqrt(2)/2 for the base and 1/2 for the other two edges. So the angle we
+want is:
+     +-----------------------------------------------------------+
+     | 2*ARCSIN((sqrt(2)/2)/1)   = 90.000000000000000000 degrees |
+     +-----------------------------------------------------------+
+For the octahedron we use the same idea used for the tetrahedron, but now
+we inscribe the cube inside the octahedron so that all cubes's vertexes
+matches excatly the center of each octahedron's face. It's now clear that
+this angle is the same of the thetrahedron one:
+     +-----------------------------------------------------------+
+     | 2*ARCSIN(sqrt(2)/sqrt(3)) = 109.47122063449069174 degrees |
+     +-----------------------------------------------------------+
+For the dodecahedron it's a little bit harder because it's only relationship
+with the cube is useless to us. So we need to solve the problem by another
+way. The concept of Face radius also exists on 2D polygons with the name
+Edge radius:
+  Edge Radius For Pentagon (ERp)
+  ERp = (1/2)/TAN(36 degrees) * VRp = 0.6881909602355867905
+  (VRp is the pentagon's vertex radio).
+  Face Radius For Dodecahedron
+  FRd = T^2 * sqrt((T+2)/5) / 2 = 1.1135163644116068404
+Why we need ERp? Well, ERp and FRd segments forms a 90 degrees angle,
+completing this triangle, the lesser angle is a half of the angle we are
+looking for, so this angle is:
+     +-----------------------------------------------------------+
+     | 2*ARCTAN(ERp/FRd)         = 63.434948822922009981 degrees |
+     +-----------------------------------------------------------+
+For the icosahedron we can use the same method used for dodecahedron (well
+the method used for dodecahedron may be used for all regular polyhedra)
+  Edge Radius For Triangle (this one is well known: 1/3 of the triangle height)
+  ERt = sin(60)/3 = sqrt(3)/6 = 0.2886751345948128655
+  Face Radius For Icosahedron
+  FRi= (3*sqrt(3)+sqrt(15))/12 = 0.7557613140761707538
+So the angle is:
+     +-----------------------------------------------------------+
+     | 2*ARCTAN(ERt/FRi)         = 41.810314895778596167 degrees |
+     +-----------------------------------------------------------+
+}
+
+uses
+  GL,GLU,GLUT;
+
+type
+  float = single;
+
+const
+  Scale = 0.3;
+
+// #define sqr(A)                     ((A)*(A))
+
+// Increasing this values produces better image quality, the price is speed.
+// Very low values produces erroneous/incorrect plotting
+  tetradivisions            = 23;
+  cubedivisions             = 20;
+  octadivisions             = 21;
+  dodecadivisions           = 10;
+  icodivisions              = 15;
+
+  tetraangle                = 109.47122063449069174;
+  cubeangle                 = 90.000000000000000000;
+  octaangle                 = 109.47122063449069174;
+  dodecaangle               = 63.434948822922009981;
+  icoangle                  = 41.810314895778596167;
+
+//#define Pi                         3.1415926535897932385
+  SQRT2                     = 1.4142135623730951455;
+  SQRT3                     = 1.7320508075688771932;
+  SQRT5                     = 2.2360679774997898051;
+  SQRT6                     = 2.4494897427831778813;
+  SQRT15                    = 3.8729833462074170214;
+  cossec36_2                = 0.8506508083520399322;
+  cos72                     = 0.3090169943749474241;
+  sin72                     = 0.9510565162951535721;
+  cos36                     = 0.8090169943749474241;
+  sin36                     = 0.5877852522924731292;
+
+{*************************************************************************}
+
+const
+  mono   : boolean=false;
+  smooth : boolean=true;
+var
+  WindH,WindW   : GLint;
+  step,seno     : GLFloat;
+  _object       : glint;
+  edgedivisions : glint;
+  draw_object   : procedure;
+  Magnitude     : glfloat;
+  MaterialColor : array[0..19] of pglfloat;
+
+const
+  front_shininess : array[0..0] of glfloat = (60.0);
+  front_specular  : array[0..3] of glfloat = ( 0.7, 0.7, 0.7, 1.0 );
+  ambient         : array[0..3] of glfloat = ( 0.0, 0.0, 0.0, 1.0 );
+  diffuse         : array[0..3] of glfloat = ( 1.0, 1.0, 1.0, 1.0 );
+  position0       : array[0..3] of glfloat = ( 1.0, 1.0, 1.0, 0.0 );
+  position1       : array[0..3] of glfloat = (-1.0,-1.0, 1.0, 0.0 );
+  lmodel_ambient  : array[0..3] of glfloat = ( 0.5, 0.5, 0.5, 1.0 );
+  lmodel_twoside  : array[0..0] of glfloat = (GL_TRUE);
+
+  MaterialRed     : array[0..3] of glfloat = ( 0.7, 0.0, 0.0, 1.0 );
+  MaterialGreen   : array[0..3] of glfloat = ( 0.1, 0.5, 0.2, 1.0 );
+  MaterialBlue    : array[0..3] of glfloat = ( 0.0, 0.0, 0.7, 1.0 );
+  MaterialCyan    : array[0..3] of glfloat = ( 0.2, 0.5, 0.7, 1.0 );
+  MaterialYellow  : array[0..3] of glfloat = ( 0.7, 0.7, 0.0, 1.0 );
+  MaterialMagenta : array[0..3] of glfloat = ( 0.6, 0.2, 0.5, 1.0 );
+  MaterialWhite   : array[0..3] of glfloat = ( 0.7, 0.7, 0.7, 1.0 );
+  MaterialGray    : array[0..3] of glfloat = ( 0.2, 0.2, 0.2, 1.0 );
+
+procedure VectMul(X1,Y1,Z1,X2,Y2,Z2:GLFloat);inline;
+begin
+  glNormal3f((Y1)*(Z2)-(Z1)*(Y2),(Z1)*(X2)-(X1)*(Z2),(X1)*(Y2)-(Y1)*(X2));
+end;
+
+procedure TRIANGLE(Edge,Amp:GLFloat; Divisions: longint; Z:GLFloat);
+var
+  Xf,Yf,Xa,Yb,Xf2,Yf2 : GLfloat;
+  Factor,Factor1,Factor2 : GLfloat;
+  VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ : GLfloat;
+  Ax,Ay,Bx : GLfloat;
+  Ri,Ti : longint;
+  Vr : GLfloat;
+  AmpVr2 : GLfloat;
+  Zf : GLfloat;
+begin
+  Vr:=(Edge)*SQRT3/3;
+  AmpVr2:=(Amp)/sqr(Vr);
+  Zf:=(Edge)*(Z);
+
+  Ax:=(Edge)*(+0.5/(Divisions));
+  Ay:=(Edge)*(-SQRT3/(2*Divisions));
+  Bx:=(Edge)*(-0.5/(Divisions));
+
+  for Ri:=1 to Divisions do
+   begin
+    glBegin(GL_TRIANGLE_STRIP);
+    for Ti:=0 to Ri-1 do
+     begin
+      Xf:=(Ri-Ti)*Ax + Ti*Bx;
+      Yf:=Vr+(Ri-Ti)*Ay + Ti*Ay;
+      Xa:=Xf+0.001; Yb:=Yf+0.001;
+      Xf2:=sqr(Xf);
+      Yf2:=sqr(Yf);
+      Factor:=1-(((Xf2)+(Yf2))*AmpVr2);
+      Factor1:=1-((sqr(Xa)+Yf2)*AmpVr2);
+      Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+      VertX:=Factor*Xf;        VertY:=Factor*Yf;        VertZ:=Factor*Zf;
+      NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Yf-VertY; NeiAZ:=Factor1*Zf-VertZ;
+      NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+      VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ);
+      glVertex3f(VertX, VertY, VertZ);
+
+      Xf:=(Ri-Ti-1)*Ax + Ti*Bx;
+      Yf:=Vr+(Ri-Ti-1)*Ay + Ti*Ay;
+      Xa:=Xf+0.001; Yb:=Yf+0.001;
+      Xf2:=sqr(Xf);
+      Yf2:=sqr(Yf);
+      Factor:=1-(((Xf2)+(Yf2))*AmpVr2);
+      Factor1:=1-((sqr(Xa)+Yf2)*AmpVr2);
+      Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+      VertX:=Factor*Xf;        VertY:=Factor*Yf;        VertZ:=Factor*Zf;
+      NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Yf-VertY; NeiAZ:=Factor1*Zf-VertZ;
+      NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+      VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ);
+      glVertex3f(VertX, VertY, VertZ);
+     end;
+    Xf:=Ri*Bx;
+    Yf:=Vr+Ri*Ay;
+    Xa:=Xf+0.001; Yb:=Yf+0.001;
+    Xf2:=sqr(Xf);
+    Yf2:=sqr(Yf);
+    Factor:=1-((Xf2+Yf2)*AmpVr2);
+    Factor1:=1-((sqr(Xa)+Yf2)*AmpVr2);
+    Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+    VertX:=Factor*Xf;        VertY:=Factor*Yf;        VertZ:=Factor*Zf;
+    NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Yf-VertY; NeiAZ:=Factor1*Zf-VertZ;
+    NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+    VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ);
+    glVertex3f(VertX, VertY, VertZ);
+    glEnd();
+  end;
+end;
+
+
+procedure SQUARE(Edge,Amp:GLFloat; Divisions: longint; Z:GLFloat);
+var
+  Xi,Yi : longint;
+  Xf,Yf,Y,Y2,Xf2,Yf2,Xa,Yb : GLfloat;
+  Factor,Factor1,Factor2 : GLfloat;
+  VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ : GLfloat;
+  AmpVr2 : GLfloat;
+  Zf : GLfloat;
+begin
+  AmpVr2:=(Amp)/sqr((Edge)*SQRT2/2);
+  Zf:=(Edge)*(Z);
+
+  for Yi:=0 to Divisions-1 do
+   begin
+    Yf:=-((Edge)/2.0) + (Yi)/(Divisions)*(Edge);
+    Yf2:=sqr(Yf);
+    Y:=Yf+1.0/(Divisions)*(Edge);
+    Y2:=sqr(Y);
+    glBegin(GL_QUAD_STRIP);
+    for Xi:=0 to Divisions do
+     begin
+      Xf:=-((Edge)/2.0) + (Xi)/(Divisions)*(Edge);
+      Xf2:=sqr(Xf);
+
+      Xa:=Xf+0.001; Yb:=Y+0.001;
+      Factor:=1-((Xf2+Y2)*AmpVr2);
+      Factor1:=1-((sqr(Xa)+Y2)*AmpVr2);
+      Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+      VertX:=Factor*Xf;        VertY:=Factor*Y;         VertZ:=Factor*Zf;
+      NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Y-VertY;  NeiAZ:=Factor1*Zf-VertZ;
+      NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+      VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ);
+      glVertex3f(VertX, VertY, VertZ);
+
+      Xa:=Xf+0.001; Yb:=Yf+0.001;
+      Factor:=1-((Xf2+Yf2)*AmpVr2);
+      Factor1:=1-((sqr(Xa)+Yf2)*AmpVr2);
+      Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+      VertX:=Factor*Xf;        VertY:=Factor*Yf;        VertZ:=Factor*Zf;
+      NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Yf-VertY; NeiAZ:=Factor1*Zf-VertZ;
+      NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+      VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ);
+      glVertex3f(VertX, VertY, VertZ);
+     end;
+    glEnd();
+  end;
+end;
+
+procedure PENTAGON(Edge,Amp:GLFloat; Divisions: longint; Z:GLFloat);
+var
+  Ri,Ti,Fi : longint;
+  Xf,Yf,Xf2,Yf2,Xa,Yb : GLfloat;
+  X,Y : array[0..5] of GLFloat;
+  Factor,Factor1,Factor2 : GLfloat;
+  VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ : GLfloat;
+  AmpVr2 : GLfloat;
+  Zf : GLfloat;
+begin
+  AmpVr2:=(Amp)/sqr((Edge)*cossec36_2);
+  Zf:=(Edge)*(Z);
+
+  for Fi:=0 to 5 do
+   begin
+    x[Fi]:=-cos( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge);
+    y[Fi]:=sin( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge);
+   end;
+
+  for Ri:=1 to Divisions do
+   begin
+    for Fi:=0 to 4 do
+     begin
+      glBegin(GL_TRIANGLE_STRIP);
+      for Ti:=0 to Ri-1 do
+       begin
+        Xf:=(Ri-Ti)*x[Fi] + Ti*x[Fi+1];
+        Yf:=(Ri-Ti)*y[Fi] + Ti*y[Fi+1];
+        Xa:=Xf+0.001; Yb:=Yf+0.001;
+        Xf2:=sqr(Xf);
+        Yf2:=sqr(Yf);
+        Factor:=1-(((Xf2)+(Yf2))*AmpVr2);
+        Factor1:=1-((sqr(Xa)+Yf2)*AmpVr2);
+        Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+        VertX:=Factor*Xf;        VertY:=Factor*Yf;        VertZ:=Factor*Zf;
+        NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Yf-VertY; NeiAZ:=Factor1*Zf-VertZ;
+        NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+        VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ);
+        glVertex3f(VertX, VertY, VertZ);
+
+        Xf:=(Ri-Ti-1)*x[Fi] + Ti*x[Fi+1];
+        Yf:=(Ri-Ti-1)*y[Fi] + Ti*y[Fi+1];
+        Xa:=Xf+0.001; Yb:=Yf+0.001;
+        Xf2:=sqr(Xf);
+        Yf2:=sqr(Yf);
+        Factor:=1-(((Xf2)+(Yf2))*AmpVr2);
+        Factor1:=1-((sqr(Xa)+Yf2)*AmpVr2);
+        Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+        VertX:=Factor*Xf;        VertY:=Factor*Yf;        VertZ:=Factor*Zf;
+        NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Yf-VertY; NeiAZ:=Factor1*Zf-VertZ;
+        NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+        VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ);
+        glVertex3f(VertX, VertY, VertZ);
+       end;
+      Xf:=Ri*x[Fi+1];
+      Yf:=Ri*y[Fi+1];
+      Xa:=Xf+0.001; Yb:=Yf+0.001;
+      Xf2:=sqr(Xf);
+      Yf2:=sqr(Yf);
+      Factor:=1-(((Xf2)+(Yf2))*AmpVr2);
+      Factor1:=1-((sqr(Xa)+Yf2)*AmpVr2);
+      Factor2:=1-((Xf2+sqr(Yb))*AmpVr2);
+      VertX:=Factor*Xf;        VertY:=Factor*Yf;        VertZ:=Factor*Zf;
+      NeiAX:=Factor1*Xa-VertX; NeiAY:=Factor1*Yf-VertY; NeiAZ:=Factor1*Zf-VertZ;
+      NeiBX:=Factor2*Xf-VertX; NeiBY:=Factor2*Yb-VertY; NeiBZ:=Factor2*Zf-VertZ;
+      VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ);
+      glVertex3f(VertX, VertY, VertZ);
+      glEnd();
+     end;
+   end;
+end;
+
+
+procedure draw_tetra;
+var
+  list : GLuint;
+begin
+  list := glGenLists( 1 );
+  glNewList( list, GL_COMPILE );
+  TRIANGLE(2,seno,edgedivisions,0.5/SQRT6);
+  glEndList();
+
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-tetraangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+tetraangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+tetraangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+  glCallList(list);
+
+  glDeleteLists(list,1);
+end;
+
+
+procedure draw_cube;
+var
+  list : GLuint;
+begin
+  list := glGenLists( 1 );
+  glNewList( list, GL_COMPILE );
+  SQUARE(2, seno, edgedivisions, 0.5);
+  glEndList();
+
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+  glCallList(list);
+  glRotatef(cubeangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+  glCallList(list);
+  glRotatef(cubeangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+  glCallList(list);
+  glRotatef(cubeangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+  glCallList(list);
+  glRotatef(cubeangle,0,1,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+  glCallList(list);
+  glRotatef(2*cubeangle,0,1,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+  glCallList(list);
+
+  glDeleteLists(list,1);
+end;
+
+
+procedure draw_octa;
+var
+  list : GLuint;
+begin
+  list := glGenLists( 1 );
+  glNewList( list, GL_COMPILE );
+  TRIANGLE(2,seno,edgedivisions,1/SQRT6);
+  glEndList();
+
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-180+octaangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-octaangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-octaangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-180+octaangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-octaangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[6]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-octaangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[7]);
+  glCallList(list);
+
+  glDeleteLists(list,1);
+end;
+
+
+procedure draw_dodeca;
+const
+  TAU = ((SQRT5+1)/2);
+var
+  list : GLuint;
+begin
+  list := glGenLists( 1 );
+  glNewList( list, GL_COMPILE );
+  PENTAGON(1,seno,edgedivisions,sqr(TAU) * sqrt((TAU+2)/5) / 2);
+  glEndList();
+
+  glPushMatrix();
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+  glCallList(list);
+  glRotatef(180,0,0,1);
+  glPushMatrix();
+  glRotatef(-dodecaangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(-dodecaangle,cos72,sin72,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(-dodecaangle,cos72,-sin72,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(dodecaangle,cos36,-sin36,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(dodecaangle,cos36,sin36,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[6]);
+  glCallList(list);
+  glRotatef(180,0,0,1);
+  glPushMatrix();
+  glRotatef(-dodecaangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[7]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(-dodecaangle,cos72,sin72,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[8]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(-dodecaangle,cos72,-sin72,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[9]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(dodecaangle,cos36,-sin36,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[10]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(dodecaangle,cos36,sin36,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[11]);
+  glCallList(list);
+
+  glDeleteLists(list,1);
+end;
+
+
+procedure draw_ico;
+var
+  list : GLuint;
+begin
+  list := glGenLists( 1 );
+  glNewList( list, GL_COMPILE );
+  TRIANGLE(1.5,seno,edgedivisions,(3*SQRT3+SQRT15)/12);
+  glEndList();
+
+  glPushMatrix();
+
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-icoangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-icoangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[6]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[7]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[8]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-icoangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[9]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[10]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-icoangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[11]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[12]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[13]);
+  glCallList(list);
+  glPopMatrix();
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[14]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[15]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-icoangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[16]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[17]);
+  glCallList(list);
+  glPushMatrix();
+  glRotatef(180,0,1,0);
+  glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[18]);
+  glCallList(list);
+  glPopMatrix();
+  glRotatef(180,0,0,1);
+  glRotatef(-icoangle,1,0,0);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[19]);
+  glCallList(list);
+
+  glDeleteLists(list,1);
+end;
+
+
+procedure do_draw;cdecl;
+begin
+  glClear( GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT );
+
+  glPushMatrix();
+
+    glTranslatef( 0.0, 0.0, -10.0 );
+    glScalef( Scale*WindH/WindW, Scale, Scale );
+    glTranslatef(2.5*WindW/WindH*sin(step*1.11),2.5*cos(step*1.25*1.11),0);
+    glRotatef(step*100,1,0,0);
+    glRotatef(step*95,0,1,0);
+    glRotatef(step*90,0,0,1);
+
+  seno:=(sin(step)+1.0/3.0)*(4.0/5.0)*Magnitude;
+
+  draw_object();
+
+  glPopMatrix();
+
+  glFlush();
+
+  glutSwapBuffers();
+
+  step:=step+0.05;
+end;
+
+
+procedure do_idle;cdecl;
+begin
+  glutPostRedisplay();
+end;
+
+
+procedure do_reshape(width,height:longint);cdecl;
+begin
+  WindW:=width;
+  WindH:=height;
+  glViewport(0, 0, width, height);
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 );
+  glMatrixMode(GL_MODELVIEW);
+end;
+
+
+procedure pinit;
+var
+  loop : longint;
+begin
+  case _object of
+    1 :
+    begin
+      draw_object:=draw_tetra;
+      MaterialColor[0]:=@MaterialRed;
+      MaterialColor[1]:=@MaterialGreen;
+      MaterialColor[2]:=@MaterialBlue;
+      MaterialColor[3]:=@MaterialWhite;
+      edgedivisions:=tetradivisions;
+      Magnitude:=2.5;
+    end;
+    2:
+    begin
+      draw_object:=draw_cube;
+      MaterialColor[0]:=@MaterialRed;
+      MaterialColor[1]:=@MaterialGreen;
+      MaterialColor[2]:=@MaterialCyan;
+      MaterialColor[3]:=@MaterialMagenta;
+      MaterialColor[4]:=@MaterialYellow;
+      MaterialColor[5]:=@MaterialBlue;
+      edgedivisions:=cubedivisions;
+      Magnitude:=2.0;
+    end;
+    3:
+    begin
+      draw_object:=draw_octa;
+      MaterialColor[0]:=MaterialRed;
+      MaterialColor[1]:=MaterialGreen;
+      MaterialColor[2]:=MaterialBlue;
+      MaterialColor[3]:=MaterialWhite;
+      MaterialColor[4]:=MaterialCyan;
+      MaterialColor[5]:=MaterialMagenta;
+      MaterialColor[6]:=MaterialGray;
+      MaterialColor[7]:=MaterialYellow;
+      edgedivisions:=octadivisions;
+      Magnitude:=2.5;
+    end;
+    4:
+    begin
+      draw_object:=draw_dodeca;
+      MaterialColor[ 0]:=MaterialRed;
+      MaterialColor[ 1]:=MaterialGreen;
+      MaterialColor[ 2]:=MaterialCyan;
+      MaterialColor[ 3]:=MaterialBlue;
+      MaterialColor[ 4]:=MaterialMagenta;
+      MaterialColor[ 5]:=MaterialYellow;
+      MaterialColor[ 6]:=MaterialGreen;
+      MaterialColor[ 7]:=MaterialCyan;
+      MaterialColor[ 8]:=MaterialRed;
+      MaterialColor[ 9]:=MaterialMagenta;
+      MaterialColor[10]:=MaterialBlue;
+      MaterialColor[11]:=MaterialYellow;
+      edgedivisions:=dodecadivisions;
+      Magnitude:=2.0;
+    end;
+    5:
+    begin
+      draw_object:=draw_ico;
+      MaterialColor[ 0]:=MaterialRed;
+      MaterialColor[ 1]:=MaterialGreen;
+      MaterialColor[ 2]:=MaterialBlue;
+      MaterialColor[ 3]:=MaterialCyan;
+      MaterialColor[ 4]:=MaterialYellow;
+      MaterialColor[ 5]:=MaterialMagenta;
+      MaterialColor[ 6]:=MaterialRed;
+      MaterialColor[ 7]:=MaterialGreen;
+      MaterialColor[ 8]:=MaterialBlue;
+      MaterialColor[ 9]:=MaterialWhite;
+      MaterialColor[10]:=MaterialCyan;
+      MaterialColor[11]:=MaterialYellow;
+      MaterialColor[12]:=MaterialMagenta;
+      MaterialColor[13]:=MaterialRed;
+      MaterialColor[14]:=MaterialGreen;
+      MaterialColor[15]:=MaterialBlue;
+      MaterialColor[16]:=MaterialCyan;
+      MaterialColor[17]:=MaterialYellow;
+      MaterialColor[18]:=MaterialMagenta;
+      MaterialColor[19]:=MaterialGray;
+      edgedivisions:=icodivisions;
+      Magnitude:=2.5;
+    end;
+  end;
+  if (mono) then
+   begin
+     for loop:=0 to 19 do
+      MaterialColor[loop]:=MaterialGray;
+   end;
+  if (smooth) then
+    glShadeModel( GL_SMOOTH )
+  else
+    glShadeModel( GL_FLAT );
+end;
+
+
+procedure do_key(k:char;x,y:integer);cdecl;
+begin
+{  case k of
+    '1' : _object:=1;
+    '2' : _object:=2;
+    '3' : _object:=3;
+    '4' : _object:=4;
+    '5' : _object:=5;
+    ' ' : mono:=not mono;
+    #13 : smooth:=not smooth;
+    #27 : halt(0);
+  end;
+  pinit;}
+end;
+
+
+begin
+  writeln('Morph 3D - Shows morphing platonic polyhedra');
+  writeln('Author: Marcelo Fernandes Vianna ([email protected])');
+  writeln('  [1]    - Tetrahedron');
+  writeln('  [2]    - Hexahedron (Cube)');
+  writeln('  [3]    - Octahedron');
+  writeln('  [4]    - Dodecahedron');
+  writeln('  [5]    - Icosahedron');
+  writeln('[SPACE]  - Toggle colored faces');
+  writeln('[RETURN] - Toggle smooth/flat shading');
+  writeln(' [ESC]   - Quit');
+  _object:=3;
+
+  glutInitWindowPosition(0,0);
+  glutInitWindowSize(640,480);
+
+  glutInitDisplayMode( GLUT_DEPTH + GLUT_DOUBLE + GLUT_RGB );
+
+  if (glutCreateWindow('Morph 3D - Shows morphing platonic polyhedra') <= 0) then
+    halt(1);
+
+  glClearDepth(1.0);
+  glClearColor( 0.0, 0.0, 0.0, 1.0 );
+  glColor3f( 1.0, 1.0, 1.0 );
+
+  glClear( GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT );
+  glFlush();
+  glutSwapBuffers();
+
+  glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+  glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+  glLightfv(GL_LIGHT0, GL_POSITION, position0);
+  glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+  glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+  glLightfv(GL_LIGHT1, GL_POSITION, position1);
+  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+  glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+  glEnable(GL_LIGHTING);
+  glEnable(GL_LIGHT0);
+  glEnable(GL_LIGHT1);
+  glEnable(GL_DEPTH_TEST);
+  glEnable(GL_NORMALIZE);
+
+  glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+  glHint(GL_FOG_HINT, GL_FASTEST);
+  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
+  glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST);
+
+  pinit();
+
+  glutReshapeFunc( @do_reshape );
+  glutKeyboardFunc( @do_key );
+  glutIdleFunc( @do_idle );
+  glutDisplayFunc( @do_draw );
+  glutMainLoop();
+end.
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}

+ 1336 - 0
packages/opengl/gtkgl/Makefile

@@ -0,0 +1,1336 @@
+#
+# Makefile generated by fpcmake v1.00 [2000/09/02]
+#
+
+defaultrule: all
+
+#####################################################################
+# Autodetect OS (Linux or Dos or Windows NT)
+# define inlinux when running under linux
+# define inWinNT when running under WinNT
+#####################################################################
+
+# We need only / in the path
+override PATH:=$(subst \,/,$(PATH))
+
+# Search for PWD and determine also if we are under linux
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(subst ;, ,$(PATH)))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(subst :, ,$(PATH)))))
+ifeq ($(PWD),)
+nopwd:
+	@echo You need the GNU utils package to use this Makefile!
+	@echo Get ftp://ftp.freepascal.org/pub/fpc/dist/go32v2/utilgo32.zip
+	@exit
+else
+inlinux=1
+endif
+else
+PWD:=$(firstword $(PWD))
+endif
+
+# Detect NT - NT sets OS to Windows_NT
+ifndef inlinux
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+endif
+endif
+
+# Detect OS/2 - OS/2 has OS2_SHELL defined
+ifndef inlinux
+ifndef inWinNT
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+endif
+
+# The extension of executables
+ifdef inlinux
+EXEEXT=
+else
+EXEEXT=.exe
+endif
+
+# The path which is searched separated by spaces
+ifdef inlinux
+SEARCHPATH=$(subst :, ,$(PATH))
+else
+SEARCHPATH=$(subst ;, ,$(PATH))
+endif
+
+# Base dir
+ifdef PWD
+BASEDIR:=$(shell $(PWD))
+else
+BASEDIR=.
+endif
+
+#####################################################################
+# FPC version/target Detection
+#####################################################################
+
+# What compiler to use ?
+ifndef FPC
+# Compatibility with old makefiles
+ifdef PP
+FPC=$(PP)
+else
+ifdef inOS2
+FPC=ppos2
+else
+FPC=ppc386
+endif
+endif
+endif
+override FPC:=$(subst $(EXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(EXEEXT)
+
+# Target OS
+ifndef OS_TARGET
+OS_TARGET:=$(shell $(FPC) -iTO)
+endif
+
+# Source OS
+ifndef OS_SOURCE
+OS_SOURCE:=$(shell $(FPC) -iSO)
+endif
+
+# Target CPU
+ifndef CPU_TARGET
+CPU_TARGET:=$(shell $(FPC) -iTP)
+endif
+
+# Source CPU
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(shell $(FPC) -iSP)
+endif
+
+# FPC version
+ifndef FPC_VERSION
+FPC_VERSION:=$(shell $(FPC) -iV)
+endif
+
+export FPC OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FPC_VERSION
+
+#####################################################################
+# FPCDIR Setting
+#####################################################################
+
+# Test FPCDIR to look if the RTL dir exists
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=wrong
+endif
+endif
+else
+override FPCDIR=wrong
+endif
+
+# Default FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR=../../..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=wrong
+endif
+endif
+endif
+
+# Detect FPCDIR
+ifeq ($(FPCDIR),wrong)
+ifdef inlinux
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+endif
+
+ifndef PACKAGESDIR
+PACKAGESDIR=$(FPCDIR)/packages
+endif
+ifndef TOOLKITSDIR
+TOOLKITSDIR=
+endif
+ifndef COMPONENTSDIR
+COMPONENTSDIR=
+endif
+
+# Create units dir
+ifneq ($(FPCDIR),.)
+UNITSDIR=$(FPCDIR)/units/$(OS_TARGET)
+endif
+
+#####################################################################
+# User Settings
+#####################################################################
+
+
+# Targets
+
+override UNITOBJECTS+=gtkglarea
+override EXAMPLEOBJECTS+=gtkgldemo
+
+# Clean
+
+
+# Install
+
+ZIPTARGET=install
+
+# Defaults
+
+
+# Directories
+
+
+# Packages
+
+override PACKAGES+=rtl opengl gtk
+ifeq ($(OS_TARGET),linux)
+override PACKAGES+=x11
+endif
+
+# Libraries
+
+override NEEDOTHERLIB=1
+
+# Info
+
+INFOTARGET=fpc_infocfg fpc_infoobjects fpc_infoinstall 
+
+#####################################################################
+# Shell tools
+#####################################################################
+
+# echo
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=echo
+ECHOE:=echo
+else
+ECHO:=$(firstword $(ECHO))
+ECHOE=$(ECHO) -E
+endif
+else
+ECHO:=$(firstword $(ECHO))
+ECHOE=$(ECHO) -E
+endif
+endif
+
+# To copy pograms
+ifndef COPY
+COPY:=cp -fp
+endif
+
+# Copy a whole tree
+ifndef COPYTREE
+COPYTREE:=cp -rfp
+endif
+
+# To move pograms
+ifndef MOVE
+MOVE:=mv -f
+endif
+
+# Check delete program
+ifndef DEL
+DEL:=rm -f
+endif
+
+# Check deltree program
+ifndef DELTREE
+DELTREE:=rm -rf
+endif
+
+# To install files
+ifndef INSTALL
+ifdef inlinux
+INSTALL:=install -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+
+# To install programs
+ifndef INSTALLEXE
+ifdef inlinux
+INSTALLEXE:=install -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+
+# To make a directory.
+ifndef MKDIR
+ifdef inlinux
+MKDIR:=install -m 755 -d
+else
+MKDIR:=ginstall -m 755 -d
+endif
+endif
+
+export ECHO ECHOE COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+
+#####################################################################
+# Default Tools
+#####################################################################
+
+# assembler, redefine it if cross compiling
+ifndef AS
+AS=as
+endif
+
+# linker, but probably not used
+ifndef LD
+LD=ld
+endif
+
+# ppas.bat / ppas.sh
+ifdef inlinux
+PPAS=ppas.sh
+else
+ifdef inOS2
+PPAS=ppas.cmd
+else
+PPAS=ppas.bat
+endif
+endif
+
+# ldconfig to rebuild .so cache
+ifdef inlinux
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+
+# ppumove
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE=
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+
+# ppufiles
+ifndef PPUFILES
+PPUFILES:=$(strip $(wildcard $(addsuffix /ppufiles$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUFILES),)
+PPUFILES=
+else
+PPUFILES:=$(firstword $(PPUFILES))
+endif
+endif
+export PPUFILES
+
+# Look if UPX is found for go32v2 and win32. We can't use $UPX becuase
+# upx uses that one itself (PFV)
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+
+# ZipProg, you can't use Zip as the var name (PFV)
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG=
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+
+ZIPOPT=-9
+ZIPEXT=.zip
+
+# Tar
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG=
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+
+ifeq ($(USETAR),bz2)
+TAROPT=vI
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+
+#####################################################################
+# Default extensions
+#####################################################################
+
+# Default needed extensions (Go32v2,Linux)
+LOADEREXT=.as
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+RSTEXT=.rst
+FPCMADE=fpcmade
+
+# Go32v1
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+FPCMADE=fpcmade.v1
+endif
+
+# Go32v2
+ifeq ($(OS_TARGET),go32v2)
+FPCMADE=fpcmade.dos
+endif
+
+# Linux
+ifeq ($(OS_TARGET),linux)
+FPCMADE=fpcmade.lnx
+endif
+
+# Win32
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.w32
+endif
+
+# OS/2
+ifeq ($(OS_TARGET),os2)
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+SMARTEXT=.so
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.os2
+endif
+
+# library prefix
+LIBPREFIX=lib
+ifeq ($(OS_TARGET),go32v2)
+LIBPREFIX=
+endif
+ifeq ($(OS_TARGET),go32v1)
+LIBPREFIX=
+endif
+
+# determine which .pas extension is used
+ifndef PASEXT
+ifdef EXEOBJECTS
+override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(EXEOBJECTS)))))
+else
+override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(UNITOBJECTS)))))
+endif
+ifeq ($(TESTPAS),)
+PASEXT=.pp
+else
+PASEXT=.pas
+endif
+endif
+
+
+# Check if the dirs really exists, else turn it off
+ifeq ($(wildcard $(UNITSDIR)),)
+UNITSDIR=
+endif
+ifeq ($(wildcard $(TOOLKITSDIR)),)
+TOOLKITSDIR=
+endif
+ifeq ($(wildcard $(PACKAGESDIR)),)
+PACKAGESDIR=
+endif
+ifeq ($(wildcard $(COMPONENTSDIR)),)
+COMPONENTSDIR=
+endif
+
+
+# PACKAGESDIR packages
+
+PACKAGERTL=1
+PACKAGEOPENGL=1
+PACKAGEGTK=1
+ifeq ($(OS_TARGET),linux)
+PACKAGEX11=1
+endif
+
+ifdef PACKAGERTL
+ifneq ($(wildcard $(FPCDIR)/rtl),)
+ifneq ($(wildcard $(FPCDIR)/rtl/$(OS_TARGET)),)
+PACKAGEDIR_RTL=$(FPCDIR)/rtl/$(OS_TARGET)
+else
+PACKAGEDIR_RTL=$(FPCDIR)/rtl
+endif
+ifeq ($(wildcard $(PACKAGEDIR_RTL)/$(FPCMADE)),)
+override COMPILEPACKAGES+=package_rtl
+package_rtl:
+	$(MAKE) -C $(PACKAGEDIR_RTL) all
+endif
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+else
+PACKAGEDIR_RTL=
+ifneq ($(wildcard $(UNITSDIR)/rtl),)
+ifneq ($(wildcard $(UNITSDIR)/rtl/$(OS_TARGET)),)
+UNITDIR_RTL=$(UNITSDIR)/rtl/$(OS_TARGET)
+else
+UNITDIR_RTL=$(UNITSDIR)/rtl
+endif
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override NEEDUNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifdef PACKAGEOPENGL
+ifneq ($(wildcard $(PACKAGESDIR)/opengl),)
+ifneq ($(wildcard $(PACKAGESDIR)/opengl/$(OS_TARGET)),)
+PACKAGEDIR_OPENGL=$(PACKAGESDIR)/opengl/$(OS_TARGET)
+else
+PACKAGEDIR_OPENGL=$(PACKAGESDIR)/opengl
+endif
+ifeq ($(wildcard $(PACKAGEDIR_OPENGL)/$(FPCMADE)),)
+override COMPILEPACKAGES+=package_opengl
+package_opengl:
+	$(MAKE) -C $(PACKAGEDIR_OPENGL) all
+endif
+UNITDIR_OPENGL=$(PACKAGEDIR_OPENGL)
+else
+PACKAGEDIR_OPENGL=
+ifneq ($(wildcard $(UNITSDIR)/opengl),)
+ifneq ($(wildcard $(UNITSDIR)/opengl/$(OS_TARGET)),)
+UNITDIR_OPENGL=$(UNITSDIR)/opengl/$(OS_TARGET)
+else
+UNITDIR_OPENGL=$(UNITSDIR)/opengl
+endif
+else
+UNITDIR_OPENGL=
+endif
+endif
+ifdef UNITDIR_OPENGL
+override NEEDUNITDIR+=$(UNITDIR_OPENGL)
+endif
+endif
+ifdef PACKAGEGTK
+ifneq ($(wildcard $(PACKAGESDIR)/gtk),)
+ifneq ($(wildcard $(PACKAGESDIR)/gtk/$(OS_TARGET)),)
+PACKAGEDIR_GTK=$(PACKAGESDIR)/gtk/$(OS_TARGET)
+else
+PACKAGEDIR_GTK=$(PACKAGESDIR)/gtk
+endif
+ifeq ($(wildcard $(PACKAGEDIR_GTK)/$(FPCMADE)),)
+override COMPILEPACKAGES+=package_gtk
+package_gtk:
+	$(MAKE) -C $(PACKAGEDIR_GTK) all
+endif
+UNITDIR_GTK=$(PACKAGEDIR_GTK)
+else
+PACKAGEDIR_GTK=
+ifneq ($(wildcard $(UNITSDIR)/gtk),)
+ifneq ($(wildcard $(UNITSDIR)/gtk/$(OS_TARGET)),)
+UNITDIR_GTK=$(UNITSDIR)/gtk/$(OS_TARGET)
+else
+UNITDIR_GTK=$(UNITSDIR)/gtk
+endif
+else
+UNITDIR_GTK=
+endif
+endif
+ifdef UNITDIR_GTK
+override NEEDUNITDIR+=$(UNITDIR_GTK)
+endif
+endif
+ifdef PACKAGEX11
+ifneq ($(wildcard $(PACKAGESDIR)/x11),)
+ifneq ($(wildcard $(PACKAGESDIR)/x11/$(OS_TARGET)),)
+PACKAGEDIR_X11=$(PACKAGESDIR)/x11/$(OS_TARGET)
+else
+PACKAGEDIR_X11=$(PACKAGESDIR)/x11
+endif
+ifeq ($(wildcard $(PACKAGEDIR_X11)/$(FPCMADE)),)
+override COMPILEPACKAGES+=package_x11
+package_x11:
+	$(MAKE) -C $(PACKAGEDIR_X11) all
+endif
+UNITDIR_X11=$(PACKAGEDIR_X11)
+else
+PACKAGEDIR_X11=
+ifneq ($(wildcard $(UNITSDIR)/x11),)
+ifneq ($(wildcard $(UNITSDIR)/x11/$(OS_TARGET)),)
+UNITDIR_X11=$(UNITSDIR)/x11/$(OS_TARGET)
+else
+UNITDIR_X11=$(UNITSDIR)/x11
+endif
+else
+UNITDIR_X11=
+endif
+endif
+ifdef UNITDIR_X11
+override NEEDUNITDIR+=$(UNITDIR_X11)
+endif
+endif
+
+
+#####################################################################
+# Default Directories
+#####################################################################
+
+# set the prefix directory where to install everything
+ifndef PREFIXINSTALLDIR
+ifdef inlinux
+PREFIXINSTALLDIR=/usr
+else
+PREFIXINSTALLDIR=/pp
+endif
+endif
+export PREFIXINSTALLDIR
+
+# Where to place the resulting zip files
+ifndef DESTZIPDIR
+DESTZIPDIR:=$(BASEDIR)
+endif
+export DESTZIPDIR
+
+# Where to find other libraries
+ifdef inlinux
+ifndef OTHERLIBDIR
+OTHERLIBDIR:=$(shell grep -v "^\#" /etc/ld.so.conf | awk '{ ORS=" "; print $1 }')
+endif
+endif
+export OTHERLIBDIR
+
+#####################################################################
+# Install Directories
+#####################################################################
+
+# set the base directory where to install everything
+ifndef BASEINSTALLDIR
+ifdef inlinux
+BASEINSTALLDIR=$(PREFIXINSTALLDIR)/lib/fpc/$(FPC_VERSION)
+else
+BASEINSTALLDIR=$(PREFIXINSTALLDIR)
+endif
+endif
+
+# set the directory where to install the binaries
+ifndef BININSTALLDIR
+ifdef inlinux
+BININSTALLDIR=$(PREFIXINSTALLDIR)/bin
+else
+BININSTALLDIR=$(BASEINSTALLDIR)/bin/$(OS_TARGET)
+endif
+endif
+
+# set the directory where to install the units.
+ifndef UNITINSTALLDIR
+UNITINSTALLDIR=$(BASEINSTALLDIR)/units/$(OS_TARGET)
+ifdef UNITSUBDIR
+UNITINSTALLDIR:=$(UNITINSTALLDIR)/$(UNITSUBDIR)
+endif
+endif
+
+# Where to install shared libraries
+ifndef LIBINSTALLDIR
+ifdef inlinux
+LIBINSTALLDIR=$(PREFIXINSTALLDIR)/lib
+else
+LIBINSTALLDIR=$(UNITINSTALLDIR)
+endif
+endif
+
+# Where the source files will be stored
+ifndef SOURCEINSTALLDIR
+ifdef inlinux
+SOURCEINSTALLDIR=$(PREFIXINSTALLDIR)/src/fpc-$(FPC_VERSION)
+else
+SOURCEINSTALLDIR=$(BASEINSTALLDIR)/source
+endif
+ifdef SOURCESUBDIR
+SOURCEINSTALLDIR:=$(SOURCEINSTALLDIR)/$(SOURCESUBDIR)
+endif
+endif
+
+# Where the doc files will be stored
+ifndef DOCINSTALLDIR
+ifdef inlinux
+DOCINSTALLDIR=$(PREFIXINSTALLDIR)/doc/fpc-$(FPC_VERSION)
+else
+DOCINSTALLDIR=$(BASEINSTALLDIR)/doc
+endif
+endif
+
+# Where to install the examples, under linux we use the doc dir
+# because the copytree command will create a subdir itself
+ifndef EXAMPLEINSTALLDIR
+ifdef inlinux
+EXAMPLEINSTALLDIR=$(DOCINSTALLDIR)/examples
+else
+EXAMPLEINSTALLDIR=$(BASEINSTALLDIR)/examples
+endif
+ifdef EXAMPLESUBDIR
+EXAMPLEINSTALLDIR:=$(EXAMPLEINSTALLDIR)/$(EXAMPLESUBDIR)
+endif
+endif
+
+# Where the some extra (data)files will be stored
+ifndef DATAINSTALLDIR
+DATAINSTALLDIR=$(BASEINSTALLDIR)
+endif
+
+#####################################################################
+# Redirection
+#####################################################################
+
+ifndef REDIRFILE
+REDIRFILE=log
+endif
+
+ifdef REDIR
+ifndef inlinux
+override FPC=redir -eo $(FPC)
+endif
+# set the verbosity to max
+override FPCOPT+=-va
+override REDIR:= >> $(REDIRFILE)
+endif
+
+
+#####################################################################
+# Compiler Command Line
+#####################################################################
+
+# Load commandline OPTDEF and add FPC_CPU define
+override FPCOPTDEF:=-d$(CPU_TARGET)
+
+# Load commandline OPT and add target and unit dir to be sure
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+
+# User dirs should be first, so they are looked at first
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+
+# Smartlinking
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+
+# Smartlinking creation
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+
+# Debug
+ifdef DEBUG
+override FPCOPT+=-g -dDEBUG
+endif
+
+# Release mode (strip, optimize and don't load ppc386.cfg)
+# 0.99.12b has a bug in the optimizer so don't use it by default
+ifdef RELEASE
+ifeq ($(FPC_VERSION),0.99.12)
+override FPCOPT+=-Xs -OGp3 -n
+else
+override FPCOPT+=-Xs -OG2p3 -n
+endif
+endif
+
+# Strip
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+
+# Optimizer
+ifdef OPTIMIZE
+override FPCOPT+=-OG2p3
+endif
+
+# Verbose settings (warning,note,info)
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+
+ifdef NEEDUNITDIR
+override FPCOPT+=$(addprefix -Fu,$(NEEDUNITDIR))
+endif
+
+ifdef UNITSDIR
+override FPCOPT+=-Fu$(UNITSDIR)
+endif
+
+# Add Other dirs path if asked
+ifdef OTHERLIBDIR
+override FPCOPT+=$(addprefix -Fl,$(OTHERLIBDIR))
+endif
+
+# Target dirs and the prefix to use for clean/install
+ifdef TARGETDIR
+override FPCOPT+=-FE$(TARGETDIR)
+ifeq ($(TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(TARGETDIR)/
+endif
+endif
+ifdef UNITTARGETDIR
+override FPCOPT+=-FU$(UNITTARGETDIR)
+ifeq ($(UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(TARGETDIR)/
+endif
+else
+ifdef TARGETDIR
+override UNITTARGETDIR=$(TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+
+# Add commandline options last so they can override
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+
+# Add defines from FPCOPTDEF to FPCOPT
+ifdef FPCOPTDEF
+override FPCOPT+=$(FPCOPTDEF)
+endif
+
+# Error file ?
+ifdef ERRORFILE
+override FPCOPT+=-Fr$(ERRORFILE)
+endif
+
+# Was a config file specified ?
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+
+# For win32 the options are passed using the environment FPCEXTCMD
+ifeq ($(OS_SOURCE),win32)
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+
+# Compiler commandline
+override COMPILER:=$(FPC) $(FPCOPT)
+
+# also call ppas if with command option -s
+# but only if the OS_SOURCE and OS_TARGE are equal
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(OS_SOURCE),$(OS_TARGET))
+EXECPPAS:=@$(PPAS)
+endif
+endif
+
+#####################################################################
+# Standard rules
+#####################################################################
+
+all: fpc_all
+
+debug: fpc_debug
+
+examples: fpc_examples
+
+test: fpc_test
+
+smart: fpc_smart
+
+shared: fpc_shared
+
+showinstall: fpc_showinstall
+
+install: fpc_install
+
+sourceinstall: fpc_sourceinstall
+
+exampleinstall: fpc_exampleinstall
+
+zipinstall: fpc_zipinstall
+
+zipsourceinstall: fpc_zipsourceinstall
+
+zipexampleinstall: fpc_zipexampleinstall
+
+clean: fpc_clean
+
+distclean: fpc_distclean
+
+cleanall: fpc_cleanall
+
+info: fpc_info
+
+.PHONY:  all debug examples test smart shared showinstall install sourceinstall exampleinstall zipinstall zipsourceinstall zipexampleinstall clean distclean cleanall info
+
+#####################################################################
+# Units
+#####################################################################
+
+.PHONY: fpc_units
+
+override ALLTARGET+=fpc_units
+
+override UNITPPUFILES=$(addsuffix $(PPUEXT),$(UNITOBJECTS))
+override INSTALLPPUFILES+=$(UNITPPUFILES)
+override CLEANPPUFILES+=$(UNITPPUFILES)
+
+fpc_units: $(UNITPPUFILES)
+
+#####################################################################
+# Examples
+#####################################################################
+
+.PHONY: fpc_examples fpc_test
+
+ifdef EXAMPLEOBJECTS
+override EXAMPLESOURCEFILES:=$(addsuffix $(PASEXT),$(EXAMPLEOBJECTS))
+override EXAMPLEFILES:=$(addsuffix $(EXEEXT),$(EXAMPLEOBJECTS))
+override EXAMPLEOFILES:=$(addsuffix $(OEXT),$(EXAMPLEOBJECTS))
+
+override CLEANEXEFILES+=$(EXAMPLEFILES) $(EXAMPLEOFILES)
+endif
+
+fpc_examples: all $(EXAMPLEFILES) $(addsuffix _all,$(EXAMPLEDIROBJECTS))
+
+fpc_test: examples
+
+#####################################################################
+# General compile rules
+#####################################################################
+
+.PHONY: fpc_packages fpc_all fpc_debug
+
+$(FPCMADE): $(ALLTARGET)
+	@$(ECHO) Compiled > $(FPCMADE)
+
+fpc_packages: $(COMPILEPACKAGES)
+
+fpc_all: fpc_packages $(FPCMADE)
+
+fpc_debug:
+	$(MAKE) all DEBUG=1
+
+# Search paths for .ppu if targetdir is set
+ifdef UNITTARGETDIR
+vpath %$(PPUEXT) $(UNITTARGETDIR)
+endif
+
+# General compile rules, available for both possible PASEXT
+
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .pp
+
+%$(PPUEXT): %.pp
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(PPUEXT): %.pas
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(EXEEXT): %.pp
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(EXEEXT): %.pas
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+#####################################################################
+# Library
+#####################################################################
+
+.PHONY: fpc_smart fpc_shared
+
+ifdef LIBVERSION
+LIBFULLNAME=$(LIBNAME).$(LIBVERSION)
+else
+LIBFULLNAME=$(LIBNAME)
+endif
+
+# Default sharedlib units are all unit objects
+ifndef SHAREDLIBUNITOBJECTS
+SHAREDLIBUNITOBJECTS:=$(UNITOBJECTS)
+endif
+
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+
+fpc_shared: all
+ifdef inlinux
+ifndef LIBNAME
+	@$(ECHO) "LIBNAME not set"
+else
+	$(PPUMOVE) $(SHAREDLIBUNITOBJECTS) -o$(LIBFULLNAME)
+endif
+else
+	@$(ECHO) "Shared Libraries not supported"
+endif
+
+#####################################################################
+# Install rules
+#####################################################################
+
+.PHONY: fpc_showinstall fpc_install
+
+ifdef EXTRAINSTALLUNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(EXTRAINSTALLUNITS))
+endif
+
+ifdef INSTALLPPUFILES
+override INSTALLPPUFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLPPUFILES))
+ifdef PPUFILES
+INSTALLPPULINKFILES:=$(shell $(PPUFILES) -S -O $(INSTALLPPUFILES))
+else
+INSTALLPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(LIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))))
+endif
+override INSTALLPPULINKFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLPPULINKFILES))
+endif
+
+ifdef INSTALLEXEFILES
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLEXEFILES))
+endif
+
+fpc_showinstall: $(SHOWINSTALLTARGET)
+ifdef INSTALLEXEFILES
+	@$(ECHO) -e $(addprefix "\n"$(BININSTALLDIR)/,$(INSTALLEXEFILES))
+endif
+ifdef INSTALLPPUFILES
+	@$(ECHO) -e $(addprefix "\n"$(UNITINSTALLDIR)/,$(INSTALLPPUFILES))
+ifneq ($(INSTALLPPULINKFILES),)
+	@$(ECHO) -e $(addprefix "\n"$(UNITINSTALLDIR)/,$(INSTALLPPULINKFILES))
+endif
+ifneq ($(wildcard $(LIBFULLNAME)),)
+	@$(ECHO) $(LIBINSTALLDIR)/$(LIBFULLNAME)
+ifdef inlinux
+	@$(ECHO) $(LIBINSTALLDIR)/$(LIBNAME)
+endif
+endif
+endif
+ifdef EXTRAINSTALLFILES
+	@$(ECHO) -e $(addprefix "\n"$(DATAINSTALLDIR)/,$(EXTRAINSTALLFILES))
+endif
+
+fpc_install: $(INSTALLTARGET)
+# Create UnitInstallFiles
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(BININSTALLDIR)
+# Compress the exes if upx is defined
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(BININSTALLDIR)
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(UNITINSTALLDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(UNITINSTALLDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(UNITINSTALLDIR)
+endif
+ifneq ($(wildcard $(LIBFULLNAME)),)
+	$(MKDIR) $(LIBINSTALLDIR)
+	$(INSTALL) $(LIBFULLNAME) $(LIBINSTALLDIR)
+ifdef inlinux
+	ln -sf $(LIBFULLNAME) $(LIBINSTALLDIR)/$(LIBNAME)
+endif
+endif
+endif
+ifdef EXTRAINSTALLFILES
+	$(MKDIR) $(DATAINSTALLDIR)
+	$(INSTALL) $(EXTRAINSTALLFILES) $(DATAINSTALLDIR)
+endif
+
+#####################################################################
+# SourceInstall rules
+#####################################################################
+
+.PHONY: fpc_sourceinstall
+
+ifndef SOURCETOPDIR
+SOURCETOPDIR=$(BASEDIR)
+endif
+
+fpc_sourceinstall: clean
+	$(MKDIR) $(SOURCEINSTALLDIR)
+	$(COPYTREE) $(SOURCETOPDIR) $(SOURCEINSTALLDIR)
+
+#####################################################################
+# exampleinstall rules
+#####################################################################
+
+.PHONY: fpc_exampleinstall
+
+fpc_exampleinstall: $(addsuffix _clean,$(EXAMPLEDIROBJECTS))
+ifdef EXAMPLESOURCEFILES
+	$(MKDIR) $(EXAMPLEINSTALLDIR)
+	$(COPY) $(EXAMPLESOURCEFILES) $(EXAMPLEINSTALLDIR)
+endif
+ifdef EXAMPLEDIROBJECTS
+ifndef EXAMPLESOURCEFILES
+	$(MKDIR) $(EXAMPLEINSTALLDIR)
+endif
+	$(COPYTREE) $(addsuffix /*,$(EXAMPLEDIROBJECTS)) $(EXAMPLEINSTALLDIR)
+endif
+
+#####################################################################
+# Zip
+#####################################################################
+
+.PHONY: fpc_zipinstall
+
+# Create suffix to add
+ifndef PACKAGESUFFIX
+PACKAGESUFFIX=$(OS_TARGET)
+ifeq ($(OS_TARGET),go32v2)
+PACKAGESUFFIX=go32
+endif
+ifeq ($(OS_TARGET),win32)
+PACKAGESUFFIX=w32
+endif
+endif
+
+# Temporary path to pack a file
+ifndef PACKDIR
+ifndef inlinux
+PACKDIR=$(BASEDIR)/pack_tmp
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+
+# Maybe create default zipname from packagename
+ifndef ZIPNAME
+ifdef PACKAGENAME
+ZIPNAME=$(PACKAGEPREFIX)$(PACKAGENAME)$(PACKAGESUFFIX)
+endif
+endif
+
+# Use tar by default under linux
+ifndef USEZIP
+ifdef inlinux
+USETAR=1
+endif
+endif
+
+fpc_zipinstall:
+ifndef ZIPNAME
+	@$(ECHO) "Please specify ZIPNAME!"
+	@exit 1
+else
+	$(MAKE) $(ZIPTARGET) PREFIXINSTALLDIR=$(PACKDIR)
+ifdef USETAR
+	$(DEL) $(DESTZIPDIR)/$(ZIPNAME)$(TAREXT)
+	cd $(PACKDIR) ; $(TARPROG) c$(TAROPT) --file $(DESTZIPDIR)/$(ZIPNAME)$(TAREXT) * ; cd $(BASEDIR)
+else
+	$(DEL) $(DESTZIPDIR)/$(ZIPNAME)$(ZIPEXT)
+	cd $(PACKDIR) ; $(ZIPPROG) -Dr $(ZIPOPT) $(DESTZIPDIR)/$(ZIPNAME)$(ZIPEXT) * ; cd $(BASEDIR)
+endif
+	$(DELTREE) $(PACKDIR)
+endif
+
+.PHONY:  fpc_zipsourceinstall
+
+fpc_zipsourceinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall PACKAGESUFFIX=src
+
+.PHONY:  fpc_zipexampleinstall
+
+fpc_zipexampleinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall PACKAGESUFFIX=exm
+
+#####################################################################
+# Clean rules
+#####################################################################
+
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+
+ifdef EXTRACLEANUNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(EXTRACLEANUNITS))
+endif
+
+ifdef CLEANPPUFILES
+override CLEANPPUFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANPPUFILES))
+# Get the .o and .a files created for the units
+ifdef PPUFILES
+CLEANPPULINKFILES:=$(shell $(PPUFILES) $(CLEANPPUFILES))
+else
+CLEANPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(LIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))))
+endif
+override CLEANPPULINKFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANPPULINKFILES))
+endif
+
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef EXTRACLEANFILES
+	-$(DEL) $(EXTRACLEANFILES)
+endif
+ifdef LIBNAME
+	-$(DEL) $(LIBNAME) $(LIBFULLNAME)
+endif
+	-$(DEL) $(FPCMADE) $(PPAS) link.res $(FPCEXTFILE) $(REDIRFILE)
+
+fpc_distclean: fpc_clean
+
+# Also run clean first if targetdir is set. Unittargetdir is always
+# set if targetdir or unittargetdir is specified
+ifdef UNITTARGETDIR
+TARGETDIRCLEAN=fpc_clean
+endif
+
+fpc_cleanall: $(CLEANTARGET) $(TARGETDIRCLEAN)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) $(FPCMADE) $(PPAS) link.res $(FPCEXTFILE) $(REDIRFILE)
+
+#####################################################################
+# Info rules
+#####################################################################
+
+.PHONY: fpc_info fpc_cfginfo fpc_objectinfo fpc_toolsinfo fpc_installinfo \
+	fpc_dirinfo
+
+fpc_info: $(INFOTARGET)
+
+fpc_infocfg:
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC....... $(FPC)
+	@$(ECHO)  Version... $(FPC_VERSION)
+	@$(ECHO)  CPU....... $(CPU_TARGET)
+	@$(ECHO)  Source.... $(OS_SOURCE)
+	@$(ECHO)  Target.... $(OS_TARGET)
+	@$(ECHO)
+
+fpc_infoobjects:
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  LoaderObjects..... $(LOADEROBJECTS)
+	@$(ECHO)  UnitObjects....... $(UNITOBJECTS)
+	@$(ECHO)  ExeObjects........ $(EXEOBJECTS)
+	@$(ECHO)
+	@$(ECHO)  ExtraCleanUnits... $(EXTRACLEANUNITS)
+	@$(ECHO)  ExtraCleanFiles... $(EXTRACLEANFILES)
+	@$(ECHO)
+	@$(ECHO)  ExtraInstallUnits. $(EXTRAINSTALLUNITS)
+	@$(ECHO)  ExtraInstallFiles. $(EXTRAINSTALLFILES)
+	@$(ECHO)
+
+fpc_infoinstall:
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+ifdef DATE
+	@$(ECHO)  DateStr.............. $(DATESTR)
+endif
+ifdef PACKAGEPREFIX
+	@$(ECHO)  PackagePrefix........ $(PACKAGEPREFIX)
+endif
+ifdef PACKAGENAME
+	@$(ECHO)  PackageName.......... $(PACKAGENAME)
+endif
+	@$(ECHO)  PackageSuffix........ $(PACKAGESUFFIX)
+	@$(ECHO)
+	@$(ECHO)  BaseInstallDir....... $(BASEINSTALLDIR)
+	@$(ECHO)  BinInstallDir........ $(BININSTALLDIR)
+	@$(ECHO)  LibInstallDir........ $(LIBINSTALLDIR)
+	@$(ECHO)  UnitInstallDir....... $(UNITINSTALLDIR)
+	@$(ECHO)  SourceInstallDir..... $(SOURCEINSTALLDIR)
+	@$(ECHO)  DocInstallDir........ $(DOCINSTALLDIR)
+	@$(ECHO)  DataInstallDir....... $(DATAINSTALLDIR)
+	@$(ECHO)
+	@$(ECHO)  DestZipDir........... $(DESTZIPDIR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)
+
+#####################################################################
+# Local Makefile
+#####################################################################
+
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+

+ 17 - 0
packages/opengl/gtkgl/Makefile.fpc

@@ -0,0 +1,17 @@
+#
+#   Makefile.fpc for GtkGLArea
+#
+
+[targets]
+units=gtkglarea
+examples=gtkgldemo
+
+[require]
+packages=opengl gtk
+packages_linux=x11
+
+[dirs]
+fpcdir=../../..
+
+[libs]
+libother=1

+ 178 - 0
packages/opengl/gtkgl/gtkglarea.pp

@@ -0,0 +1,178 @@
+{
+  $Id$
+
+  Translation of the gtkglarea 4 headers for Free Pascal
+  Copyright (C) 2000 Sebastian Guenther
+
+  Copyright notice of gtkglarea:
+
+  * Copyright (C) 1997-1998 Janne Löf <[email protected]>
+  *
+  * This library is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Library General Public
+  * License as published by the Free Software Foundation; either
+  * version 2 of the License, or (at your option) any later version.
+  *
+  * This library is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Library General Public License for more details.
+  *
+  * You should have received a copy of the GNU Library General Public
+  * License along with this library; if not, write to the Free
+  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+unit gtkglarea;
+
+{$MODE objfpc}
+{$PACKRECORDS C}
+
+interface
+
+uses
+  GDK, GTK, GL;
+
+const
+  libgtkgl = 'gtkgl';
+
+// ===================================================================
+//   gdkgl
+// ===================================================================
+
+{
+  These definitions are duplicated from GL/glx.h that comes with Mesa.
+  I don't want every program to include GL/glx.h, that might become
+  problem if GtkGLArea is ever ported to non X environments like
+  (horror!) Windows.
+}
+
+// enum _GDK_GL_CONFIGS
+  GDK_GL_NONE                           = 0;
+  GDK_GL_USE_GL                         = 1;
+  GDK_GL_BUFFER_SIZE                    = 2;
+  GDK_GL_LEVEL                          = 3;
+  GDK_GL_RGBA                           = 4;
+  GDK_GL_DOUBLEBUFFER                   = 5;
+  GDK_GL_STEREO                         = 6;
+  GDK_GL_AUX_BUFFERS                    = 7;
+  GDK_GL_RED_SIZE                       = 8;
+  GDK_GL_GREEN_SIZE                     = 9;
+  GDK_GL_BLUE_SIZE                      = 10;
+  GDK_GL_ALPHA_SIZE                     = 11;
+  GDK_GL_DEPTH_SIZE                     = 12;
+  GDK_GL_STENCIL_SIZE                   = 13;
+  GDK_GL_ACCUM_RED_SIZE                 = 14;
+  GDK_GL_ACCUM_GREEN_SIZE               = 15;
+  GDK_GL_ACCUM_BLUE_SIZE                = 16;
+  GDK_GL_ACCUM_ALPHA_SIZE               = 17;
+
+  // GLX_EXT_visual_info extension
+  GDK_GL_X_VISUAL_TYPE_EXT              = $22;
+  GDK_GL_TRANSPARENT_TYPE_EXT           = $23;
+  GDK_GL_TRANSPARENT_INDEX_VALUE_EXT    = $24;
+  GDK_GL_TRANSPARENT_RED_VALUE_EXT      = $25;
+  GDK_GL_TRANSPARENT_GREEN_VALUE_EXT    = $26;
+  GDK_GL_TRANSPARENT_BLUE_VALUE_EXT     = $27;
+  GDK_GL_TRANSPARENT_ALPHA_VALUE_EXT    = $28;
+
+
+type
+
+  TGdkGLContext = record end;
+  PGdkGLContext = ^TGdkGLContext;
+
+
+function  gdk_gl_query: Integer; cdecl; external libgtkgl;
+function  gdk_gl_choose_visual(attrList: PInteger): PGdkVisual; cdecl; external libgtkgl;
+{$ifndef win32}
+function  gdk_gl_get_config(visual: PGdkVisual; attrib: Integer): Integer; cdecl; external libgtkgl;
+function  gdk_gl_context_new(visual: PGdkVisual): PGdkGLContext; cdecl; external libgtkgl;
+function  gdk_gl_context_share_new(visual: PGdkVisual; sharelist: PGdkGLContext; direct: Integer): PGdkGLContext; cdecl; external libgtkgl;
+function  gdk_gl_context_ref(context: PGdkGLContext): PGdkGLContext; cdecl; external libgtkgl;
+procedure gdk_gl_context_unref(context: PGdkGLContext); cdecl; external libgtkgl;
+{$endif}
+function  gdk_gl_make_current(drawable: PGdkDrawable; context: PGdkGLContext): Integer; cdecl; external libgtkgl;
+procedure gdk_gl_swap_buffers(drawable: PGdkDrawable); cdecl; external libgtkgl;
+procedure gdk_gl_wait_gdk; cdecl; external libgtkgl;
+procedure gdk_gl_wait_gl; cdecl; external libgtkgl;
+
+
+// glpixmap stuff
+
+type
+
+  TGdkGLPixmap = record end;
+  PGdkGLPixmap = ^TGdkGLPixmap;
+
+{$ifndef win32}
+function  gdk_gl_pixmap_new(visual: PGdkVisual; pixmap: PGdkPixmap): PGdkGLPixmap; cdecl; external libgtkgl;
+function  gdk_gl_pixmap_ref(glpixmap: PGdkGLPixmap): PGdkGLPixmap; cdecl; external libgtkgl;
+procedure gdk_gl_pixmap_unref(glpixmap: PGdkGLPixmap); cdecl; external libgtkgl;
+function  gdk_gl_pixmap_make_current(glpixmap: PGdkGLPixmap; context: PGdkGLContext): Integer; cdecl; external libgtkgl;
+{$endif}
+
+
+// fonts
+{$ifndef win32}
+procedure gdk_gl_use_gdk_font(font: PGdkFont; first, count, list_base: Integer); cdecl; external libgtkgl;
+{$endif}
+
+
+// ===================================================================
+//   gtkglarea
+// ===================================================================
+
+type
+
+  PGtkGLArea = ^TGtkGLArea;
+
+  TGtkGLArea = record
+    darea: TGtkDrawingArea;
+    glcontext: PGdkGLContext;
+  end;
+
+
+  PGtkGLAreaClass = ^TGtkGLAreaClass;
+  TGtkGLAreaClass = record
+    parent_class: TGtkDrawingAreaClass;
+  end;
+
+
+function  GTK_TYPE_GL_AREA: TGtkType; cdecl; external libgtkgl name 'gtk_gl_area_get_type';
+function  GTK_IS_GL_AREA(obj: Pointer): Boolean;
+function  GTK_IS_GL_AREA_CLASS(klass: Pointer): Boolean;
+
+function  gtk_gl_area_get_type: TGtkType; cdecl; external libgtkgl;
+function  gtk_gl_area_new(attrList: PInteger): PGtkWidget; cdecl; external libgtkgl;
+function  gtk_gl_area_share_new(attrList: PInteger; share: PGtkGLArea): PGtkWidget; cdecl; external libgtkgl;
+function  gtk_gl_area_new_vargs(share: PGtkGLArea; args: array of const): PGtkWidget; cdecl; external libgtkgl;
+
+function  gtk_gl_area_make_current(glarea: PGtkGLArea): Integer; cdecl; external libgtkgl;
+procedure gtk_gl_area_swapbuffers(glarea: PGtkGLArea); cdecl; external libgtkgl;
+
+
+implementation
+
+
+function GTK_IS_GL_AREA(obj: Pointer): Boolean;
+begin
+  Result := Assigned(obj) and GTK_IS_GL_AREA_CLASS(PGtkTypeObject(obj)^.klass);
+end;
+
+function GTK_IS_GL_AREA_CLASS(klass: Pointer): Boolean;
+begin
+  Result := Assigned(klass) and (PGtkTypeClass(klass)^.thetype = GTK_TYPE_GL_AREA);
+end;
+
+
+end.
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}

+ 196 - 0
packages/opengl/gtkgl/gtkgldemo.pp

@@ -0,0 +1,196 @@
+{$MODE DELPHI}
+
+{$ifdef win32}
+  {$APPTYPE GUI}
+{$endif}
+
+program gtkgldemo;
+
+uses  glib, gdk, gtk, gtkglarea,gl;
+
+
+function init(widget:PGtkWidget ):gint;cdecl;
+
+begin
+  if (gint(True)=gtk_gl_area_make_current(PGtkGLArea(widget))) then
+    begin
+
+      glViewport(0,0, widget^.allocation.width, widget^.allocation.height);
+      glMatrixMode(GL_PROJECTION);
+      glLoadIdentity();
+      glOrtho(0,100, 100,0, -1,1);
+      glMatrixMode(GL_MODELVIEW);
+      glLoadIdentity();
+
+    end;
+
+  init:= gint(TRUE);
+end;
+
+
+
+
+(* When widget is exposed it's contents are redrawn. *)
+
+function draw(widget: PGtkWidget; event: PGdkEventExpose): gint; cdecl;
+
+begin
+
+  (* Draw only last expose. *)
+  if (event^.count > 0) then
+    exit(gint(TRUE));
+
+  (* OpenGL functions can be called only if make_current returns true *)
+  if (gint(True) = gtk_gl_area_make_current(PGtkGLArea(widget))) then
+    begin
+
+     glClearColor(0,0,0,1);
+     glClear(GL_COLOR_BUFFER_BIT);
+     glColor3f(1,1,1);
+     glBegin(GL_TRIANGLES);
+     glVertex2f(10,10);
+     glVertex2f(10,90);
+     glVertex2f(90,90);
+     glEnd();
+
+     (* Swap backbuffer to front *)
+     gtk_gl_area_swapbuffers(PGtkGLArea(widget));
+
+    end;
+
+  exit(gint(TRUE));
+end;
+
+(* When glarea widget size changes, viewport size is set to match the new size *)
+
+function  reshape(widget:PGtkWidget; event: PGdkEventConfigure):gint; cdecl;
+begin
+
+  (* OpenGL functions can be called only if make_current returns true *)
+  if (gint(True) = gtk_gl_area_make_current(PGtkGLArea(widget))) then
+    begin
+
+     glViewport(0, 0, widget^.allocation.width, widget^.allocation.height);
+
+    end;
+  exit( gint(TRUE));
+end;
+
+var
+   window,glarea: PGtkWidget;
+
+  (* Attribute list for gtkglarea widget. Specifies a
+     list of Boolean attributes and enum/integer
+     attribute/value pairs. The last attribute must be
+     GDK_GL_NONE. See glXChooseVisual manpage for further
+     explanation.
+  *)
+
+  const
+     attrlist: array [1..11] of LongInt=
+                    ( GDK_GL_RGBA,
+                    GDK_GL_RED_SIZE, 1,
+                    GDK_GL_GREEN_SIZE, 1,
+                    GDK_GL_BLUE_SIZE, 1,
+                      GDK_GL_DEPTH_SIZE,1,
+                    GDK_GL_DOUBLEBUFFER,
+                    GDK_GL_None
+                    );
+
+(*  int attrlist[] = {
+    GDK_GL_RGBA,
+    GDK_GL_RED_SIZE,1,
+    GDK_GL_GREEN_SIZE,1,
+    GDK_GL_BLUE_SIZE,1,
+    GDK_GL_DOUBLEBUFFER,
+    GDK_GL_NONE
+  };
+*)
+
+begin
+  (* OpenGL functions can be called only if make_current returns true *)
+  if not InitGl then begin
+    WriteLn('OpenGL is not supported on this system');
+    Halt(2);
+  end;
+
+
+  (* initialize gtk *)
+  gtk_init(@argc, @argv);
+
+  (* Attribute list for gtkglarea widget. Specifies a
+      list of Boolean attributes and enum/integer
+      attribute/value pairs. The last attribute must be
+      GDK_GL_NONE. See glXChooseVisual manpage for further
+      explanation.
+   *)
+
+
+  (* vendor dependent version info string *)
+ { info_str = gdk_gl_get_info();
+  g_print(info_str);
+  g_free(info_str);}
+
+  (* Check if OpenGL is supported. *)
+ { if (gdk_gl_query() = FALSE) then
+  begin
+    g_print("OpenGL not supported\n");
+    return 0;
+  end;}
+
+
+
+
+  (* Create new top level window. *)
+    window := gtk_window_new( GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_title(GTK_WINDOW(window), 'OpenGL Output');
+  gtk_container_set_border_width(GTK_CONTAINER(window), 10);
+
+  (* Quit form main if got delete event *)
+    gtk_signal_connect(GTK_OBJECT(window), 'delete_event',
+                     GTK_SIGNAL_FUNC(@gtk_main_quit), NULL);
+
+
+  (* You should always delete gtk_gl_area widgets before exit or else
+       GLX contexts are left undeleted, this may cause problems (=core dump)
+       in some systems.
+       Destroy method of objects is not automatically called on exit.
+       You need to manually enable this feature. Do gtk_quit_add_destroy()
+       for all your top level windows unless you are certain that they get
+       destroy signal by other means.
+    *)
+    gtk_quit_add_destroy(1, GTK_OBJECT(window));
+
+
+    (* Create new OpenGL widget. *)
+  glarea := GTK_WIDGET(gtk_gl_area_new(pgint(@attrlist)));
+
+  (* Events for widget must be set before X Window is created *)
+    gtk_widget_set_events(GTK_WIDGET(glarea),
+                        GDK_EXPOSURE_MASK or
+                        GDK_BUTTON_PRESS_MASK);
+
+    (* Connect signal handlers *)
+    (* Redraw image when exposed. *)
+    gtk_signal_connect(GTK_OBJECT(glarea), 'expose_event', GTK_SIGNAL_FUNC(@draw), Nil);
+
+    (* When window is resized viewport needs to be resized also. *)
+    gtk_signal_connect(GTK_OBJECT(glarea), 'configure_event', GTK_SIGNAL_FUNC(@reshape), Nil);
+
+    (* Do initialization when widget has been realized. *)
+    gtk_signal_connect(GTK_OBJECT(glarea), 'realize', GTK_SIGNAL_FUNC(@init), Nil);
+
+    (* set minimum size *)
+    gtk_widget_set_usize(GTK_WIDGET(glarea), 400,400);
+
+    (* put glarea into window and show it all *)
+    gtk_container_add(GTK_CONTAINER(window),GTK_WIDGET(glarea));
+
+
+    gtk_widget_show(GTK_WIDGET(glarea));
+
+    gtk_widget_show(GTK_WIDGET(window));
+
+  gtk_main();
+
+end.

+ 1240 - 0
packages/opengl/linux/Makefile

@@ -0,0 +1,1240 @@
+#
+# Makefile generated by fpcmake v1.00 [2000/09/02]
+#
+
+defaultrule: all
+
+#####################################################################
+# Autodetect OS (Linux or Dos or Windows NT)
+# define inlinux when running under linux
+# define inWinNT when running under WinNT
+#####################################################################
+
+# We need only / in the path
+override PATH:=$(subst \,/,$(PATH))
+
+# Search for PWD and determine also if we are under linux
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(subst ;, ,$(PATH)))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(subst :, ,$(PATH)))))
+ifeq ($(PWD),)
+nopwd:
+	@echo You need the GNU utils package to use this Makefile!
+	@echo Get ftp://ftp.freepascal.org/pub/fpc/dist/go32v2/utilgo32.zip
+	@exit
+else
+inlinux=1
+endif
+else
+PWD:=$(firstword $(PWD))
+endif
+
+# Detect NT - NT sets OS to Windows_NT
+ifndef inlinux
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+endif
+endif
+
+# Detect OS/2 - OS/2 has OS2_SHELL defined
+ifndef inlinux
+ifndef inWinNT
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+endif
+
+# The extension of executables
+ifdef inlinux
+EXEEXT=
+else
+EXEEXT=.exe
+endif
+
+# The path which is searched separated by spaces
+ifdef inlinux
+SEARCHPATH=$(subst :, ,$(PATH))
+else
+SEARCHPATH=$(subst ;, ,$(PATH))
+endif
+
+# Base dir
+ifdef PWD
+BASEDIR:=$(shell $(PWD))
+else
+BASEDIR=.
+endif
+
+#####################################################################
+# Default target
+#####################################################################
+
+override OS_TARGET:=linux
+
+#####################################################################
+# FPC version/target Detection
+#####################################################################
+
+# What compiler to use ?
+ifndef FPC
+# Compatibility with old makefiles
+ifdef PP
+FPC=$(PP)
+else
+ifdef inOS2
+FPC=ppos2
+else
+FPC=ppc386
+endif
+endif
+endif
+override FPC:=$(subst $(EXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(EXEEXT)
+
+# Target OS
+ifndef OS_TARGET
+OS_TARGET:=$(shell $(FPC) -iTO)
+endif
+
+# Source OS
+ifndef OS_SOURCE
+OS_SOURCE:=$(shell $(FPC) -iSO)
+endif
+
+# Target CPU
+ifndef CPU_TARGET
+CPU_TARGET:=$(shell $(FPC) -iTP)
+endif
+
+# Source CPU
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(shell $(FPC) -iSP)
+endif
+
+# FPC version
+ifndef FPC_VERSION
+FPC_VERSION:=$(shell $(FPC) -iV)
+endif
+
+export FPC OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FPC_VERSION
+
+#####################################################################
+# FPCDIR Setting
+#####################################################################
+
+# Test FPCDIR to look if the RTL dir exists
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=wrong
+endif
+endif
+else
+override FPCDIR=wrong
+endif
+
+# Default FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR=../../..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=wrong
+endif
+endif
+endif
+
+# Detect FPCDIR
+ifeq ($(FPCDIR),wrong)
+ifdef inlinux
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+endif
+
+ifndef PACKAGESDIR
+PACKAGESDIR=$(FPCDIR)/packages
+endif
+ifndef TOOLKITSDIR
+TOOLKITSDIR=
+endif
+ifndef COMPONENTSDIR
+COMPONENTSDIR=
+endif
+
+# Create units dir
+ifneq ($(FPCDIR),.)
+UNITSDIR=$(FPCDIR)/units/$(OS_TARGET)
+endif
+
+#####################################################################
+# User Settings
+#####################################################################
+
+
+# Targets
+
+override UNITOBJECTS+=gl glu glx glut
+
+# Clean
+
+
+# Install
+
+ZIPTARGET=install
+
+# Defaults
+
+
+# Directories
+
+
+# Packages
+
+override PACKAGES+=rtl x11
+
+# Libraries
+
+
+# Info
+
+INFOTARGET=fpc_infocfg fpc_infoobjects fpc_infoinstall 
+
+#####################################################################
+# Shell tools
+#####################################################################
+
+# echo
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=echo
+ECHOE:=echo
+else
+ECHO:=$(firstword $(ECHO))
+ECHOE=$(ECHO) -E
+endif
+else
+ECHO:=$(firstword $(ECHO))
+ECHOE=$(ECHO) -E
+endif
+endif
+
+# To copy pograms
+ifndef COPY
+COPY:=cp -fp
+endif
+
+# Copy a whole tree
+ifndef COPYTREE
+COPYTREE:=cp -rfp
+endif
+
+# To move pograms
+ifndef MOVE
+MOVE:=mv -f
+endif
+
+# Check delete program
+ifndef DEL
+DEL:=rm -f
+endif
+
+# Check deltree program
+ifndef DELTREE
+DELTREE:=rm -rf
+endif
+
+# To install files
+ifndef INSTALL
+ifdef inlinux
+INSTALL:=install -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+
+# To install programs
+ifndef INSTALLEXE
+ifdef inlinux
+INSTALLEXE:=install -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+
+# To make a directory.
+ifndef MKDIR
+ifdef inlinux
+MKDIR:=install -m 755 -d
+else
+MKDIR:=ginstall -m 755 -d
+endif
+endif
+
+export ECHO ECHOE COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+
+#####################################################################
+# Default Tools
+#####################################################################
+
+# assembler, redefine it if cross compiling
+ifndef AS
+AS=as
+endif
+
+# linker, but probably not used
+ifndef LD
+LD=ld
+endif
+
+# ppas.bat / ppas.sh
+ifdef inlinux
+PPAS=ppas.sh
+else
+ifdef inOS2
+PPAS=ppas.cmd
+else
+PPAS=ppas.bat
+endif
+endif
+
+# ldconfig to rebuild .so cache
+ifdef inlinux
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+
+# ppumove
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE=
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+
+# ppufiles
+ifndef PPUFILES
+PPUFILES:=$(strip $(wildcard $(addsuffix /ppufiles$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUFILES),)
+PPUFILES=
+else
+PPUFILES:=$(firstword $(PPUFILES))
+endif
+endif
+export PPUFILES
+
+# Look if UPX is found for go32v2 and win32. We can't use $UPX becuase
+# upx uses that one itself (PFV)
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+
+# ZipProg, you can't use Zip as the var name (PFV)
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG=
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+
+ZIPOPT=-9
+ZIPEXT=.zip
+
+# Tar
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG=
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+
+ifeq ($(USETAR),bz2)
+TAROPT=vI
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+
+#####################################################################
+# Default extensions
+#####################################################################
+
+# Default needed extensions (Go32v2,Linux)
+LOADEREXT=.as
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+RSTEXT=.rst
+FPCMADE=fpcmade
+
+# Go32v1
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+FPCMADE=fpcmade.v1
+endif
+
+# Go32v2
+ifeq ($(OS_TARGET),go32v2)
+FPCMADE=fpcmade.dos
+endif
+
+# Linux
+ifeq ($(OS_TARGET),linux)
+FPCMADE=fpcmade.lnx
+endif
+
+# Win32
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.w32
+endif
+
+# OS/2
+ifeq ($(OS_TARGET),os2)
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+SMARTEXT=.so
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.os2
+endif
+
+# library prefix
+LIBPREFIX=lib
+ifeq ($(OS_TARGET),go32v2)
+LIBPREFIX=
+endif
+ifeq ($(OS_TARGET),go32v1)
+LIBPREFIX=
+endif
+
+# determine which .pas extension is used
+ifndef PASEXT
+ifdef EXEOBJECTS
+override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(EXEOBJECTS)))))
+else
+override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(UNITOBJECTS)))))
+endif
+ifeq ($(TESTPAS),)
+PASEXT=.pp
+else
+PASEXT=.pas
+endif
+endif
+
+
+# Check if the dirs really exists, else turn it off
+ifeq ($(wildcard $(UNITSDIR)),)
+UNITSDIR=
+endif
+ifeq ($(wildcard $(TOOLKITSDIR)),)
+TOOLKITSDIR=
+endif
+ifeq ($(wildcard $(PACKAGESDIR)),)
+PACKAGESDIR=
+endif
+ifeq ($(wildcard $(COMPONENTSDIR)),)
+COMPONENTSDIR=
+endif
+
+
+# PACKAGESDIR packages
+
+PACKAGERTL=1
+PACKAGEX11=1
+
+ifdef PACKAGERTL
+ifneq ($(wildcard $(FPCDIR)/rtl),)
+ifneq ($(wildcard $(FPCDIR)/rtl/$(OS_TARGET)),)
+PACKAGEDIR_RTL=$(FPCDIR)/rtl/$(OS_TARGET)
+else
+PACKAGEDIR_RTL=$(FPCDIR)/rtl
+endif
+ifeq ($(wildcard $(PACKAGEDIR_RTL)/$(FPCMADE)),)
+override COMPILEPACKAGES+=package_rtl
+package_rtl:
+	$(MAKE) -C $(PACKAGEDIR_RTL) all
+endif
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+else
+PACKAGEDIR_RTL=
+ifneq ($(wildcard $(UNITSDIR)/rtl),)
+ifneq ($(wildcard $(UNITSDIR)/rtl/$(OS_TARGET)),)
+UNITDIR_RTL=$(UNITSDIR)/rtl/$(OS_TARGET)
+else
+UNITDIR_RTL=$(UNITSDIR)/rtl
+endif
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override NEEDUNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifdef PACKAGEX11
+ifneq ($(wildcard $(PACKAGESDIR)/x11),)
+ifneq ($(wildcard $(PACKAGESDIR)/x11/$(OS_TARGET)),)
+PACKAGEDIR_X11=$(PACKAGESDIR)/x11/$(OS_TARGET)
+else
+PACKAGEDIR_X11=$(PACKAGESDIR)/x11
+endif
+ifeq ($(wildcard $(PACKAGEDIR_X11)/$(FPCMADE)),)
+override COMPILEPACKAGES+=package_x11
+package_x11:
+	$(MAKE) -C $(PACKAGEDIR_X11) all
+endif
+UNITDIR_X11=$(PACKAGEDIR_X11)
+else
+PACKAGEDIR_X11=
+ifneq ($(wildcard $(UNITSDIR)/x11),)
+ifneq ($(wildcard $(UNITSDIR)/x11/$(OS_TARGET)),)
+UNITDIR_X11=$(UNITSDIR)/x11/$(OS_TARGET)
+else
+UNITDIR_X11=$(UNITSDIR)/x11
+endif
+else
+UNITDIR_X11=
+endif
+endif
+ifdef UNITDIR_X11
+override NEEDUNITDIR+=$(UNITDIR_X11)
+endif
+endif
+
+
+#####################################################################
+# Default Directories
+#####################################################################
+
+# set the prefix directory where to install everything
+ifndef PREFIXINSTALLDIR
+ifdef inlinux
+PREFIXINSTALLDIR=/usr
+else
+PREFIXINSTALLDIR=/pp
+endif
+endif
+export PREFIXINSTALLDIR
+
+# Where to place the resulting zip files
+ifndef DESTZIPDIR
+DESTZIPDIR:=$(BASEDIR)
+endif
+export DESTZIPDIR
+
+#####################################################################
+# Install Directories
+#####################################################################
+
+# set the base directory where to install everything
+ifndef BASEINSTALLDIR
+ifdef inlinux
+BASEINSTALLDIR=$(PREFIXINSTALLDIR)/lib/fpc/$(FPC_VERSION)
+else
+BASEINSTALLDIR=$(PREFIXINSTALLDIR)
+endif
+endif
+
+# set the directory where to install the binaries
+ifndef BININSTALLDIR
+ifdef inlinux
+BININSTALLDIR=$(PREFIXINSTALLDIR)/bin
+else
+BININSTALLDIR=$(BASEINSTALLDIR)/bin/$(OS_TARGET)
+endif
+endif
+
+# set the directory where to install the units.
+ifndef UNITINSTALLDIR
+UNITINSTALLDIR=$(BASEINSTALLDIR)/units/$(OS_TARGET)
+ifdef UNITSUBDIR
+UNITINSTALLDIR:=$(UNITINSTALLDIR)/$(UNITSUBDIR)
+endif
+endif
+
+# Where to install shared libraries
+ifndef LIBINSTALLDIR
+ifdef inlinux
+LIBINSTALLDIR=$(PREFIXINSTALLDIR)/lib
+else
+LIBINSTALLDIR=$(UNITINSTALLDIR)
+endif
+endif
+
+# Where the source files will be stored
+ifndef SOURCEINSTALLDIR
+ifdef inlinux
+SOURCEINSTALLDIR=$(PREFIXINSTALLDIR)/src/fpc-$(FPC_VERSION)
+else
+SOURCEINSTALLDIR=$(BASEINSTALLDIR)/source
+endif
+ifdef SOURCESUBDIR
+SOURCEINSTALLDIR:=$(SOURCEINSTALLDIR)/$(SOURCESUBDIR)
+endif
+endif
+
+# Where the doc files will be stored
+ifndef DOCINSTALLDIR
+ifdef inlinux
+DOCINSTALLDIR=$(PREFIXINSTALLDIR)/doc/fpc-$(FPC_VERSION)
+else
+DOCINSTALLDIR=$(BASEINSTALLDIR)/doc
+endif
+endif
+
+# Where to install the examples, under linux we use the doc dir
+# because the copytree command will create a subdir itself
+ifndef EXAMPLEINSTALLDIR
+ifdef inlinux
+EXAMPLEINSTALLDIR=$(DOCINSTALLDIR)/examples
+else
+EXAMPLEINSTALLDIR=$(BASEINSTALLDIR)/examples
+endif
+ifdef EXAMPLESUBDIR
+EXAMPLEINSTALLDIR:=$(EXAMPLEINSTALLDIR)/$(EXAMPLESUBDIR)
+endif
+endif
+
+# Where the some extra (data)files will be stored
+ifndef DATAINSTALLDIR
+DATAINSTALLDIR=$(BASEINSTALLDIR)
+endif
+
+#####################################################################
+# Redirection
+#####################################################################
+
+ifndef REDIRFILE
+REDIRFILE=log
+endif
+
+ifdef REDIR
+ifndef inlinux
+override FPC=redir -eo $(FPC)
+endif
+# set the verbosity to max
+override FPCOPT+=-va
+override REDIR:= >> $(REDIRFILE)
+endif
+
+
+#####################################################################
+# Compiler Command Line
+#####################################################################
+
+# Load commandline OPTDEF and add FPC_CPU define
+override FPCOPTDEF:=-d$(CPU_TARGET)
+
+# Load commandline OPT and add target and unit dir to be sure
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+
+# User dirs should be first, so they are looked at first
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+
+# Smartlinking
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+
+# Smartlinking creation
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+
+# Debug
+ifdef DEBUG
+override FPCOPT+=-g -dDEBUG
+endif
+
+# Release mode (strip, optimize and don't load ppc386.cfg)
+# 0.99.12b has a bug in the optimizer so don't use it by default
+ifdef RELEASE
+ifeq ($(FPC_VERSION),0.99.12)
+override FPCOPT+=-Xs -OGp3 -n
+else
+override FPCOPT+=-Xs -OG2p3 -n
+endif
+endif
+
+# Strip
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+
+# Optimizer
+ifdef OPTIMIZE
+override FPCOPT+=-OG2p3
+endif
+
+# Verbose settings (warning,note,info)
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+
+ifdef NEEDUNITDIR
+override FPCOPT+=$(addprefix -Fu,$(NEEDUNITDIR))
+endif
+
+ifdef UNITSDIR
+override FPCOPT+=-Fu$(UNITSDIR)
+endif
+
+# Target dirs and the prefix to use for clean/install
+ifdef TARGETDIR
+override FPCOPT+=-FE$(TARGETDIR)
+ifeq ($(TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(TARGETDIR)/
+endif
+endif
+ifdef UNITTARGETDIR
+override FPCOPT+=-FU$(UNITTARGETDIR)
+ifeq ($(UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(TARGETDIR)/
+endif
+else
+ifdef TARGETDIR
+override UNITTARGETDIR=$(TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+
+# Add commandline options last so they can override
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+
+# Add defines from FPCOPTDEF to FPCOPT
+ifdef FPCOPTDEF
+override FPCOPT+=$(FPCOPTDEF)
+endif
+
+# Error file ?
+ifdef ERRORFILE
+override FPCOPT+=-Fr$(ERRORFILE)
+endif
+
+# Was a config file specified ?
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+
+# For win32 the options are passed using the environment FPCEXTCMD
+ifeq ($(OS_SOURCE),win32)
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+
+# Compiler commandline
+override COMPILER:=$(FPC) $(FPCOPT)
+
+# also call ppas if with command option -s
+# but only if the OS_SOURCE and OS_TARGE are equal
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(OS_SOURCE),$(OS_TARGET))
+EXECPPAS:=@$(PPAS)
+endif
+endif
+
+#####################################################################
+# Standard rules
+#####################################################################
+
+all: fpc_all
+
+debug: fpc_debug
+
+smart: fpc_smart
+
+shared: fpc_shared
+
+showinstall: fpc_showinstall
+
+install: fpc_install
+
+sourceinstall: fpc_sourceinstall
+
+exampleinstall: fpc_exampleinstall
+
+zipinstall: fpc_zipinstall
+
+zipsourceinstall: fpc_zipsourceinstall
+
+zipexampleinstall: fpc_zipexampleinstall
+
+clean: fpc_clean
+
+distclean: fpc_distclean
+
+cleanall: fpc_cleanall
+
+info: fpc_info
+
+.PHONY:  all debug smart shared showinstall install sourceinstall exampleinstall zipinstall zipsourceinstall zipexampleinstall clean distclean cleanall info
+
+#####################################################################
+# Units
+#####################################################################
+
+.PHONY: fpc_units
+
+override ALLTARGET+=fpc_units
+
+override UNITPPUFILES=$(addsuffix $(PPUEXT),$(UNITOBJECTS))
+override INSTALLPPUFILES+=$(UNITPPUFILES)
+override CLEANPPUFILES+=$(UNITPPUFILES)
+
+fpc_units: $(UNITPPUFILES)
+
+#####################################################################
+# General compile rules
+#####################################################################
+
+.PHONY: fpc_packages fpc_all fpc_debug
+
+$(FPCMADE): $(ALLTARGET)
+	@$(ECHO) Compiled > $(FPCMADE)
+
+fpc_packages: $(COMPILEPACKAGES)
+
+fpc_all: fpc_packages $(FPCMADE)
+
+fpc_debug:
+	$(MAKE) all DEBUG=1
+
+# Search paths for .ppu if targetdir is set
+ifdef UNITTARGETDIR
+vpath %$(PPUEXT) $(UNITTARGETDIR)
+endif
+
+# General compile rules, available for both possible PASEXT
+
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .pp
+
+%$(PPUEXT): %.pp
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(PPUEXT): %.pas
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(EXEEXT): %.pp
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(EXEEXT): %.pas
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+#####################################################################
+# Library
+#####################################################################
+
+.PHONY: fpc_smart fpc_shared
+
+ifdef LIBVERSION
+LIBFULLNAME=$(LIBNAME).$(LIBVERSION)
+else
+LIBFULLNAME=$(LIBNAME)
+endif
+
+# Default sharedlib units are all unit objects
+ifndef SHAREDLIBUNITOBJECTS
+SHAREDLIBUNITOBJECTS:=$(UNITOBJECTS)
+endif
+
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+
+fpc_shared: all
+ifdef inlinux
+ifndef LIBNAME
+	@$(ECHO) "LIBNAME not set"
+else
+	$(PPUMOVE) $(SHAREDLIBUNITOBJECTS) -o$(LIBFULLNAME)
+endif
+else
+	@$(ECHO) "Shared Libraries not supported"
+endif
+
+#####################################################################
+# Install rules
+#####################################################################
+
+.PHONY: fpc_showinstall fpc_install
+
+ifdef EXTRAINSTALLUNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(EXTRAINSTALLUNITS))
+endif
+
+ifdef INSTALLPPUFILES
+override INSTALLPPUFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLPPUFILES))
+ifdef PPUFILES
+INSTALLPPULINKFILES:=$(shell $(PPUFILES) -S -O $(INSTALLPPUFILES))
+else
+INSTALLPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(LIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))))
+endif
+override INSTALLPPULINKFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLPPULINKFILES))
+endif
+
+ifdef INSTALLEXEFILES
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLEXEFILES))
+endif
+
+fpc_showinstall: $(SHOWINSTALLTARGET)
+ifdef INSTALLEXEFILES
+	@$(ECHO) -e $(addprefix "\n"$(BININSTALLDIR)/,$(INSTALLEXEFILES))
+endif
+ifdef INSTALLPPUFILES
+	@$(ECHO) -e $(addprefix "\n"$(UNITINSTALLDIR)/,$(INSTALLPPUFILES))
+ifneq ($(INSTALLPPULINKFILES),)
+	@$(ECHO) -e $(addprefix "\n"$(UNITINSTALLDIR)/,$(INSTALLPPULINKFILES))
+endif
+ifneq ($(wildcard $(LIBFULLNAME)),)
+	@$(ECHO) $(LIBINSTALLDIR)/$(LIBFULLNAME)
+ifdef inlinux
+	@$(ECHO) $(LIBINSTALLDIR)/$(LIBNAME)
+endif
+endif
+endif
+ifdef EXTRAINSTALLFILES
+	@$(ECHO) -e $(addprefix "\n"$(DATAINSTALLDIR)/,$(EXTRAINSTALLFILES))
+endif
+
+fpc_install: $(INSTALLTARGET)
+# Create UnitInstallFiles
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(BININSTALLDIR)
+# Compress the exes if upx is defined
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(BININSTALLDIR)
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(UNITINSTALLDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(UNITINSTALLDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(UNITINSTALLDIR)
+endif
+ifneq ($(wildcard $(LIBFULLNAME)),)
+	$(MKDIR) $(LIBINSTALLDIR)
+	$(INSTALL) $(LIBFULLNAME) $(LIBINSTALLDIR)
+ifdef inlinux
+	ln -sf $(LIBFULLNAME) $(LIBINSTALLDIR)/$(LIBNAME)
+endif
+endif
+endif
+ifdef EXTRAINSTALLFILES
+	$(MKDIR) $(DATAINSTALLDIR)
+	$(INSTALL) $(EXTRAINSTALLFILES) $(DATAINSTALLDIR)
+endif
+
+#####################################################################
+# SourceInstall rules
+#####################################################################
+
+.PHONY: fpc_sourceinstall
+
+ifndef SOURCETOPDIR
+SOURCETOPDIR=$(BASEDIR)
+endif
+
+fpc_sourceinstall: clean
+	$(MKDIR) $(SOURCEINSTALLDIR)
+	$(COPYTREE) $(SOURCETOPDIR) $(SOURCEINSTALLDIR)
+
+#####################################################################
+# exampleinstall rules
+#####################################################################
+
+.PHONY: fpc_exampleinstall
+
+fpc_exampleinstall: $(addsuffix _clean,$(EXAMPLEDIROBJECTS))
+ifdef EXAMPLESOURCEFILES
+	$(MKDIR) $(EXAMPLEINSTALLDIR)
+	$(COPY) $(EXAMPLESOURCEFILES) $(EXAMPLEINSTALLDIR)
+endif
+ifdef EXAMPLEDIROBJECTS
+ifndef EXAMPLESOURCEFILES
+	$(MKDIR) $(EXAMPLEINSTALLDIR)
+endif
+	$(COPYTREE) $(addsuffix /*,$(EXAMPLEDIROBJECTS)) $(EXAMPLEINSTALLDIR)
+endif
+
+#####################################################################
+# Zip
+#####################################################################
+
+.PHONY: fpc_zipinstall
+
+# Create suffix to add
+ifndef PACKAGESUFFIX
+PACKAGESUFFIX=$(OS_TARGET)
+ifeq ($(OS_TARGET),go32v2)
+PACKAGESUFFIX=go32
+endif
+ifeq ($(OS_TARGET),win32)
+PACKAGESUFFIX=w32
+endif
+endif
+
+# Temporary path to pack a file
+ifndef PACKDIR
+ifndef inlinux
+PACKDIR=$(BASEDIR)/pack_tmp
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+
+# Maybe create default zipname from packagename
+ifndef ZIPNAME
+ifdef PACKAGENAME
+ZIPNAME=$(PACKAGEPREFIX)$(PACKAGENAME)$(PACKAGESUFFIX)
+endif
+endif
+
+# Use tar by default under linux
+ifndef USEZIP
+ifdef inlinux
+USETAR=1
+endif
+endif
+
+fpc_zipinstall:
+ifndef ZIPNAME
+	@$(ECHO) "Please specify ZIPNAME!"
+	@exit 1
+else
+	$(MAKE) $(ZIPTARGET) PREFIXINSTALLDIR=$(PACKDIR)
+ifdef USETAR
+	$(DEL) $(DESTZIPDIR)/$(ZIPNAME)$(TAREXT)
+	cd $(PACKDIR) ; $(TARPROG) c$(TAROPT) --file $(DESTZIPDIR)/$(ZIPNAME)$(TAREXT) * ; cd $(BASEDIR)
+else
+	$(DEL) $(DESTZIPDIR)/$(ZIPNAME)$(ZIPEXT)
+	cd $(PACKDIR) ; $(ZIPPROG) -Dr $(ZIPOPT) $(DESTZIPDIR)/$(ZIPNAME)$(ZIPEXT) * ; cd $(BASEDIR)
+endif
+	$(DELTREE) $(PACKDIR)
+endif
+
+.PHONY:  fpc_zipsourceinstall
+
+fpc_zipsourceinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall PACKAGESUFFIX=src
+
+.PHONY:  fpc_zipexampleinstall
+
+fpc_zipexampleinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall PACKAGESUFFIX=exm
+
+#####################################################################
+# Clean rules
+#####################################################################
+
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+
+ifdef EXTRACLEANUNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(EXTRACLEANUNITS))
+endif
+
+ifdef CLEANPPUFILES
+override CLEANPPUFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANPPUFILES))
+# Get the .o and .a files created for the units
+ifdef PPUFILES
+CLEANPPULINKFILES:=$(shell $(PPUFILES) $(CLEANPPUFILES))
+else
+CLEANPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(LIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))))
+endif
+override CLEANPPULINKFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANPPULINKFILES))
+endif
+
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef EXTRACLEANFILES
+	-$(DEL) $(EXTRACLEANFILES)
+endif
+ifdef LIBNAME
+	-$(DEL) $(LIBNAME) $(LIBFULLNAME)
+endif
+	-$(DEL) $(FPCMADE) $(PPAS) link.res $(FPCEXTFILE) $(REDIRFILE)
+
+fpc_distclean: fpc_clean
+
+# Also run clean first if targetdir is set. Unittargetdir is always
+# set if targetdir or unittargetdir is specified
+ifdef UNITTARGETDIR
+TARGETDIRCLEAN=fpc_clean
+endif
+
+fpc_cleanall: $(CLEANTARGET) $(TARGETDIRCLEAN)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) $(FPCMADE) $(PPAS) link.res $(FPCEXTFILE) $(REDIRFILE)
+
+#####################################################################
+# Info rules
+#####################################################################
+
+.PHONY: fpc_info fpc_cfginfo fpc_objectinfo fpc_toolsinfo fpc_installinfo \
+	fpc_dirinfo
+
+fpc_info: $(INFOTARGET)
+
+fpc_infocfg:
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC....... $(FPC)
+	@$(ECHO)  Version... $(FPC_VERSION)
+	@$(ECHO)  CPU....... $(CPU_TARGET)
+	@$(ECHO)  Source.... $(OS_SOURCE)
+	@$(ECHO)  Target.... $(OS_TARGET)
+	@$(ECHO)
+
+fpc_infoobjects:
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  LoaderObjects..... $(LOADEROBJECTS)
+	@$(ECHO)  UnitObjects....... $(UNITOBJECTS)
+	@$(ECHO)  ExeObjects........ $(EXEOBJECTS)
+	@$(ECHO)
+	@$(ECHO)  ExtraCleanUnits... $(EXTRACLEANUNITS)
+	@$(ECHO)  ExtraCleanFiles... $(EXTRACLEANFILES)
+	@$(ECHO)
+	@$(ECHO)  ExtraInstallUnits. $(EXTRAINSTALLUNITS)
+	@$(ECHO)  ExtraInstallFiles. $(EXTRAINSTALLFILES)
+	@$(ECHO)
+
+fpc_infoinstall:
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+ifdef DATE
+	@$(ECHO)  DateStr.............. $(DATESTR)
+endif
+ifdef PACKAGEPREFIX
+	@$(ECHO)  PackagePrefix........ $(PACKAGEPREFIX)
+endif
+ifdef PACKAGENAME
+	@$(ECHO)  PackageName.......... $(PACKAGENAME)
+endif
+	@$(ECHO)  PackageSuffix........ $(PACKAGESUFFIX)
+	@$(ECHO)
+	@$(ECHO)  BaseInstallDir....... $(BASEINSTALLDIR)
+	@$(ECHO)  BinInstallDir........ $(BININSTALLDIR)
+	@$(ECHO)  LibInstallDir........ $(LIBINSTALLDIR)
+	@$(ECHO)  UnitInstallDir....... $(UNITINSTALLDIR)
+	@$(ECHO)  SourceInstallDir..... $(SOURCEINSTALLDIR)
+	@$(ECHO)  DocInstallDir........ $(DOCINSTALLDIR)
+	@$(ECHO)  DataInstallDir....... $(DATAINSTALLDIR)
+	@$(ECHO)
+	@$(ECHO)  DestZipDir........... $(DESTZIPDIR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)
+
+#####################################################################
+# Local Makefile
+#####################################################################
+
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+

+ 15 - 0
packages/opengl/linux/Makefile.fpc

@@ -0,0 +1,15 @@
+#
+#   Makefile.fpc for Linux dynamic GL units
+#
+
+[defaults]
+defaulttarget=linux
+
+[targets]
+units=gl glu glx glut
+
+[require]
+packages=x11
+
+[dirs]
+fpcdir=../../..

+ 2065 - 0
packages/opengl/linux/gl.pp

@@ -0,0 +1,2065 @@
+{
+  $Id$
+
+  Translation of the Mesa GL headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GL;
+
+interface
+
+{$DEFINE GL1_0}
+{$DEFINE GL1_1}
+{$DEFINE GL1_2}
+{$DEFINE MESA}                 {enable if you want to use some special mesa extensions}
+{$DEFINE EXTENSIONS}           {enable if you need one/all of extensions}
+{$DEFINE SGI_EXTENSIONS}       {enable if you need one/all of extensions}
+
+{$MACRO ON}
+
+{$IFDEF Linux}
+  {$LINKLIB c}
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+function InitGLFromLibrary(libname: PChar): Boolean;
+
+// determines automatically which libraries to use:
+function InitGL: Boolean;
+
+
+var
+  GLDumpUnresolvedFunctions,
+  GLInitialized: Boolean;
+
+
+// =======================================================
+//   GL consts, types and functions
+// =======================================================
+
+
+// -------------------------------------------------------
+//   GL types
+// -------------------------------------------------------
+
+type
+  PSingle   = ^Single;
+  PDouble   = ^Double;
+
+  GLvoid    = Pointer;
+  GLboolean = Byte;
+
+  GLbyte    = ShortInt; // 1-byte signed
+  GLshort   = Integer;  // 2-byte signed
+  GLint     = LongInt;  // 4-byte signed
+
+  GLubyte   = Byte;     // 1-byte unsigned
+  GLushort  = Word;     // 2-byte unsigned
+  GLuint    = DWord;    // 4-byte signed
+
+  GLsizei   = LongInt;  // 4-byte signed
+
+  GLfloat   = Single;   // single precision float
+  GLclampf  = Single;   // single precision float in [0,1]
+  GLdouble  = Double;   // double precision float
+  GLclampd  = Double;   // double precision float in [0,1]
+
+  GLenum    = DWord;
+
+  PGLBoolean = ^GLBoolean;
+  PGLFloat   = ^GLfloat;
+  PGLDouble  = ^GLDouble;
+
+type
+  GLbitfield = DWord;  { was an enum - no corresponding thing in pascal }
+const
+  GL_CURRENT_BIT        = $00000001;
+  GL_POINT_BIT          = $00000002;
+  GL_LINE_BIT           = $00000004;
+  GL_POLYGON_BIT        = $00000008;
+  GL_POLYGON_STIPPLE_BIT= $00000010;
+  GL_PIXEL_MODE_BIT     = $00000020;
+  GL_LIGHTING_BIT       = $00000040;
+  GL_FOG_BIT            = $00000080;
+  GL_DEPTH_BUFFER_BIT   = $00000100;
+  GL_ACCUM_BUFFER_BIT   = $00000200;
+  GL_STENCIL_BUFFER_BIT = $00000400;
+  GL_VIEWPORT_BIT       = $00000800;
+  GL_TRANSFORM_BIT      = $00001000;
+  GL_ENABLE_BIT         = $00002000;
+  GL_COLOR_BUFFER_BIT   = $00004000;
+  GL_HINT_BIT           = $00008000;
+  GL_EVAL_BIT           = $00010000;
+  GL_LIST_BIT           = $00020000;
+  GL_TEXTURE_BIT        = $00040000;
+  GL_SCISSOR_BIT        = $00080000;
+  GL_ALL_ATTRIB_BITS    = $000fffff;
+
+
+// -------------------------------------------------------
+//   GL constants
+// -------------------------------------------------------
+
+{$IFDEF GL1_0}
+
+const
+  GL_NO_ERROR                           = 0;
+
+  // Boolean values
+  GL_FALSE                              = 0;
+  GL_TRUE                               = 1;
+
+  // Data types
+  GL_BYTE                               = $1400;
+  GL_UNSIGNED_BYTE                      = $1401;
+  GL_SHORT                              = $1402;
+  GL_UNSIGNED_SHORT                     = $1403;
+  GL_INT                                = $1404;
+  GL_UNSIGNED_INT                       = $1405;
+  GL_FLOAT                              = $1406;
+  GL_DOUBLE                             = $140A;
+  GL_2_BYTES                            = $1407;
+  GL_3_BYTES                            = $1408;
+  GL_4_BYTES                            = $1409;
+
+  // Primitives
+  GL_LINES                              = $0001;
+  GL_POINTS                             = $0000;
+  GL_LINE_STRIP                         = $0003;
+  GL_LINE_LOOP                          = $0002;
+  GL_TRIANGLES                          = $0004;
+  GL_TRIANGLE_STRIP                     = $0005;
+  GL_TRIANGLE_FAN                       = $0006;
+  GL_QUADS                              = $0007;
+  GL_QUAD_STRIP                         = $0008;
+  GL_POLYGON                            = $0009;
+  GL_EDGE_FLAG                          = $0B43;
+
+  // Vertex arrays
+  GL_VERTEX_ARRAY                       = $8074;
+  GL_NORMAL_ARRAY                       = $8075;
+  GL_COLOR_ARRAY                        = $8076;
+  GL_INDEX_ARRAY                        = $8077;
+  GL_TEXTURE_COORD_ARRAY                = $8078;
+  GL_EDGE_FLAG_ARRAY                    = $8079;
+  GL_VERTEX_ARRAY_SIZE                  = $807A;
+  GL_VERTEX_ARRAY_TYPE                  = $807B;
+  GL_VERTEX_ARRAY_STRIDE                = $807C;
+  GL_NORMAL_ARRAY_TYPE                  = $807E;
+  GL_NORMAL_ARRAY_STRIDE                = $807F;
+  GL_COLOR_ARRAY_SIZE                   = $8081;
+  GL_COLOR_ARRAY_TYPE                   = $8082;
+  GL_COLOR_ARRAY_STRIDE                 = $8083;
+  GL_INDEX_ARRAY_TYPE                   = $8085;
+  GL_INDEX_ARRAY_STRIDE                 = $8086;
+  GL_TEXTURE_COORD_ARRAY_SIZE           = $8088;
+  GL_TEXTURE_COORD_ARRAY_TYPE           = $8089;
+  GL_TEXTURE_COORD_ARRAY_STRIDE         = $808A;
+  GL_EDGE_FLAG_ARRAY_STRIDE             = $808C;
+  GL_VERTEX_ARRAY_POINTER               = $808E;
+  GL_NORMAL_ARRAY_POINTER               = $808F;
+  GL_COLOR_ARRAY_POINTER                = $8090;
+  GL_INDEX_ARRAY_POINTER                = $8091;
+  GL_TEXTURE_COORD_ARRAY_POINTER        = $8092;
+  GL_EDGE_FLAG_ARRAY_POINTER            = $8093;
+  GL_V2F                                = $2A20;
+  GL_V3F                                = $2A21;
+  GL_C4UB_V2F                           = $2A22;
+  GL_C4UB_V3F                           = $2A23;
+  GL_C3F_V3F                            = $2A24;
+  GL_N3F_V3F                            = $2A25;
+  GL_C4F_N3F_V3F                        = $2A26;
+  GL_T2F_V3F                            = $2A27;
+  GL_T4F_V4F                            = $2A28;
+  GL_T2F_C4UB_V3F                       = $2A29;
+  GL_T2F_C3F_V3F                        = $2A2A;
+  GL_T2F_N3F_V3F                        = $2A2B;
+  GL_T2F_C4F_N3F_V3F                    = $2A2C;
+  GL_T4F_C4F_N3F_V4F                    = $2A2D;
+
+  // Matrix Mode
+  GL_MATRIX_MODE                        = $0BA0;
+  GL_MODELVIEW                          = $1700;
+  GL_PROJECTION                         = $1701;
+  GL_TEXTURE                            = $1702;
+
+  // Points
+  GL_POINT_SMOOTH                       = $0B10;
+  GL_POINT_SIZE                         = $0B11;
+  GL_POINT_SIZE_GRANULARITY             = $0B13;
+  GL_POINT_SIZE_RANGE                   = $0B12;
+
+  // Lines
+  GL_LINE_SMOOTH                        = $0B20;
+  GL_LINE_STIPPLE                       = $0B24;
+  GL_LINE_STIPPLE_PATTERN               = $0B25;
+  GL_LINE_STIPPLE_REPEAT                = $0B26;
+  GL_LINE_WIDTH                         = $0B21;
+  GL_LINE_WIDTH_GRANULARITY             = $0B23;
+  GL_LINE_WIDTH_RANGE                   = $0B22;
+
+  // Polygons
+  GL_POINT                              = $1B00;
+  GL_LINE                               = $1B01;
+  GL_FILL                               = $1B02;
+  GL_CCW                                = $0901;
+  GL_CW                                 = $0900;
+  GL_FRONT                              = $0404;
+  GL_BACK                               = $0405;
+  GL_CULL_FACE                          = $0B44;
+  GL_CULL_FACE_MODE                     = $0B45;
+  GL_POLYGON_SMOOTH                     = $0B41;
+  GL_POLYGON_STIPPLE                    = $0B42;
+  GL_FRONT_FACE                         = $0B46;
+  GL_POLYGON_MODE                       = $0B40;
+  GL_POLYGON_OFFSET_FACTOR              = $8038;
+  GL_POLYGON_OFFSET_UNITS               = $2A00;
+  GL_POLYGON_OFFSET_POINT               = $2A01;
+  GL_POLYGON_OFFSET_LINE                = $2A02;
+  GL_POLYGON_OFFSET_FILL                = $8037;
+
+  // Display lists
+  GL_COMPILE                            = $1300;
+  GL_COMPILE_AND_EXECUTE                = $1301;
+  GL_LIST_BASE                          = $0B32;
+  GL_LIST_INDEX                         = $0B33;
+  GL_LIST_MODE                          = $0B30;
+
+  // Depth buffer
+  GL_NEVER                              = $0200;
+  GL_LESS                               = $0201;
+  GL_GEQUAL                             = $0206;
+  GL_LEQUAL                             = $0203;
+  GL_GREATER                            = $0204;
+  GL_NOTEQUAL                           = $0205;
+  GL_EQUAL                              = $0202;
+  GL_ALWAYS                             = $0207;
+  GL_DEPTH_TEST                         = $0B71;
+  GL_DEPTH_BITS                         = $0D56;
+  GL_DEPTH_CLEAR_VALUE                  = $0B73;
+  GL_DEPTH_FUNC                         = $0B74;
+  GL_DEPTH_RANGE                        = $0B70;
+  GL_DEPTH_WRITEMASK                    = $0B72;
+  GL_DEPTH_COMPONENT                    = $1902;
+
+  // Lighting
+  GL_LIGHTING                           = $0B50;
+  GL_LIGHT0                             = $4000;
+  GL_LIGHT1                             = $4001;
+  GL_LIGHT2                             = $4002;
+  GL_LIGHT3                             = $4003;
+  GL_LIGHT4                             = $4004;
+  GL_LIGHT5                             = $4005;
+  GL_LIGHT6                             = $4006;
+  GL_LIGHT7                             = $4007;
+  GL_SPOT_EXPONENT                      = $1205;
+  GL_SPOT_CUTOFF                        = $1206;
+  GL_CONSTANT_ATTENUATION               = $1207;
+  GL_LINEAR_ATTENUATION                 = $1208;
+  GL_QUADRATIC_ATTENUATION              = $1209;
+  GL_AMBIENT                            = $1200;
+  GL_DIFFUSE                            = $1201;
+  GL_SPECULAR                           = $1202;
+  GL_SHININESS                          = $1601;
+  GL_EMISSION                           = $1600;
+  GL_POSITION                           = $1203;
+  GL_SPOT_DIRECTION                     = $1204;
+  GL_AMBIENT_AND_DIFFUSE                = $1602;
+  GL_COLOR_INDEXES                      = $1603;
+  GL_LIGHT_MODEL_TWO_SIDE               = $0B52;
+  GL_LIGHT_MODEL_LOCAL_VIEWER           = $0B51;
+  GL_LIGHT_MODEL_AMBIENT                = $0B53;
+  GL_FRONT_AND_BACK                     = $0408;
+  GL_SHADE_MODEL                        = $0B54;
+  GL_FLAT                               = $1D00;
+  GL_SMOOTH                             = $1D01;
+  GL_COLOR_MATERIAL                     = $0B57;
+  GL_COLOR_MATERIAL_FACE                = $0B55;
+  GL_COLOR_MATERIAL_PARAMETER           = $0B56;
+  GL_NORMALIZE                          = $0BA1;
+
+  // User clipping planes
+  GL_CLIP_PLANE0                        = $3000;
+  GL_CLIP_PLANE1                        = $3001;
+  GL_CLIP_PLANE2                        = $3002;
+  GL_CLIP_PLANE3                        = $3003;
+  GL_CLIP_PLANE4                        = $3004;
+  GL_CLIP_PLANE5                        = $3005;
+
+  // Accumulation buffer
+  GL_ACCUM_RED_BITS                     = $0D58;
+  GL_ACCUM_GREEN_BITS                   = $0D59;
+  GL_ACCUM_BLUE_BITS                    = $0D5A;
+  GL_ACCUM_ALPHA_BITS                   = $0D5B;
+  GL_ACCUM_CLEAR_VALUE                  = $0B80;
+  GL_ACCUM                              = $0100;
+  GL_ADD                                = $0104;
+  GL_LOAD                               = $0101;
+  GL_MULT                               = $0103;
+  GL_RETURN                             = $0102;
+
+  // Alpha testing
+  GL_ALPHA_TEST                         = $0BC0;
+  GL_ALPHA_TEST_REF                     = $0BC2;
+  GL_ALPHA_TEST_FUNC                    = $0BC1;
+
+  // Blending
+  GL_BLEND                              = $0BE2;
+  GL_BLEND_SRC                          = $0BE1;
+  GL_BLEND_DST                          = $0BE0;
+  GL_ZERO                               = 0;
+  GL_ONE                                = 1;
+  GL_SRC_COLOR                          = $0300;
+  GL_ONE_MINUS_SRC_COLOR                = $0301;
+  GL_DST_COLOR                          = $0306;
+  GL_ONE_MINUS_DST_COLOR                = $0307;
+  GL_SRC_ALPHA                          = $0302;
+  GL_ONE_MINUS_SRC_ALPHA                = $0303;
+  GL_DST_ALPHA                          = $0304;
+  GL_ONE_MINUS_DST_ALPHA                = $0305;
+  GL_SRC_ALPHA_SATURATE                 = $0308;
+  GL_CONSTANT_COLOR                     = $8001;
+  GL_ONE_MINUS_CONSTANT_COLOR           = $8002;
+  GL_CONSTANT_ALPHA                     = $8003;
+  GL_ONE_MINUS_CONSTANT_ALPHA           = $8004;
+
+  // Render mode
+  GL_FEEDBACK                           = $1C01;
+  GL_RENDER                             = $1C00;
+  GL_SELECT                             = $1C02;
+
+  // Feedback
+  GL_2D                                 = $0600;
+  GL_3D                                 = $0601;
+  GL_3D_COLOR                           = $0602;
+  GL_3D_COLOR_TEXTURE                   = $0603;
+  GL_4D_COLOR_TEXTURE                   = $0604;
+  GL_POINT_TOKEN                        = $0701;
+  GL_LINE_TOKEN                         = $0702;
+  GL_LINE_RESET_TOKEN                   = $0707;
+  GL_POLYGON_TOKEN                      = $0703;
+  GL_BITMAP_TOKEN                       = $0704;
+  GL_DRAW_PIXEL_TOKEN                   = $0705;
+  GL_COPY_PIXEL_TOKEN                   = $0706;
+  GL_PASS_THROUGH_TOKEN                 = $0700;
+  GL_FEEDBACK_BUFFER_POINTER            = $0DF0;
+  GL_FEEDBACK_BUFFER_SIZE               = $0DF1;
+  GL_FEEDBACK_BUFFER_TYPE               = $0DF2;
+
+  // Selection
+  GL_SELECTION_BUFFER_POINTER           = $0DF3;
+  GL_SELECTION_BUFFER_SIZE              = $0DF4;
+
+  // Fog
+  GL_FOG                                = $0B60;
+  GL_FOG_MODE                           = $0B65;
+  GL_FOG_DENSITY                        = $0B62;
+  GL_FOG_COLOR                          = $0B66;
+  GL_FOG_INDEX                          = $0B61;
+  GL_FOG_START                          = $0B63;
+  GL_FOG_END                            = $0B64;
+  GL_LINEAR                             = $2601;
+  GL_EXP                                = $0800;
+  GL_EXP2                               = $0801;
+
+  // Logic ops
+  GL_LOGIC_OP                           = $0BF1;
+  GL_INDEX_LOGIC_OP                     = $0BF1;
+  GL_COLOR_LOGIC_OP                     = $0BF2;
+  GL_LOGIC_OP_MODE                      = $0BF0;
+  GL_CLEAR                              = $1500;
+  GL_SET                                = $150F;
+  GL_COPY                               = $1503;
+  GL_COPY_INVERTED                      = $150C;
+  GL_NOOP                               = $1505;
+  GL_INVERT                             = $150A;
+  GL_AND                                = $1501;
+  GL_NAND                               = $150E;
+  GL_OR                                 = $1507;
+  GL_NOR                                = $1508;
+  GL_XOR                                = $1506;
+  GL_EQUIV                              = $1509;
+  GL_AND_REVERSE                        = $1502;
+  GL_AND_INVERTED                       = $1504;
+  GL_OR_REVERSE                         = $150B;
+  GL_OR_INVERTED                        = $150D;
+
+  // Stencil
+  GL_STENCIL_TEST                       = $0B90;
+  GL_STENCIL_WRITEMASK                  = $0B98;
+  GL_STENCIL_BITS                       = $0D57;
+  GL_STENCIL_FUNC                       = $0B92;
+  GL_STENCIL_VALUE_MASK                 = $0B93;
+  GL_STENCIL_REF                        = $0B97;
+  GL_STENCIL_FAIL                       = $0B94;
+  GL_STENCIL_PASS_DEPTH_PASS            = $0B96;
+  GL_STENCIL_PASS_DEPTH_FAIL            = $0B95;
+  GL_STENCIL_CLEAR_VALUE                = $0B91;
+  GL_STENCIL_INDEX                      = $1901;
+  GL_KEEP                               = $1E00;
+  GL_REPLACE                            = $1E01;
+  GL_INCR                               = $1E02;
+  GL_DECR                               = $1E03;
+
+  // Buffers, Pixel Drawing/Reading
+  GL_NONE                               = 0;
+  GL_LEFT                               = $0406;
+  GL_RIGHT                              = $0407;
+  //GL_FRONT                            = $0404;
+  //GL_BACK                             = $0405;
+  //GL_FRONT_AND_BACK                   = $0408;
+  GL_FRONT_LEFT                         = $0400;
+  GL_FRONT_RIGHT                        = $0401;
+  GL_BACK_LEFT                          = $0402;
+  GL_BACK_RIGHT                         = $0403;
+  GL_AUX0                               = $0409;
+  GL_AUX1                               = $040A;
+  GL_AUX2                               = $040B;
+  GL_AUX3                               = $040C;
+  GL_COLOR_INDEX                        = $1900;
+  GL_RED                                = $1903;
+  GL_GREEN                              = $1904;
+  GL_BLUE                               = $1905;
+  GL_ALPHA                              = $1906;
+  GL_LUMINANCE                          = $1909;
+  GL_LUMINANCE_ALPHA                    = $190A;
+  GL_ALPHA_BITS                         = $0D55;
+  GL_RED_BITS                           = $0D52;
+  GL_GREEN_BITS                         = $0D53;
+  GL_BLUE_BITS                          = $0D54;
+  GL_INDEX_BITS                         = $0D51;
+  GL_SUBPIXEL_BITS                      = $0D50;
+  GL_AUX_BUFFERS                        = $0C00;
+  GL_READ_BUFFER                        = $0C02;
+  GL_DRAW_BUFFER                        = $0C01;
+  GL_DOUBLEBUFFER                       = $0C32;
+  GL_STEREO                             = $0C33;
+  GL_BITMAP                             = $1A00;
+  GL_COLOR                              = $1800;
+  GL_DEPTH                              = $1801;
+  GL_STENCIL                            = $1802;
+  GL_DITHER                             = $0BD0;
+  GL_RGB                                = $1907;
+  GL_RGBA                               = $1908;
+
+  // Implementation limits
+  GL_MAX_LIST_NESTING                   = $0B31;
+  GL_MAX_ATTRIB_STACK_DEPTH             = $0D35;
+  GL_MAX_MODELVIEW_STACK_DEPTH          = $0D36;
+  GL_MAX_NAME_STACK_DEPTH               = $0D37;
+  GL_MAX_PROJECTION_STACK_DEPTH         = $0D38;
+  GL_MAX_TEXTURE_STACK_DEPTH            = $0D39;
+  GL_MAX_EVAL_ORDER                     = $0D30;
+  GL_MAX_LIGHTS                         = $0D31;
+  GL_MAX_CLIP_PLANES                    = $0D32;
+  GL_MAX_TEXTURE_SIZE                   = $0D33;
+  GL_MAX_PIXEL_MAP_TABLE                = $0D34;
+  GL_MAX_VIEWPORT_DIMS                  = $0D3A;
+  GL_MAX_CLIENT_ATTRIB_STACK_DEPTH      = $0D3B;
+
+  // Gets
+  GL_ATTRIB_STACK_DEPTH                 = $0BB0;
+  GL_CLIENT_ATTRIB_STACK_DEPTH          = $0BB1;
+  GL_COLOR_CLEAR_VALUE                  = $0C22;
+  GL_COLOR_WRITEMASK                    = $0C23;
+  GL_CURRENT_INDEX                      = $0B01;
+  GL_CURRENT_COLOR                      = $0B00;
+  GL_CURRENT_NORMAL                     = $0B02;
+  GL_CURRENT_RASTER_COLOR               = $0B04;
+  GL_CURRENT_RASTER_DISTANCE            = $0B09;
+  GL_CURRENT_RASTER_INDEX               = $0B05;
+  GL_CURRENT_RASTER_POSITION            = $0B07;
+  GL_CURRENT_RASTER_TEXTURE_COORDS      = $0B06;
+  GL_CURRENT_RASTER_POSITION_VALID      = $0B08;
+  GL_CURRENT_TEXTURE_COORDS             = $0B03;
+  GL_INDEX_CLEAR_VALUE                  = $0C20;
+  GL_INDEX_MODE                         = $0C30;
+  GL_INDEX_WRITEMASK                    = $0C21;
+  GL_MODELVIEW_MATRIX                   = $0BA6;
+  GL_MODELVIEW_STACK_DEPTH              = $0BA3;
+  GL_NAME_STACK_DEPTH                   = $0D70;
+  GL_PROJECTION_MATRIX                  = $0BA7;
+  GL_PROJECTION_STACK_DEPTH             = $0BA4;
+  GL_RENDER_MODE                        = $0C40;
+  GL_RGBA_MODE                          = $0C31;
+  GL_TEXTURE_MATRIX                     = $0BA8;
+  GL_TEXTURE_STACK_DEPTH                = $0BA5;
+  GL_VIEWPORT                           = $0BA2;
+
+  // Evaluators
+  GL_AUTO_NORMAL                        = $0D80;
+  GL_MAP1_COLOR_4                       = $0D90;
+  GL_MAP1_GRID_DOMAIN                   = $0DD0;
+  GL_MAP1_GRID_SEGMENTS                 = $0DD1;
+  GL_MAP1_INDEX                         = $0D91;
+  GL_MAP1_NORMAL                        = $0D92;
+  GL_MAP1_TEXTURE_COORD_1               = $0D93;
+  GL_MAP1_TEXTURE_COORD_2               = $0D94;
+  GL_MAP1_TEXTURE_COORD_3               = $0D95;
+  GL_MAP1_TEXTURE_COORD_4               = $0D96;
+  GL_MAP1_VERTEX_3                      = $0D97;
+  GL_MAP1_VERTEX_4                      = $0D98;
+  GL_MAP2_COLOR_4                       = $0DB0;
+  GL_MAP2_GRID_DOMAIN                   = $0DD2;
+  GL_MAP2_GRID_SEGMENTS                 = $0DD3;
+  GL_MAP2_INDEX                         = $0DB1;
+  GL_MAP2_NORMAL                        = $0DB2;
+  GL_MAP2_TEXTURE_COORD_1               = $0DB3;
+  GL_MAP2_TEXTURE_COORD_2               = $0DB4;
+  GL_MAP2_TEXTURE_COORD_3               = $0DB5;
+  GL_MAP2_TEXTURE_COORD_4               = $0DB6;
+  GL_MAP2_VERTEX_3                      = $0DB7;
+  GL_MAP2_VERTEX_4                      = $0DB8;
+  GL_COEFF                              = $0A00;
+  GL_DOMAIN                             = $0A02;
+  GL_ORDER                              = $0A01;
+
+  // Hints
+  GL_FOG_HINT                           = $0C54;
+  GL_LINE_SMOOTH_HINT                   = $0C52;
+  GL_PERSPECTIVE_CORRECTION_HINT        = $0C50;
+  GL_POINT_SMOOTH_HINT                  = $0C51;
+  GL_POLYGON_SMOOTH_HINT                = $0C53;
+  GL_DONT_CARE                          = $1100;
+  GL_FASTEST                            = $1101;
+  GL_NICEST                             = $1102;
+
+  // Scissor box
+  GL_SCISSOR_TEST                       = $0C11;
+  GL_SCISSOR_BOX                        = $0C10;
+
+  // Pixel Mode / Transfer
+  GL_MAP_COLOR                          = $0D10;
+  GL_MAP_STENCIL                        = $0D11;
+  GL_INDEX_SHIFT                        = $0D12;
+  GL_INDEX_OFFSET                       = $0D13;
+  GL_RED_SCALE                          = $0D14;
+  GL_RED_BIAS                           = $0D15;
+  GL_GREEN_SCALE                        = $0D18;
+  GL_GREEN_BIAS                         = $0D19;
+  GL_BLUE_SCALE                         = $0D1A;
+  GL_BLUE_BIAS                          = $0D1B;
+  GL_ALPHA_SCALE                        = $0D1C;
+  GL_ALPHA_BIAS                         = $0D1D;
+  GL_DEPTH_SCALE                        = $0D1E;
+  GL_DEPTH_BIAS                         = $0D1F;
+  GL_PIXEL_MAP_S_TO_S_SIZE              = $0CB1;
+  GL_PIXEL_MAP_I_TO_I_SIZE              = $0CB0;
+  GL_PIXEL_MAP_I_TO_R_SIZE              = $0CB2;
+  GL_PIXEL_MAP_I_TO_G_SIZE              = $0CB3;
+  GL_PIXEL_MAP_I_TO_B_SIZE              = $0CB4;
+  GL_PIXEL_MAP_I_TO_A_SIZE              = $0CB5;
+  GL_PIXEL_MAP_R_TO_R_SIZE              = $0CB6;
+  GL_PIXEL_MAP_G_TO_G_SIZE              = $0CB7;
+  GL_PIXEL_MAP_B_TO_B_SIZE              = $0CB8;
+  GL_PIXEL_MAP_A_TO_A_SIZE              = $0CB9;
+  GL_PIXEL_MAP_S_TO_S                   = $0C71;
+  GL_PIXEL_MAP_I_TO_I                   = $0C70;
+  GL_PIXEL_MAP_I_TO_R                   = $0C72;
+  GL_PIXEL_MAP_I_TO_G                   = $0C73;
+  GL_PIXEL_MAP_I_TO_B                   = $0C74;
+  GL_PIXEL_MAP_I_TO_A                   = $0C75;
+  GL_PIXEL_MAP_R_TO_R                   = $0C76;
+  GL_PIXEL_MAP_G_TO_G                   = $0C77;
+  GL_PIXEL_MAP_B_TO_B                   = $0C78;
+  GL_PIXEL_MAP_A_TO_A                   = $0C79;
+  GL_PACK_ALIGNMENT                     = $0D05;
+  GL_PACK_LSB_FIRST                     = $0D01;
+  GL_PACK_ROW_LENGTH                    = $0D02;
+  GL_PACK_SKIP_PIXELS                   = $0D04;
+  GL_PACK_SKIP_ROWS                     = $0D03;
+  GL_PACK_SWAP_BYTES                    = $0D00;
+  GL_UNPACK_ALIGNMENT                   = $0CF5;
+  GL_UNPACK_LSB_FIRST                   = $0CF1;
+  GL_UNPACK_ROW_LENGTH                  = $0CF2;
+  GL_UNPACK_SKIP_PIXELS                 = $0CF4;
+  GL_UNPACK_SKIP_ROWS                   = $0CF3;
+  GL_UNPACK_SWAP_BYTES                  = $0CF0;
+  GL_ZOOM_X                             = $0D16;
+  GL_ZOOM_Y                             = $0D17;
+
+  // Texture mapping
+  GL_TEXTURE_ENV                        = $2300;
+  GL_TEXTURE_ENV_MODE                   = $2200;
+  GL_TEXTURE_1D                         = $0DE0;
+  GL_TEXTURE_2D                         = $0DE1;
+  GL_TEXTURE_WRAP_S                     = $2802;
+  GL_TEXTURE_WRAP_T                     = $2803;
+  GL_TEXTURE_MAG_FILTER                 = $2800;
+  GL_TEXTURE_MIN_FILTER                 = $2801;
+  GL_TEXTURE_ENV_COLOR                  = $2201;
+  GL_TEXTURE_GEN_S                      = $0C60;
+  GL_TEXTURE_GEN_T                      = $0C61;
+  GL_TEXTURE_GEN_MODE                   = $2500;
+  GL_TEXTURE_BORDER_COLOR               = $1004;
+  GL_TEXTURE_WIDTH                      = $1000;
+  GL_TEXTURE_HEIGHT                     = $1001;
+  GL_TEXTURE_BORDER                     = $1005;
+  GL_TEXTURE_COMPONENTS                 = $1003;
+  GL_TEXTURE_RED_SIZE                   = $805C;
+  GL_TEXTURE_GREEN_SIZE                 = $805D;
+  GL_TEXTURE_BLUE_SIZE                  = $805E;
+  GL_TEXTURE_ALPHA_SIZE                 = $805F;
+  GL_TEXTURE_LUMINANCE_SIZE             = $8060;
+  GL_TEXTURE_INTENSITY_SIZE             = $8061;
+  GL_NEAREST_MIPMAP_NEAREST             = $2700;
+  GL_NEAREST_MIPMAP_LINEAR              = $2702;
+  GL_LINEAR_MIPMAP_NEAREST              = $2701;
+  GL_LINEAR_MIPMAP_LINEAR               = $2703;
+  GL_OBJECT_LINEAR                      = $2401;
+  GL_OBJECT_PLANE                       = $2501;
+  GL_EYE_LINEAR                         = $2400;
+  GL_EYE_PLANE                          = $2502;
+  GL_SPHERE_MAP                         = $2402;
+  GL_DECAL                              = $2101;
+  GL_MODULATE                           = $2100;
+  GL_NEAREST                            = $2600;
+  GL_REPEAT                             = $2901;
+  GL_CLAMP                              = $2900;
+  GL_S                                  = $2000;
+  GL_T                                  = $2001;
+  GL_R                                  = $2002;
+  GL_Q                                  = $2003;
+  GL_TEXTURE_GEN_R                      = $0C62;
+  GL_TEXTURE_GEN_Q                      = $0C63;
+{$ENDIF GL1_0}
+
+{$IFDEF GL1_1}
+
+const
+  // GL 1.1 texturing
+  GL_PROXY_TEXTURE_1D                   = $8063;
+  GL_PROXY_TEXTURE_2D                   = $8064;
+  GL_TEXTURE_PRIORITY                   = $8066;
+  GL_TEXTURE_RESIDENT                   = $8067;
+  GL_TEXTURE_BINDING_1D                 = $8068;
+  GL_TEXTURE_BINDING_2D                 = $8069;
+  GL_TEXTURE_INTERNAL_FORMAT            = $1003;
+
+  // Internal texture formats (GL 1.1)
+  GL_ALPHA4                             = $803B;
+  GL_ALPHA8                             = $803C;
+  GL_ALPHA12                            = $803D;
+  GL_ALPHA16                            = $803E;
+  GL_LUMINANCE4                         = $803F;
+  GL_LUMINANCE8                         = $8040;
+  GL_LUMINANCE12                        = $8041;
+  GL_LUMINANCE16                        = $8042;
+  GL_LUMINANCE4_ALPHA4                  = $8043;
+  GL_LUMINANCE6_ALPHA2                  = $8044;
+  GL_LUMINANCE8_ALPHA8                  = $8045;
+  GL_LUMINANCE12_ALPHA4                 = $8046;
+  GL_LUMINANCE12_ALPHA12                = $8047;
+  GL_LUMINANCE16_ALPHA16                = $8048;
+  GL_INTENSITY                          = $8049;
+  GL_INTENSITY4                         = $804A;
+  GL_INTENSITY8                         = $804B;
+  GL_INTENSITY12                        = $804C;
+  GL_INTENSITY16                        = $804D;
+  GL_R3_G3_B2                           = $2A10;
+  GL_RGB4                               = $804F;
+  GL_RGB5                               = $8050;
+  GL_RGB8                               = $8051;
+  GL_RGB10                              = $8052;
+  GL_RGB12                              = $8053;
+  GL_RGB16                              = $8054;
+  GL_RGBA2                              = $8055;
+  GL_RGBA4                              = $8056;
+  GL_RGB5_A1                            = $8057;
+  GL_RGBA8                              = $8058;
+  GL_RGB10_A2                           = $8059;
+  GL_RGBA12                             = $805A;
+  GL_RGBA16                             = $805B;
+
+{$ENDIF GL1_1}
+
+{$IFDEF GL1_2}
+
+const
+  // GL 1.2 texturing
+  GL_PACK_SKIP_IMAGES                   = $806B;
+  GL_PACK_IMAGE_HEIGHT                  = $806C;
+  GL_UNPACK_SKIP_IMAGES                 = $806D;
+  GL_UNPACK_IMAGE_HEIGHT                = $806E;
+  GL_TEXTURE_3D                         = $806F;
+  GL_PROXY_TEXTURE_3D                   = $8070;
+  GL_TEXTURE_DEPTH                      = $8071;
+  GL_TEXTURE_WRAP_R                     = $8072;
+  GL_MAX_3D_TEXTURE_SIZE                = $8073;
+  GL_TEXTURE_BINDING_3D                 = $806A;
+
+const
+  GL_RESCALE_NORMAL                     = $803A;
+  GL_CLAMP_TO_EDGE                      = $812F;
+  GL_MAX_ELEMENTS_VERTICES              = $F0E8;
+  GL_MAX_ELEMENTS_INDICES               = $F0E9;
+  GL_BGR                                = $80E0;
+  GL_BGRA                               = $80E1;
+  GL_UNSIGNED_BYTE_3_3_2                = $8032;
+  GL_UNSIGNED_BYTE_2_3_3_REV            = $8362;
+  GL_UNSIGNED_SHORT_5_6_5               = $8363;
+  GL_UNSIGNED_SHORT_5_6_5_REV           = $8364;
+  GL_UNSIGNED_SHORT_4_4_4_4             = $8033;
+  GL_UNSIGNED_SHORT_4_4_4_4_REV         = $8365;
+  GL_UNSIGNED_SHORT_5_5_5_1             = $8034;
+  GL_UNSIGNED_SHORT_1_5_5_5_REV         = $8366;
+  GL_UNSIGNED_INT_8_8_8_8               = $8035;
+  GL_UNSIGNED_INT_8_8_8_8_REV           = $8367;
+  GL_UNSIGNED_INT_10_10_10_2            = $8036;
+  GL_UNSIGNED_INT_2_10_10_10_REV        = $8368;
+  GL_LIGHT_MODEL_COLOR_CONTROL          = $81F8;
+  GL_SINGLE_COLOR                       = $81F9;
+  GL_SEPARATE_SPECULAR_COLOR            = $81FA;
+  GL_TEXTURE_MIN_LOD                    = $813A;
+  GL_TEXTURE_MAX_LOD                    = $813B;
+  GL_TEXTURE_BASE_LEVEL                 = $813C;
+  GL_TEXTURE_MAX_LEVEL                  = $813D;
+
+{$ENDIF GL1_2}
+
+const
+  // Utility
+  GL_VENDOR                             = $1F00;
+  GL_RENDERER                           = $1F01;
+  GL_VERSION                            = $1F02;
+  GL_EXTENSIONS                         = $1F03;
+
+  // Errors
+  GL_INVALID_VALUE                      = $0501;
+  GL_INVALID_ENUM                       = $0500;
+  GL_INVALID_OPERATION                  = $0502;
+  GL_STACK_OVERFLOW                     = $0503;
+  GL_STACK_UNDERFLOW                    = $0504;
+  GL_OUT_OF_MEMORY                      = $0505;
+
+
+// -------------------------------------------------------
+//   GL extensions constants
+// -------------------------------------------------------
+
+{$IFDEF EXTENSIONS}
+
+const
+  // GL_EXT_blend_minmax and GL_EXT_blend_color
+  GL_CONSTANT_COLOR_EXT                 = $8001;
+  GL_ONE_MINUS_CONSTANT_COLOR_EXT       = $8002;
+  GL_CONSTANT_ALPHA_EXT                 = $8003;
+  GL_ONE_MINUS_CONSTANT_ALPHA_EXT       = $8004;
+  GL_BLEND_EQUATION_EXT                 = $8009;
+  GL_MIN_EXT                            = $8007;
+  GL_MAX_EXT                            = $8008;
+  GL_FUNC_ADD_EXT                       = $8006;
+  GL_FUNC_SUBTRACT_EXT                  = $800A;
+  GL_FUNC_REVERSE_SUBTRACT_EXT          = $800B;
+  GL_BLEND_COLOR_EXT                    = $8005;
+
+  // GL_EXT_polygon_offset
+  GL_POLYGON_OFFSET_EXT                 = $8037;
+  GL_POLYGON_OFFSET_FACTOR_EXT          = $8038;
+  GL_POLYGON_OFFSET_BIAS_EXT            = $8039;
+
+  // GL_EXT_vertex_array
+  GL_VERTEX_ARRAY_EXT                   = $8074;
+  GL_NORMAL_ARRAY_EXT                   = $8075;
+  GL_COLOR_ARRAY_EXT                    = $8076;
+  GL_INDEX_ARRAY_EXT                    = $8077;
+  GL_TEXTURE_COORD_ARRAY_EXT            = $8078;
+  GL_EDGE_FLAG_ARRAY_EXT                = $8079;
+  GL_VERTEX_ARRAY_SIZE_EXT              = $807A;
+  GL_VERTEX_ARRAY_TYPE_EXT              = $807B;
+  GL_VERTEX_ARRAY_STRIDE_EXT            = $807C;
+  GL_VERTEX_ARRAY_COUNT_EXT             = $807D;
+  GL_NORMAL_ARRAY_TYPE_EXT              = $807E;
+  GL_NORMAL_ARRAY_STRIDE_EXT            = $807F;
+  GL_NORMAL_ARRAY_COUNT_EXT             = $8080;
+  GL_COLOR_ARRAY_SIZE_EXT               = $8081;
+  GL_COLOR_ARRAY_TYPE_EXT               = $8082;
+  GL_COLOR_ARRAY_STRIDE_EXT             = $8083;
+  GL_COLOR_ARRAY_COUNT_EXT              = $8084;
+  GL_INDEX_ARRAY_TYPE_EXT               = $8085;
+  GL_INDEX_ARRAY_STRIDE_EXT             = $8086;
+  GL_INDEX_ARRAY_COUNT_EXT              = $8087;
+  GL_TEXTURE_COORD_ARRAY_SIZE_EXT       = $8088;
+  GL_TEXTURE_COORD_ARRAY_TYPE_EXT       = $8089;
+  GL_TEXTURE_COORD_ARRAY_STRIDE_EXT     = $808A;
+  GL_TEXTURE_COORD_ARRAY_COUNT_EXT      = $808B;
+  GL_EDGE_FLAG_ARRAY_STRIDE_EXT         = $808C;
+  GL_EDGE_FLAG_ARRAY_COUNT_EXT          = $808D;
+  GL_VERTEX_ARRAY_POINTER_EXT           = $808E;
+  GL_NORMAL_ARRAY_POINTER_EXT           = $808F;
+  GL_COLOR_ARRAY_POINTER_EXT            = $8090;
+  GL_INDEX_ARRAY_POINTER_EXT            = $8091;
+  GL_TEXTURE_COORD_ARRAY_POINTER_EXT    = $8092;
+  GL_EDGE_FLAG_ARRAY_POINTER_EXT        = $8093;
+
+  // GL_EXT_texture_object
+  GL_TEXTURE_PRIORITY_EXT               = $8066;
+  GL_TEXTURE_RESIDENT_EXT               = $8067;
+  GL_TEXTURE_1D_BINDING_EXT             = $8068;
+  GL_TEXTURE_2D_BINDING_EXT             = $8069;
+
+  // GL_EXT_texture3D
+  GL_PACK_SKIP_IMAGES_EXT               = $806B;
+  GL_PACK_IMAGE_HEIGHT_EXT              = $806C;
+  GL_UNPACK_SKIP_IMAGES_EXT             = $806D;
+  GL_UNPACK_IMAGE_HEIGHT_EXT            = $806E;
+  GL_TEXTURE_3D_EXT                     = $806F;
+  GL_PROXY_TEXTURE_3D_EXT               = $8070;
+  GL_TEXTURE_DEPTH_EXT                  = $8071;
+  GL_TEXTURE_WRAP_R_EXT                 = $8072;
+  GL_MAX_3D_TEXTURE_SIZE_EXT            = $8073;
+  GL_TEXTURE_3D_BINDING_EXT             = $806A;
+
+  // GL_EXT_paletted_texture
+  GL_TABLE_TOO_LARGE_EXT                = $8031;
+  GL_COLOR_TABLE_FORMAT_EXT             = $80D8;
+  GL_COLOR_TABLE_WIDTH_EXT              = $80D9;
+  GL_COLOR_TABLE_RED_SIZE_EXT           = $80DA;
+  GL_COLOR_TABLE_GREEN_SIZE_EXT         = $80DB;
+  GL_COLOR_TABLE_BLUE_SIZE_EXT          = $80DC;
+  GL_COLOR_TABLE_ALPHA_SIZE_EXT         = $80DD;
+  GL_COLOR_TABLE_LUMINANCE_SIZE_EXT     = $80DE;
+  GL_COLOR_TABLE_INTENSITY_SIZE_EXT     = $80DF;
+  GL_TEXTURE_INDEX_SIZE_EXT             = $80ED;
+  GL_COLOR_INDEX1_EXT                   = $80E2;
+  GL_COLOR_INDEX2_EXT                   = $80E3;
+  GL_COLOR_INDEX4_EXT                   = $80E4;
+  GL_COLOR_INDEX8_EXT                   = $80E5;
+  GL_COLOR_INDEX12_EXT                  = $80E6;
+  GL_COLOR_INDEX16_EXT                  = $80E7;
+
+  // GL_EXT_shared_texture_palette
+  GL_SHARED_TEXTURE_PALETTE_EXT         = $81FB;
+
+  // GL_EXT_point_parameters
+  GL_POINT_SIZE_MIN_EXT                 = $8126;
+  GL_POINT_SIZE_MAX_EXT                 = $8127;
+  GL_POINT_FADE_THRESHOLD_SIZE_EXT      = $8128;
+  GL_DISTANCE_ATTENUATION_EXT           = $8129;
+
+  // GL_EXT_rescale_normal
+  GL_RESCALE_NORMAL_EXT                 = $803A;
+
+  // GL_EXT_abgr
+  GL_ABGR_EXT                           = $8000;
+
+const
+  // GL_EXT_multitexture
+  GL_SELECTED_TEXTURE_EXT               = $83C0;
+  GL_SELECTED_TEXTURE_COORD_SET_EXT     = $83C1;
+  GL_SELECTED_TEXTURE_TRANSFORM_EXT     = $83C2;
+  GL_MAX_TEXTURES_EXT                   = $83C3;
+  GL_MAX_TEXTURE_COORD_SETS_EXT         = $83C4;
+  GL_TEXTURE_ENV_COORD_SET_EXT          = $83C5;
+  GL_TEXTURE0_EXT                       = $83C6;
+  GL_TEXTURE1_EXT                       = $83C7;
+  GL_TEXTURE2_EXT                       = $83C8;
+  GL_TEXTURE3_EXT                       = $83C9;
+
+{$ENDIF EXTENSIONS}
+
+{$IFDEF SGI_EXTENSIONS}
+
+const
+  // GL_SGIS_multitexture
+  GL_SELECTED_TEXTURE_SGIS              = $835C;
+  GL_SELECTED_TEXTURE_COORD_SET_SGIS    = $835D;
+  GL_MAX_TEXTURES_SGIS                  = $835E;
+  GL_TEXTURE0_SGIS                      = $835F;
+  GL_TEXTURE1_SGIS                      = $8360;
+  GL_TEXTURE2_SGIS                      = $8361;
+  GL_TEXTURE3_SGIS                      = $8362;
+  GL_TEXTURE_COORD_SET_SOURCE_SGIS      = $8363;
+
+const
+  // GL_SGIS_texture_edge_clamp
+  GL_CLAMP_TO_EDGE_SGIS                 = $812F;
+
+{$ENDIF SGI_EXTENSIONS}
+
+{$IFDEF MESA}
+{$ENDIF MESA}
+
+
+// -------------------------------------------------------
+//   GL procedures and functions
+// -------------------------------------------------------
+
+{$IFDEF GL1_0}
+var
+// Miscellaneous
+glClearIndex: procedure(c: Single); cdecl;
+glClearColor: procedure(red, green, blue, alpha: GLclampf); cdecl;
+glClear: procedure(mask: GLbitfield); cdecl;
+glIndexMask: procedure(mask: LongWord); cdecl;
+glColorMask: procedure(red, green, blue, alpha: GLboolean); cdecl;
+glAlphaFunc: procedure(func: GLenum; ref: GLclampf); cdecl;
+glBlendFunc: procedure(sfactor, dfactor: GLenum); cdecl;
+glLogicOp: procedure(opcode: GLenum); cdecl;
+glCullFace: procedure(mode: GLenum); cdecl;
+glFrontFace: procedure(mode: GLenum); cdecl;
+glPointSize: procedure(size: Single); cdecl;
+glLineWidth: procedure(width: Single); cdecl;
+glLineStipple: procedure(factor: LongInt; pattern: Word); cdecl;
+glPolygonMode: procedure(face, mode: GLenum); cdecl;
+glPolygonOffset: procedure(factor, units: Single); cdecl;
+glPolygonStipple: procedure(var mask: Byte); cdecl;
+glGetPolygonStipple: procedure(var mask: Byte); cdecl;
+glEdgeFlag: procedure(flag: GLBoolean); cdecl;
+glEdgeFlagv: procedure(var flag: GLBoolean); cdecl;
+glScissor: procedure(x, y, width, height: LongInt); cdecl;
+glClipPlane: procedure(plane: GLenum; var equation: Double); cdecl;
+glGetClipPlane: procedure(plane: GLenum; var equation: Double); cdecl;
+glDrawBuffer: procedure(mode: GLenum); cdecl;
+glReadBuffer: procedure(mode: GLenum); cdecl;
+glEnable: procedure(cap: LongInt); cdecl;
+glDisable: procedure(cap: LongInt); cdecl;
+glIsEnabled: function(cap: GLenum): GLBoolean; cdecl;
+glGetBooleanv: procedure(pname: GLenum; params : PGLBoolean); cdecl;
+glGetDoublev: procedure(pname: GLenum; params : PDouble); cdecl;
+glGetFloatv: procedure(pname: GLenum; params : PSingle); cdecl;
+glGetIntegerv: procedure(pname: GLenum; params : PLongInt); cdecl;
+glPushAttrib: procedure(mask: GLbitfield); cdecl;
+glPopAttrib: procedure; cdecl;
+glRenderMode: function(mode: GLenum): LongInt; cdecl;
+glGetError: function: GLenum; cdecl;
+glGetString: function(name: GLenum): PChar; cdecl;
+glFinish: procedure; cdecl;
+glFlush: procedure; cdecl;
+glHint: procedure(target, mode: GLenum); cdecl;
+
+// Depth Buffer
+glClearDepth: procedure(depth: GLclampd); cdecl;
+glDepthFunc: procedure(func: LongInt); cdecl;
+glDepthMask: procedure(flag: GLBoolean); cdecl;
+glDepthRange: procedure(near_val, far_val: GLclampd); cdecl;
+
+// Accumulation Buffer
+glClearAccum: procedure(red, green, blue, alpha: Single); cdecl;
+glAccum: procedure(op: GLenum; value: Single); cdecl;
+
+// Tranformation
+glMatrixMode: procedure(mode: GLenum); cdecl;
+glOrtho: procedure(left, right, bottom, top, near_val, far_val: Double); cdecl;
+glFrustum: procedure(left, right, bottom, top, near_val, far_val: Double); cdecl;
+glViewport: procedure(x, y, width, height: LongInt); cdecl;
+glPushMatrix: procedure; cdecl;
+glPopMatrix: procedure; cdecl;
+glLoadIdentity: procedure; cdecl;
+glLoadMatrixd: procedure(var m: Double); cdecl;
+glLoadMatrixf: procedure(var m: PSingle); cdecl;
+glMultMatrixd: procedure(var m: Double); cdecl;
+glMultMatrixf: procedure(var m: Single); cdecl;
+glRotated: procedure(angle, x, y, z: Double); cdecl;
+glRotatef: procedure(angle, x, y, z: Single); cdecl;
+glScaled: procedure(x, y, z: Double); cdecl;
+glScalef: procedure(x, y, z: Single); cdecl;
+glTranslated: procedure(x, y, z: Double); cdecl;
+glTranslatef: procedure(x, y, z: Single); cdecl;
+
+// Display Lists
+glIsList: function(list: LongWord): GLBoolean; cdecl;
+glDeleteLists: procedure(list: LongWord; range: LongInt); cdecl;
+glGenLists: function(range: LongInt): LongWord; cdecl;
+glNewList: procedure(list: LongWord; mode: GLenum); cdecl;
+glEndList: procedure; cdecl;
+glCallList: procedure(list: LongWord); cdecl;
+glCallLists: procedure(n: LongInt; AType: GLenum; var lists); cdecl;
+glListBase: procedure(base: LongWord); cdecl;
+
+// Drawing Functions
+glBegin: procedure(mode: GLenum); cdecl;
+glEnd: procedure; cdecl;
+glVertex2d: procedure(x, y: Double); cdecl;
+glVertex2f: procedure(x, y: Single); cdecl;
+glVertex2i: procedure(x, y: LongInt); cdecl;
+glVertex2s: procedure(x, y: SmallInt); cdecl;
+glVertex3d: procedure(x, y, z: Double); cdecl;
+glVertex3f: procedure(x, y, z: Single); cdecl;
+glVertex3i: procedure(x, y, z: LongInt); cdecl;
+glVertex3s: procedure(x, y, z: SmallInt); cdecl;
+glVertex4d: procedure(x, y, z, w: Double); cdecl;
+glVertex4f: procedure(x, y, z, w: Single); cdecl;
+glVertex4i: procedure(x, y, z, w: LongInt); cdecl;
+glVertex4s: procedure(x, y, z, w: SmallInt); cdecl;
+glVertex2dv: procedure(var v: Double); cdecl;
+glVertex2fv: procedure(var v: Single); cdecl;
+glVertex2iv: procedure(var v: LongInt); cdecl;
+glVertex2sv: procedure(var v: SmallInt); cdecl;
+glVertex3dv: procedure(var v: Double); cdecl;
+glVertex3fv: procedure(var v: Single); cdecl;
+glVertex3iv: procedure(var v: LongInt); cdecl;
+glVertex3sv: procedure(var v: SmallInt); cdecl;
+glVertex4dv: procedure(var v: Double); cdecl;
+glVertex4fv: procedure(var v: Single); cdecl;
+glVertex4iv: procedure(var v: LongInt); cdecl;
+glVertex4sv: procedure(var v: SmallInt); cdecl;
+glNormal3b: procedure(nx, ny, nz: Byte); cdecl;
+glNormal3d: procedure(nx, ny, nz: Double); cdecl;
+glNormal3f: procedure(nx, ny, nz: Single); cdecl;
+glNormal3i: procedure(nx, ny, nz: LongInt); cdecl;
+glNormal3s: procedure(nx, ny, nz: SmallInt); cdecl;
+glNormal3bv: procedure(var v: ShortInt); cdecl;
+glNormal3dv: procedure(var v: Double); cdecl;
+glNormal3fv: procedure(var v: Single); cdecl;
+glNormal3iv: procedure(var v: LongInt); cdecl;
+glNormal3sv: procedure(var v: SmallInt); cdecl;
+glIndexd: procedure(c: Double); cdecl;
+glIndexf: procedure(c: Single); cdecl;
+glIndexi: procedure(c: LongInt); cdecl;
+glIndexs: procedure(c: SmallInt); cdecl;
+glIndexdv: procedure(var c: Double); cdecl;
+glIndexfv: procedure(var c: Single); cdecl;
+glIndexiv: procedure(var c: LongInt); cdecl;
+glIndexsv: procedure(var c: SmallInt); cdecl;
+glColor3b: procedure (red, green, blue: ShortInt); cdecl;
+glColor3d: procedure (red, green, blue: Double); cdecl;
+glColor3f: procedure (red, green, blue: Single); cdecl;
+glColor3i: procedure (red, green, blue: LongInt); cdecl;
+glColor3s: procedure (red, green, blue: SmallInt); cdecl;
+glColor3ub: procedure(red, green, blue: Byte); cdecl;
+glColor3ui: procedure(red, green, blue: LongWord); cdecl;
+glColor3us: procedure(red, green, blue: Word); cdecl;
+glColor4b: procedure (red, green, blue, alpha: ShortInt); cdecl;
+glColor4d: procedure (red, green, blue, alpha: Double); cdecl;
+glColor4f: procedure (red, green, blue, alpha: Single); cdecl;
+glColor4i: procedure (red, green, blue, alpha: LongInt); cdecl;
+glColor4s: procedure (red, green, blue, alpha: SmallInt); cdecl;
+glColor4ub: procedure(red, green, blue, alpha: Byte); cdecl;
+glColor4ui: procedure(red, green, blue, alpha: LongWord); cdecl;
+glColor4us: procedure(red, green, blue, alpha: Word); cdecl;
+glColor3bv: procedure (var v: ShortInt); cdecl;
+glColor3dv: procedure (var v: Double); cdecl;
+glColor3fv: procedure (var v: Single); cdecl;
+glColor3iv: procedure (var v: LongInt); cdecl;
+glColor3sv: procedure (var v: SmallInt); cdecl;
+glColor3ubv: procedure(var v: Byte); cdecl;
+glColor3uiv: procedure(var v: LongWord); cdecl;
+glColor3usv: procedure(var v: Word); cdecl;
+glColor4bv: procedure (var v: ShortInt); cdecl;
+glColor4dv: procedure (var v: Double); cdecl;
+glColor4fv: procedure (var v: Single); cdecl;
+glColor4iv: procedure (var v: LongInt); cdecl;
+glColor4sv: procedure (var v: SmallInt); cdecl;
+glColor4ubv: procedure(var v: Byte); cdecl;
+glColor4uiv: procedure(var v: LongWord); cdecl;
+glColor4usv: procedure(var v: Word); cdecl;
+glTexCoord1d: procedure(s: Double); cdecl;
+glTexCoord1f: procedure(s: Single); cdecl;
+glTexCoord1i: procedure(s: LongInt); cdecl;
+glTexCoord1s: procedure(s: SmallInt); cdecl;
+glTexCoord2d: procedure(s, t: Double); cdecl;
+glTexCoord2f: procedure(s, t: Single); cdecl;
+glTexCoord2i: procedure(s, t: LongInt); cdecl;
+glTexCoord2s: procedure(s, t: SmallInt); cdecl;
+glTexCoord3d: procedure(s, t, r: Double); cdecl;
+glTexCoord3f: procedure(s, t, r: Single); cdecl;
+glTexCoord3i: procedure(s, t, r: LongInt); cdecl;
+glTexCoord3s: procedure(s, t, r: SmallInt); cdecl;
+glTexCoord4d: procedure(s, t, r, q: Double); cdecl;
+glTexCoord4f: procedure(s, t, r, q: Single); cdecl;
+glTexCoord4i: procedure(s, t, r, q: LongInt); cdecl;
+glTexCoord4s: procedure(s, t, r, q: SmallInt); cdecl;
+glTexCoord1dv: procedure(var v: Double); cdecl;
+glTexCoord1fv: procedure(var v: Single); cdecl;
+glTexCoord1iv: procedure(var v: LongInt); cdecl;
+glTexCoord1sv: procedure(var v: SmallInt); cdecl;
+glTexCoord2dv: procedure(var v: Double); cdecl;
+glTexCoord2fv: procedure(var v: Single); cdecl;
+glTexCoord2iv: procedure(var v: LongInt); cdecl;
+glTexCoord2sv: procedure(var v: SmallInt); cdecl;
+glTexCoord3dv: procedure(var v: Double); cdecl;
+glTexCoord3fv: procedure(var v: Single); cdecl;
+glTexCoord3iv: procedure(var v: LongInt); cdecl;
+glTexCoord3sv: procedure(var v: SmallInt); cdecl;
+glTexCoord4dv: procedure(var v: Double); cdecl;
+glTexCoord4fv: procedure(var v: Single); cdecl;
+glTexCoord4iv: procedure(var v: LongInt); cdecl;
+glTexCoord4sv: procedure(var v: SmallInt); cdecl;
+glRasterPos2d: procedure(x, y: Double); cdecl;
+glRasterPos2f: procedure(x, y: Single); cdecl;
+glRasterPos2i: procedure(x, y: LongInt); cdecl;
+glRasterPos2s: procedure(x, y: SmallInt); cdecl;
+glRasterPos3d: procedure(x, y, z: Double); cdecl;
+glRasterPos3f: procedure(x, y, z: Single); cdecl;
+glRasterPos3i: procedure(x, y, z: LongInt); cdecl;
+glRasterPos3s: procedure(x, y, z: SmallInt); cdecl;
+glRasterPos4d: procedure(x, y, z, w: Double); cdecl;
+glRasterPos4f: procedure(x, y, z, w: Single); cdecl;
+glRasterPos4i: procedure(x, y, z, w: LongInt); cdecl;
+glRasterPos4s: procedure(x, y, z, w: SmallInt); cdecl;
+glRasterPos2dv: procedure(var v: Double); cdecl;
+glRasterPos2fv: procedure(var v: Single); cdecl;
+glRasterPos2iv: procedure(var v: LongInt); cdecl;
+glRasterPos2sv: procedure(var v: SmallInt); cdecl;
+glRasterPos3dv: procedure(var v: Double); cdecl;
+glRasterPos3fv: procedure(var v: Single); cdecl;
+glRasterPos3iv: procedure(var v: LongInt); cdecl;
+glRasterPos3sv: procedure(var v: SmallInt); cdecl;
+glRasterPos4dv: procedure(var v: Double); cdecl;
+glRasterPos4fv: procedure(var v: Single); cdecl;
+glRasterPos4iv: procedure(var v: LongInt); cdecl;
+glRasterPos4sv: procedure(var v: SmallInt); cdecl;
+glRectd: procedure(x1, y1, x2, y2: Double); cdecl;
+glRectf: procedure(x1, y1, x2, y2: Single); cdecl;
+glRecti: procedure(x1, y1, x2, y2: LongInt); cdecl;
+glRects: procedure(x1, y1, x2, y2: SmallInt); cdecl;
+glRectdv: procedure(var v1, v2: Double); cdecl;
+glRectfv: procedure(var v1, v2: Single); cdecl;
+glRectiv: procedure(var v1, v2: LongInt); cdecl;
+glRectsv: procedure(var v1, v2: SmallInt); cdecl;
+
+// Lighting
+glShadeModel: procedure(mode: GLenum); cdecl;
+glLightf: procedure(light, pname: GLenum; param: Single); cdecl;
+glLighti: procedure(light, pname: GLenum; param: LongInt); cdecl;
+glLightfv: procedure(light, pname: GLenum; params : PSingle); cdecl;
+glLightiv: procedure(light, pname: GLenum; params : PLongInt); cdecl;
+glGetLightfv: procedure(light, pname: GLenum; params : PSingle); cdecl;
+glGetLightiv: procedure(light, pname: GLenum; params : PLongInt); cdecl;
+glLightModelf: procedure(pname: GLenum; param: Single); cdecl;
+glLightModeli: procedure(pname: GLenum; param: LongInt); cdecl;
+glLightModelfv: procedure(pname: GLenum; params : PSingle); cdecl;
+glLightModeliv: procedure(pname: GLenum; params : PLongInt); cdecl;
+glMaterialf: procedure(face, pname: GLenum; param: Single); cdecl;
+glMateriali: procedure(face, pname: GLenum; param: LongInt); cdecl;
+glMaterialfv: procedure(face, pname: GLenum; params : PSingle); cdecl;
+glMaterialiv: procedure(face, pname: GLenum; params : PLongInt); cdecl;
+glGetMaterialfv: procedure(face, pname: GLenum; params : PSingle); cdecl;
+glGetMaterialiv: procedure(face, pname: GLenum; params : PLongInt); cdecl;
+glColorMaterial: procedure(face, mode: GLenum); cdecl;
+
+// Raster Functions
+glPixelZoom: procedure(xfactor, yfactor: Single); cdecl;
+glPixelStoref: procedure(pname: GLenum; param: Single); cdecl;
+glPixelStorei: procedure(pname: GLenum; param: LongInt); cdecl;
+glPixelTransferf: procedure(pname: GLenum; param: Single); cdecl;
+glPixelTransferi: procedure(pname: GLenum; param: LongInt); cdecl;
+glPixelMapfv: procedure(map: GLenum; mapsize: LongInt; var values: Single); cdecl;
+glPixelMapuiv: procedure(map: GLenum; mapsize: LongInt; var values: LongWord); cdecl;
+glPixelMapusv: procedure(map: GLenum; mapsize: LongInt; var values: Word); cdecl;
+glGetPixelMapfv: procedure(map: GLenum; var values: Single); cdecl;
+glGetPixelMapuiv: procedure(map: GLenum; var values: LongWord); cdecl;
+glGetPixelMapusv: procedure(map: GLenum; var values: Word); cdecl;
+glBitmap: procedure(width, height: LongInt; xorig, yorig, xmove, ymove: Single; var bitmap); cdecl;
+glReadPixels: procedure(x, y, width, height: LongInt; format, AType: GLenum; var pixels); cdecl;
+glDrawPixels: procedure(width, height: LongInt; format, AType: GLenum; var pixels); cdecl;
+glCopyPixels: procedure(x, y, width, height: LongInt; AType: GLenum); cdecl;
+
+// Stenciling
+glStencilFunc: procedure(func: GLenum; ref: LongInt; mask: LongWord); cdecl;
+glStencilMask: procedure(mask: LongWord); cdecl;
+glStencilOp: procedure(fail, zfail, zpass: GLenum); cdecl;
+glClearStencil: procedure(s: LongInt); cdecl;
+
+// Texture Mapping
+glTexGend: procedure(cord, pname: GLenum; param: Double); cdecl;
+glTexGenf: procedure(cord, pname: GLenum; param: Single); cdecl;
+glTexGeni: procedure(cord, pname: GLenum; param: LongInt); cdecl;
+glTexGendv: procedure(cord, pname: GLenum; params : PDouble); cdecl;
+glTexGenfv: procedure(cord, pname: GLenum; params : PSingle); cdecl;
+glTexGeniv: procedure(cord, pname: GLenum; params : PLongInt); cdecl;
+glGetTexGendv: procedure(cord, pname: GLenum; params : PDouble); cdecl;
+glGetTexGenfv: procedure(cord, pname: GLenum; params : PSingle); cdecl;
+glGetTexGeniv: procedure(cord, pname: GLenum; params : PLongInt); cdecl;
+glTexEnvf: procedure(target, pname: GLenum; param: Single); cdecl;
+glTexEnvi: procedure(target, pname: GLenum; param: LongInt); cdecl;
+glTexEnvfv: procedure(target, pname: GLenum; params : PSingle); cdecl;
+glTexEnviv: procedure(target, pname: GLenum; params : PLongInt); cdecl;
+glGetTexEnvfv: procedure(target, pname: GLenum; params : PSingle); cdecl;
+glGetTexEnviv: procedure(target, pname: GLenum; params : PLongInt); cdecl;
+glTexParameterf: procedure(target, pname: GLenum; param: Single); cdecl;
+glTexParameteri: procedure(target, pname: GLenum; param: LongInt); cdecl;
+glTexParameterfv: procedure(target, pname: GLenum; params : PSingle); cdecl;
+glTexParameteriv: procedure(target, pname: GLenum; params : PLongInt); cdecl;
+glGetTexParameterfv: procedure(target, pname: GLenum; params : PSingle); cdecl;
+glGetTexParameteriv: procedure(target, pname: GLenum; params : PLongInt); cdecl;
+glGetTexLevelParameterfv: procedure(target: GLenum; level: LongInt; pname: GLenum; params : PSingle); cdecl;
+glGetTexLevelParameteriv: procedure(target: GLenum; level: LongInt; pname: GLenum; params : PLongInt); cdecl;
+glTexImage1D: procedure(target: GLenum; level, internalFormat, width, border: LongInt; format, AType: GLenum; var pixels); cdecl;
+glTexImage2D: procedure(target: GLenum; level, internalFormat, width, height, border: LongInt; format, AType: GLenum; var pixels); cdecl;
+glGetTexImage: procedure(target: GLenum; level: LongInt; format, AType: GLenum; var pixels); cdecl;
+
+// Evaluators
+glMap1d: procedure(target: GLenum; u1, u2: Double; stride, order: LongInt; var points: Double); cdecl;
+glMap1f: procedure(target: GLenum; u1, u2: Single; stride, order: LongInt; var points: Single); cdecl;
+glMap2d: procedure(target: GLenum; u1, u2: Double; ustride, uorder: LongInt; v1, v2: Double; vstride, vorder: LongInt; var points: Double); cdecl;
+glMap2f: procedure(target: GLenum; u1, u2: Single; ustride, uorder: LongInt; v1, v2: Single; vstride, vorder: LongInt; var points: Single); cdecl;
+glGetMapdv: procedure(target, query: GLenum; var v: Double); cdecl;
+glGetMapfv: procedure(target, query: GLenum; var v: Single); cdecl;
+glGetMapiv: procedure(target, query: GLenum; var v: LongInt); cdecl;
+glEvalCoord1d: procedure(u: Double); cdecl;
+glEvalCoord1f: procedure(u: Single); cdecl;
+glEvalCoord1dv: procedure(var u: Double); cdecl;
+glEvalCoord1fv: procedure(var u: Single); cdecl;
+glEvalCoord2d: procedure(u, v: Double); cdecl;
+glEvalCoord2f: procedure(u, v: Single); cdecl;
+glEvalCoord2dv: procedure(var u, v: Double); cdecl;
+glEvalCoord2fv: procedure(var u, v: Single); cdecl;
+glMapGrid1d: procedure(un: LongInt; u1, u2: Double); cdecl;
+glMapGrid1f: procedure(un: LongInt; u1, u2: Single); cdecl;
+glMapGrid2d: procedure(un: LongInt; u1, u2: Double; vn: LongInt; v1, v2: Double); cdecl;
+glMapGrid2f: procedure(un: LongInt; u1, u2: Single; vn: LongInt; v1, v2: Single); cdecl;
+glEvalPoint1: procedure(i: LongInt); cdecl;
+glEvalPoint2: procedure(i, j: LongInt); cdecl;
+glEvalMesh1: procedure(mode: GLenum; i1, i2: LongInt); cdecl;
+glEvalMesh2: procedure(mode: GLenum; i1, i2, j1, j2: LongInt); cdecl;
+
+// Fog
+glFogf: procedure(pname: GLenum; param: Single); cdecl;
+glFogi: procedure(pname: GLenum; param: LongInt); cdecl;
+glFogfv: procedure(pname: GLenum; params : PSingle); cdecl;
+glFogiv: procedure(pname: GLenum; params : PLongInt); cdecl;
+
+// Selection and Feedback
+glFeedbackBuffer: procedure(size: LongInt; AType: GLenum; var buffer: Single); cdecl;
+glPassThrough: procedure(token: Single); cdecl;
+glSelectBuffer: procedure(size: LongInt; var buffer: LongWord); cdecl;
+glInitNames: procedure; cdecl;
+glLoadName: procedure(name: LongWord); cdecl;
+glPushName: procedure(name: LongWord); cdecl;
+glPopName: procedure; cdecl;
+
+{$ENDIF GL1_0}
+
+{$IFDEF GL1_1}
+var
+
+// Miscellaneous
+glEnableClientState: procedure(cap: GLenum); cdecl;
+glDisableClientState: procedure(cap: GLenum); cdecl;
+glPushClientAttrib: procedure(mask: GLbitfield); cdecl;
+glPopClientAttrib: procedure; cdecl;
+
+// Drawing Functions
+glIndexub: procedure(c: Byte); cdecl;
+glIndexubv: procedure(var c: Byte); cdecl;
+
+// Vertex Arrays
+glVertexPointer: procedure(size: LongInt; AType: GLenum; stride: LongInt; var ptr); cdecl;
+glNormalPointer: procedure(AType: GLenum; stride: LongInt; var ptr); cdecl;
+glColorPointer: procedure(size: LongInt; AType: GLenum; stride: LongInt; var ptr); cdecl;
+glIndexPointer: procedure(AType: GLenum; stride: LongInt; var ptr); cdecl;
+glTexCoordPointer: procedure(size: LongInt; AType: GLenum; stride: LongInt; var ptr); cdecl;
+glEdgeFlagPointer: procedure(stride: LongInt; var ptr); cdecl;
+glGetPointerv: procedure(pname: GLenum; var params: Pointer); cdecl;
+glArrayElement: procedure(i: LongInt); cdecl;
+glDrawArrays: procedure(mode: GLenum; first, count: LongInt); cdecl;
+glDrawElements: procedure(mode: GLenum; count: Integer; AType: GLenum; var indices); cdecl;
+glInterleavedArrays: procedure(format: GLenum; stride: LongInt; var pointer); cdecl;
+
+// Texture Mapping
+glGenTextures: procedure(n: LongInt; var textures: LongWord); cdecl;
+glDeleteTextures: procedure(n: LongInt; var textures: LongWord); cdecl;
+glBindTexture: procedure(target: GLenum; texture: LongWord); cdecl;
+glPrioritizeTextures: procedure(n: LongInt; var textures: LongWord; var priorities: GLclampf); cdecl;
+glAreTexturesResident: function(n: LongInt; var textures: LongWord; var residences: Boolean): Boolean; cdecl;
+glIsTexture: function(texture: LongWord): Boolean; cdecl;
+glTexSubImage1D: procedure(target: GLenum; level, xoffset, width: LongInt; format, AType: GLenum; var pixels); cdecl;
+glTexSubImage2D: procedure(target: GLenum; level, xoffset, yoffset, width, height: LongInt; format, AType: GLenum; var pixels); cdecl;
+glCopyTexImage1D: procedure(target: GLenum; level: LongInt; format: GLenum; x, y, width, border: LongInt); cdecl;
+glCopyTexImage2D: procedure(target: GLenum; level: LongInt; format: GLenum; x, y, width, height, border: LongInt); cdecl;
+glCopyTexSubImage1D: procedure(target: GLenum; level, xoffset, x, y, width: LongInt); cdecl;
+glCopyTexSubImage2D: procedure(target: GLenum; level, xoffset, yoffset, x, y, width, height: LongInt); cdecl;
+
+{$ENDIF GL1_1}
+
+{$IFDEF GL1_2}
+var
+glDrawRangeElements: procedure(mode: GLenum; AStart, AEnd: LongWord; count: LongInt; AType: GLenum; var indices); cdecl;
+glTexImage3D: procedure(target: GLenum; level: LongInt; internalFormat: GLenum; width, height, depth, border: LongInt; format, AType: GLEnum; var pixels); cdecl;
+glTexSubImage3D: procedure(target: GLenum; level: LongInt; xoffset, yoffset, zoffset, width, height, depth: LongInt; format, AType: GLEnum; var pixels); cdecl;
+glCopyTexSubImage3D: procedure(target: GLenum; level: LongInt; xoffset, yoffset, zoffset, x, y, width, height: LongInt); cdecl;
+{$ENDIF GL1_2}
+
+
+// -------------------------------------------------------
+//   GL Extensions
+// -------------------------------------------------------
+
+{$IFDEF EXTENSIONS}
+var
+
+// === 1.0 Extensions ===
+
+// GL_EXT_blend_minmax
+glBlendEquationEXT: procedure(mode: GLenum); cdecl;
+
+// GL_EXT_blend_color
+glBlendColorEXT: procedure(red, green, blue, alpha: GLclampf); cdecl;
+
+// GL_EXT_polygon_offset
+glPolygonOffsetEXT: procedure(factor, bias: Single); cdecl;
+
+// GL_EXT_vertex_array
+glVertexPointerEXT: procedure(size: LongInt; AType: GLenum; stride, count: LongInt; var ptr); cdecl;
+glNormalPointerEXT: procedure(AType: GLenum; stride, count: LongInt; var ptr); cdecl;
+glColorPointerEXT: procedure(size: LongInt; AType: GLenum; stride, count: LongInt; var ptr); cdecl;
+glIndexPointerEXT: procedure(AType: GLenum; stride, count: LongInt; var ptr); cdecl;
+glTexCoordPointerEXT: procedure(size: LongInt; AType: GLenum; stride, count: LongInt; var ptr); cdecl;
+glEdgeFlagPointerEXT: procedure(stride, count: LongInt; var ptr: Boolean); cdecl;
+glGetPointervEXT: procedure(pname: GLenum; var params: Pointer); cdecl;
+glArrayElementEXT: procedure(i: LongInt); cdecl;
+glDrawArraysEXT: procedure(mode: GLEnum; first, count: LongInt); cdecl;
+
+// GL_EXT_texture_object
+glGenTexturesEXT: procedure(n: LongInt; var textures: LongWord); cdecl;
+glDeleteTexturesEXT: procedure(n: LongInt; var textures: LongWord); cdecl;
+glBindTextureEXT: procedure(target: GLenum; texture: LongWord); cdecl;
+glPrioritizeTexturesEXT: procedure(n: LongInt; var textures: LongWord; var priorities: GLClampf); cdecl;
+glAreTexturesResidentEXT: function(n: LongInt; var textures: LongWord; var residences: Boolean): Boolean; cdecl;
+glIsTextureEXT: function(texture: LongWord): Boolean; cdecl;
+
+// GL_EXT_texture3D
+glTexImage3DEXT: procedure(target: GLenum; level: LongInt; internalFormat: GLenum; width, height, depth, border: LongInt; format, AType: GLenum; var pixels); cdecl;
+glTexSubImage3DEXT: procedure(target: GLenum; level, xoffset, yoffset, zoffset, width, height, depth: LongInt; format, AType: GLenum; var pixels); cdecl;
+glCopyTexSubImage3DEXT: procedure(target: GLenum; level, xoffset, yoffset, zoffset, x, y, width, height: LongInt); cdecl;
+
+// GL_EXT_color_table
+glColorTableEXT: procedure(target, internalformat: GLenum; width: LongInt; format, AType: GLenum; var table); cdecl;
+glColorSubTableEXT: procedure(target: GLenum; start, count: LongInt; format, AType: GLEnum; var data); cdecl;
+glGetColorTableEXT: procedure(target, format, AType: GLenum; var table); cdecl;
+glGetColorTableParameterfvEXT: procedure(target, pname: GLenum; var params: Single); cdecl;
+glGetColorTableParameterivEXT: procedure(target, pname: GLenum; var params: LongInt); cdecl;
+
+{$ENDIF EXTENSIONS}
+
+// library dependent extensions
+
+{$IFDEF SGI_EXTENSIONS}
+var
+
+// GL_SGIS_multitexture
+glMultiTexCoord1dSGIS: procedure(target: GLenum; s: Double); cdecl;
+glMultiTexCoord1dvSGIS: procedure(target: GLenum; var v: Double); cdecl;
+glMultiTexCoord1fSGIS: procedure(target: GLenum; s: Single); cdecl;
+glMultiTexCoord1fvSGIS: procedure(target: GLenum; var v: Single); cdecl;
+glMultiTexCoord1iSGIS: procedure(target: GLenum; s: LongInt); cdecl;
+glMultiTexCoord1ivSGIS: procedure(target: GLenum; var v: LongInt); cdecl;
+glMultiTexCoord1sSGIS: procedure(target: GLenum; s: ShortInt); cdecl;
+glMultiTexCoord1svSGIS: procedure(target: GLenum; var v: ShortInt); cdecl;
+glMultiTexCoord2dSGIS: procedure(target: GLenum; s, t: Double); cdecl;
+glMultiTexCoord2dvSGIS: procedure(target: GLenum; var v: Double); cdecl;
+glMultiTexCoord2fSGIS: procedure(target: GLenum; s, t: Single); cdecl;
+glMultiTexCoord2fvSGIS: procedure(target: GLenum; var v: Single); cdecl;
+glMultiTexCoord2iSGIS: procedure(target: GLenum; s, t: LongInt); cdecl;
+glMultiTexCoord2ivSGIS: procedure(target: GLenum; var v: LongInt); cdecl;
+glMultiTexCoord2sSGIS: procedure(target: GLenum; s, t: ShortInt); cdecl;
+glMultiTexCoord2svSGIS: procedure(target: GLenum; var v: ShortInt); cdecl;
+glMultiTexCoord3dSGIS: procedure(target: GLenum; s, t, r: Double); cdecl;
+glMultiTexCoord3dvSGIS: procedure(target: GLenum; var v: Double); cdecl;
+glMultiTexCoord3fSGIS: procedure(target: GLenum; s, t, r: Single); cdecl;
+glMultiTexCoord3fvSGIS: procedure(target: GLenum; var v: Single); cdecl;
+glMultiTexCoord3iSGIS: procedure(target: GLenum; s, t, r: LongInt); cdecl;
+glMultiTexCoord3ivSGIS: procedure(target: GLenum; var v: LongInt); cdecl;
+glMultiTexCoord3sSGIS: procedure(target: GLenum; s, t, r: ShortInt); cdecl;
+glMultiTexCoord3svSGIS: procedure(target: GLenum; var v: ShortInt); cdecl;
+glMultiTexCoord4dSGIS: procedure(target: GLenum; s, t, r, q: Double); cdecl;
+glMultiTexCoord4dvSGIS: procedure(target: GLenum; var v: Double); cdecl;
+glMultiTexCoord4fSGIS: procedure(target: GLenum; s, t, r, q: Single); cdecl;
+glMultiTexCoord4fvSGIS: procedure(target: GLenum; var v: Single); cdecl;
+glMultiTexCoord4iSGIS: procedure(target: GLenum; s, t, r, q: LongInt); cdecl;
+glMultiTexCoord4ivSGIS: procedure(target: GLenum; var v: LongInt); cdecl;
+glMultiTexCoord4sSGIS: procedure(target: GLenum; s, t, r, q: ShortInt); cdecl;
+glMultiTexCoord4svSGIS: procedure(target: GLenum; var v: ShortInt); cdecl;
+glMultiTexCoordPointerSGIS: procedure(target: GLenum; size: LongInt; AType: GLEnum; stride: LongInt; var APointer); cdecl;
+glSelectTextureSGIS: procedure(target: GLenum); cdecl;
+glSelectTextureCoordSetSGIS: procedure(target: GLenum); cdecl;
+
+// GL_EXT_multitexture
+glMultiTexCoord1dEXT: procedure(target: GLenum; s: Double); cdecl;
+glMultiTexCoord1dvEXT: procedure(target: GLenum; var v: Double); cdecl;
+glMultiTexCoord1fEXT: procedure(target: GLenum; s: Single); cdecl;
+glMultiTexCoord1fvEXT: procedure(target: GLenum; var v: Single); cdecl;
+glMultiTexCoord1iEXT: procedure(target: GLenum; s: LongInt); cdecl;
+glMultiTexCoord1ivEXT: procedure(target: GLenum; var v: LongInt); cdecl;
+glMultiTexCoord1sEXT: procedure(target: GLenum; s: ShortInt); cdecl;
+glMultiTexCoord1svEXT: procedure(target: GLenum; var v: ShortInt); cdecl;
+glMultiTexCoord2dEXT: procedure(target: GLenum; s, t: Double); cdecl;
+glMultiTexCoord2dvEXT: procedure(target: GLenum; var v: Double); cdecl;
+glMultiTexCoord2fEXT: procedure(target: GLenum; s, t: Single); cdecl;
+glMultiTexCoord2fvEXT: procedure(target: GLenum; var v: Single); cdecl;
+glMultiTexCoord2iEXT: procedure(target: GLenum; s, t: LongInt); cdecl;
+glMultiTexCoord2ivEXT: procedure(target: GLenum; var v: LongInt); cdecl;
+glMultiTexCoord2sEXT: procedure(target: GLenum; s, t: ShortInt); cdecl;
+glMultiTexCoord2svEXT: procedure(target: GLenum; var v: ShortInt); cdecl;
+glMultiTexCoord3dEXT: procedure(target: GLenum; s, t, r: Double); cdecl;
+glMultiTexCoord3dvEXT: procedure(target: GLenum; var v: Double); cdecl;
+glMultiTexCoord3fEXT: procedure(target: GLenum; s, t, r: Single); cdecl;
+glMultiTexCoord3fvEXT: procedure(target: GLenum; var v: Single); cdecl;
+glMultiTexCoord3iEXT: procedure(target: GLenum; s, t, r: LongInt); cdecl;
+glMultiTexCoord3ivEXT: procedure(target: GLenum; var v: LongInt); cdecl;
+glMultiTexCoord3sEXT: procedure(target: GLenum; s, t, r: ShortInt); cdecl;
+glMultiTexCoord3svEXT: procedure(target: GLenum; var v: ShortInt); cdecl;
+glMultiTexCoord4dEXT: procedure(target: GLenum; s, t, r, q: Double); cdecl;
+glMultiTexCoord4dvEXT: procedure(target: GLenum; var v: Double); cdecl;
+glMultiTexCoord4fEXT: procedure(target: GLenum; s, t, r, q: Single); cdecl;
+glMultiTexCoord4fvEXT: procedure(target: GLenum; var v: Single); cdecl;
+glMultiTexCoord4iEXT: procedure(target: GLenum; s, t, r, q: LongInt); cdecl;
+glMultiTexCoord4ivEXT: procedure(target: GLenum; var v: LongInt); cdecl;
+glMultiTexCoord4sEXT: procedure(target: GLenum; s, t, r, q: ShortInt); cdecl;
+glMultiTexCoord4svEXT: procedure(target: GLenum; var v: ShortInt); cdecl;
+glInterleavedTextureCoordSetsEXT: procedure(factor: LongInt); cdecl;
+glSelectTextureEXT: procedure(target: GLenum); cdecl;
+glSelectTextureCoordSetEXT: procedure(target: GLenum); cdecl;
+glSelectTextureTransformEXT: procedure(target: GLenum); cdecl;
+
+// GL_EXT_point_parameters
+glPointParameterfEXT: procedure(pname: GLenum; param: Single); cdecl;
+glPointParameterfvEXT: procedure(pname: GLenum; var params: Single); cdecl;
+
+{$ENDIF SGI_EXTENSIONS}
+
+{$ifdef MESA}
+var
+// GL_MESA_window_pos
+glWindowPos2iMESA: procedure(x, y: LongInt); cdecl;
+glWindowPos2sMESA: procedure(x, y: ShortInt); cdecl;
+glWindowPos2fMESA: procedure(x, y: Single); cdecl;
+glWindowPos2dMESA: procedure(x, y: Double); cdecl;
+glWindowPos2ivMESA: procedure(var p: LongInt); cdecl;
+glWindowPos2svMESA: procedure(var p: ShortInt); cdecl;
+glWindowPos2fvMESA: procedure(var p: Single); cdecl;
+glWindowPos2dvMESA: procedure(var p: Double); cdecl;
+glWindowPos3iMESA: procedure(x, y, z: LongInt); cdecl;
+glWindowPos3sMESA: procedure(x, y, z: ShortInt); cdecl;
+glWindowPos3fMESA: procedure(x, y, z: Single); cdecl;
+glWindowPos3dMESA: procedure(x, y, z: Double); cdecl;
+glWindowPos3ivMESA: procedure(var p: LongInt); cdecl;
+glWindowPos3svMESA: procedure(var p: ShortInt); cdecl;
+glWindowPos3fvMESA: procedure(var p: Single); cdecl;
+glWindowPos3dvMESA: procedure(var p: Double); cdecl;
+glWindowPos4iMESA: procedure(x, y, z, w: LongInt); cdecl;
+glWindowPos4sMESA: procedure(x, y, z, w: ShortInt); cdecl;
+glWindowPos4fMESA: procedure(x, y, z, w: Single); cdecl;
+glWindowPos4dMESA: procedure(x, y, z, w: Double); cdecl;
+glWindowPos4ivMESA: procedure(var p: LongInt); cdecl;
+glWindowPos4svMESA: procedure(var p: ShortInt); cdecl;
+glWindowPos4fvMESA: procedure(var p: Single); cdecl;
+glWindowPos4dvMESA: procedure(var p: Double); cdecl;
+
+// GL_MESA_resize_buffers
+glResizeBuffersMESA: procedure; cdecl;
+{$endif MESA}
+
+
+// =======================================================
+// =======================================================
+
+implementation
+
+
+{$LINKLIB m}
+
+function dlopen(AFile: PChar; mode: LongInt): Pointer; external 'dl';
+function dlclose(handle: Pointer): LongInt; external 'dl';
+function dlsym(handle: Pointer; name: PChar): Pointer; external 'dl';
+
+function LoadLibrary(name: PChar): Pointer;
+begin
+  Result := dlopen(name, $101 {RTLD_GLOBAL or RTLD_LAZY});
+end;
+
+function GetProc(handle: Pointer; name: PChar): Pointer;
+begin
+  Result := dlsym(handle, name);
+  if (Result = nil) and  GLDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+var
+  libGL : Pointer;
+
+function InitGLFromLibrary(libname: PChar): Boolean;
+begin
+  Result := False;
+  libGL := LoadLibrary(libname);
+  if not Assigned(libGL) then exit;
+
+{$ifdef GL1_0}
+// Miscellaneous
+  glClearIndex := GetProc(libgl, 'glClearIndex');
+  glClearColor := GetProc(libgl, 'glClearColor');
+  glClear := GetProc(libgl, 'glClear');
+  glIndexMask := GetProc(libgl, 'glIndexMask');
+  glColorMask := GetProc(libgl, 'glColorMask');
+  glAlphaFunc := GetProc(libgl, 'glAlphaFunc');
+  glBlendFunc := GetProc(libgl, 'glBlendFunc');
+  glLogicOp := GetProc(libgl, 'glLogicOp');
+  glCullFace := GetProc(libgl, 'glCullFace');
+  glFrontFace := GetProc(libgl, 'glFrontFace');
+  glPointSize := GetProc(libgl, 'glPointSize');
+  glLineWidth := GetProc(libgl, 'glLineWidth');
+  glLineStipple := GetProc(libgl, 'glLineStipple');
+  glPolygonMode := GetProc(libgl, 'glPolygonMode');
+  glPolygonOffset := GetProc(libgl, 'glPolygonOffset');
+  glPolygonStipple := GetProc(libgl, 'glPolygonStipple');
+  glGetPolygonStipple := GetProc(libgl, 'glGetPolygonStipple');
+  glEdgeFlag := GetProc(libgl, 'glEdgeFlag');
+  glEdgeFlagv := GetProc(libgl, 'glEdgeFlagv');
+  glScissor := GetProc(libgl, 'glScissor');
+  glClipPlane := GetProc(libgl, 'glClipPlane');
+  glGetClipPlane := GetProc(libgl, 'glGetClipPlane');
+  glDrawBuffer := GetProc(libgl, 'glDrawBuffer');
+  glReadBuffer := GetProc(libgl, 'glReadBuffer');
+  glEnable := GetProc(libgl, 'glEnable');
+  glDisable := GetProc(libgl, 'glDisable');
+  glIsEnabled := GetProc(libgl, 'glIsEnabled');
+  glGetBooleanv := GetProc(libgl, 'glGetBooleanv');
+  glGetDoublev := GetProc(libgl, 'glGetDoublev');
+  glGetFloatv := GetProc(libgl, 'glGetFloatv');
+  glGetIntegerv := GetProc(libgl, 'glGetIntegerv');
+  glPushAttrib := GetProc(libgl, 'glPushAttrib');
+  glPopAttrib := GetProc(libgl, 'glPopAttrib');
+  glRenderMode := GetProc(libgl, 'glRenderMode');
+  glGetError := GetProc(libgl, 'glGetError');
+  glGetString := GetProc(libgl, 'glGetString');
+  glFinish := GetProc(libgl, 'glFinish');
+  glFlush := GetProc(libgl, 'glFlush');
+  glHint := GetProc(libgl, 'glHint');
+// Depth Buffer
+  glClearDepth := GetProc(libgl, 'glClearDepth');
+  glDepthFunc := GetProc(libgl, 'glDepthFunc');
+  glDepthMask := GetProc(libgl, 'glDepthMask');
+  glDepthRange := GetProc(libgl, 'glDepthRange');
+// Accumulation Buffer
+  glClearAccum := GetProc(libgl, 'glClearAccum');
+  glAccum := GetProc(libgl, 'glAccum');
+// Tranformation
+  glMatrixMode := GetProc(libgl, 'glMatrixMode');
+  glOrtho := GetProc(libgl, 'glOrtho');
+  glFrustum := GetProc(libgl, 'glFrustum');
+  glViewport := GetProc(libgl, 'glViewport');
+  glPushMatrix := GetProc(libgl, 'glPushMatrix');
+  glPopMatrix := GetProc(libgl, 'glPopMatrix');
+  glLoadIdentity := GetProc(libgl, 'glLoadIdentity');
+  glLoadMatrixd := GetProc(libgl, 'glLoadMatrixd');
+  glLoadMatrixf := GetProc(libgl, 'glLoadMatrixf');
+  glMultMatrixd := GetProc(libgl, 'glMultMatrixd');
+  glMultMatrixf := GetProc(libgl, 'glMultMatrixf');
+  glRotated := GetProc(libgl, 'glRotated');
+  glRotatef := GetProc(libgl, 'glRotatef');
+  glScaled := GetProc(libgl, 'glScaled');
+  glScalef := GetProc(libgl, 'glScalef');
+  glTranslated := GetProc(libgl, 'glTranslated');
+  glTranslatef := GetProc(libgl, 'glTranslatef');
+// Display Lists
+  glIsList := GetProc(libgl, 'glIsList');
+  glDeleteLists := GetProc(libgl, 'glDeleteLists');
+  glGenLists := GetProc(libgl, 'glGenLists');
+  glNewList := GetProc(libgl, 'glNewList');
+  glEndList := GetProc(libgl, 'glEndList');
+  glCallList := GetProc(libgl, 'glCallList');
+  glCallLists := GetProc(libgl, 'glCallLists');
+  glListBase := GetProc(libgl, 'glListBase');
+// Drawing Functions
+  glBegin := GetProc(libgl, 'glBegin');
+  glEnd := GetProc(libgl, 'glEnd');
+  glVertex2d := GetProc(libgl, 'glVertex2d');
+  glVertex2f := GetProc(libgl, 'glVertex2f');
+  glVertex2i := GetProc(libgl, 'glVertex2i');
+  glVertex2s := GetProc(libgl, 'glVertex2s');
+  glVertex3d := GetProc(libgl, 'glVertex3d');
+  glVertex3f := GetProc(libgl, 'glVertex3f');
+  glVertex3i := GetProc(libgl, 'glVertex3i');
+  glVertex3s := GetProc(libgl, 'glVertex3s');
+  glVertex4d := GetProc(libgl, 'glVertex4d');
+  glVertex4f := GetProc(libgl, 'glVertex4f');
+  glVertex4i := GetProc(libgl, 'glVertex4i');
+  glVertex4s := GetProc(libgl, 'glVertex4s');
+  glVertex2dv := GetProc(libgl, 'glVertex2dv');
+  glVertex2fv := GetProc(libgl, 'glVertex2fv');
+  glVertex2iv := GetProc(libgl, 'glVertex2iv');
+  glVertex2sv := GetProc(libgl, 'glVertex2sv');
+  glVertex3dv := GetProc(libgl, 'glVertex3dv');
+  glVertex3fv := GetProc(libgl, 'glVertex3fv');
+  glVertex3iv := GetProc(libgl, 'glVertex3iv');
+  glVertex3sv := GetProc(libgl, 'glVertex3sv');
+  glVertex4dv := GetProc(libgl, 'glVertex4dv');
+  glVertex4fv := GetProc(libgl, 'glVertex4fv');
+  glVertex4iv := GetProc(libgl, 'glVertex4iv');
+  glVertex4sv := GetProc(libgl, 'glVertex4sv');
+  glNormal3b := GetProc(libgl, 'glNormal3b');
+  glNormal3d := GetProc(libgl, 'glNormal3d');
+  glNormal3f := GetProc(libgl, 'glNormal3f');
+  glNormal3i := GetProc(libgl, 'glNormal3i');
+  glNormal3s := GetProc(libgl, 'glNormal3s');
+  glNormal3bv := GetProc(libgl, 'glNormal3bv');
+  glNormal3dv := GetProc(libgl, 'glNormal3dv');
+  glNormal3fv := GetProc(libgl, 'glNormal3fv');
+  glNormal3iv := GetProc(libgl, 'glNormal3iv');
+  glNormal3sv := GetProc(libgl, 'glNormal3sv');
+  glIndexd := GetProc(libgl, 'glIndexd');
+  glIndexf := GetProc(libgl, 'glIndexf');
+  glIndexi := GetProc(libgl, 'glIndexi');
+  glIndexs := GetProc(libgl, 'glIndexs');
+  glIndexdv := GetProc(libgl, 'glIndexdv');
+  glIndexfv := GetProc(libgl, 'glIndexfv');
+  glIndexiv := GetProc(libgl, 'glIndexiv');
+  glIndexsv := GetProc(libgl, 'glIndexsv');
+  glColor3b := GetProc(libgl, 'glColor3b');
+  glColor3d := GetProc(libgl, 'glColor3d');
+  glColor3f := GetProc(libgl, 'glColor3f');
+  glColor3i := GetProc(libgl, 'glColor3i');
+  glColor3s := GetProc(libgl, 'glColor3s');
+  glColor3ub := GetProc(libgl, 'glColor3ub');
+  glColor3ui := GetProc(libgl, 'glColor3ui');
+  glColor3us := GetProc(libgl, 'glColor3us');
+  glColor4b := GetProc(libgl, 'glColor4b');
+  glColor4d := GetProc(libgl, 'glColor4d');
+  glColor4f := GetProc(libgl, 'glColor4f');
+  glColor4i := GetProc(libgl, 'glColor4i');
+  glColor4s := GetProc(libgl, 'glColor4s');
+  glColor4ub := GetProc(libgl, 'glColor4ub');
+  glColor4ui := GetProc(libgl, 'glColor4ui');
+  glColor4us := GetProc(libgl, 'glColor4us');
+  glColor3bv := GetProc(libgl, 'glColor3bv');
+  glColor3dv := GetProc(libgl, 'glColor3dv');
+  glColor3fv := GetProc(libgl, 'glColor3fv');
+  glColor3iv := GetProc(libgl, 'glColor3iv');
+  glColor3sv := GetProc(libgl, 'glColor3sv');
+  glColor3ubv := GetProc(libgl, 'glColor3ubv');
+  glColor3uiv := GetProc(libgl, 'glColor3uiv');
+  glColor3usv := GetProc(libgl, 'glColor3usv');
+  glColor4bv := GetProc(libgl, 'glColor4bv');
+  glColor4dv := GetProc(libgl, 'glColor4dv');
+  glColor4fv := GetProc(libgl, 'glColor4fv');
+  glColor4iv := GetProc(libgl, 'glColor4iv');
+  glColor4sv := GetProc(libgl, 'glColor4sv');
+  glColor4ubv := GetProc(libgl, 'glColor4ubv');
+  glColor4uiv := GetProc(libgl, 'glColor4uiv');
+  glColor4usv := GetProc(libgl, 'glColor4usv');
+  glTexCoord1d := GetProc(libgl, 'glTexCoord1d');
+  glTexCoord1f := GetProc(libgl, 'glTexCoord1f');
+  glTexCoord1i := GetProc(libgl, 'glTexCoord1i');
+  glTexCoord1s := GetProc(libgl, 'glTexCoord1s');
+  glTexCoord2d := GetProc(libgl, 'glTexCoord2d');
+  glTexCoord2f := GetProc(libgl, 'glTexCoord2f');
+  glTexCoord2i := GetProc(libgl, 'glTexCoord2i');
+  glTexCoord2s := GetProc(libgl, 'glTexCoord2s');
+  glTexCoord3d := GetProc(libgl, 'glTexCoord3d');
+  glTexCoord3f := GetProc(libgl, 'glTexCoord3f');
+  glTexCoord3i := GetProc(libgl, 'glTexCoord3i');
+  glTexCoord3s := GetProc(libgl, 'glTexCoord3s');
+  glTexCoord4d := GetProc(libgl, 'glTexCoord4d');
+  glTexCoord4f := GetProc(libgl, 'glTexCoord4f');
+  glTexCoord4i := GetProc(libgl, 'glTexCoord4i');
+  glTexCoord4s := GetProc(libgl, 'glTexCoord4s');
+  glTexCoord1dv := GetProc(libgl, 'glTexCoord1dv');
+  glTexCoord1fv := GetProc(libgl, 'glTexCoord1fv');
+  glTexCoord1iv := GetProc(libgl, 'glTexCoord1iv');
+  glTexCoord1sv := GetProc(libgl, 'glTexCoord1sv');
+  glTexCoord2dv := GetProc(libgl, 'glTexCoord2dv');
+  glTexCoord2fv := GetProc(libgl, 'glTexCoord2fv');
+  glTexCoord2iv := GetProc(libgl, 'glTexCoord2iv');
+  glTexCoord2sv := GetProc(libgl, 'glTexCoord2sv');
+  glTexCoord3dv := GetProc(libgl, 'glTexCoord3dv');
+  glTexCoord3fv := GetProc(libgl, 'glTexCoord3fv');
+  glTexCoord3iv := GetProc(libgl, 'glTexCoord3iv');
+  glTexCoord3sv := GetProc(libgl, 'glTexCoord3sv');
+  glTexCoord4dv := GetProc(libgl, 'glTexCoord4dv');
+  glTexCoord4fv := GetProc(libgl, 'glTexCoord4fv');
+  glTexCoord4iv := GetProc(libgl, 'glTexCoord4iv');
+  glTexCoord4sv := GetProc(libgl, 'glTexCoord4sv');
+  glRasterPos2d := GetProc(libgl, 'glRasterPos2d');
+  glRasterPos2f := GetProc(libgl, 'glRasterPos2f');
+  glRasterPos2i := GetProc(libgl, 'glRasterPos2i');
+  glRasterPos2s := GetProc(libgl, 'glRasterPos2s');
+  glRasterPos3d := GetProc(libgl, 'glRasterPos3d');
+  glRasterPos3f := GetProc(libgl, 'glRasterPos3f');
+  glRasterPos3i := GetProc(libgl, 'glRasterPos3i');
+  glRasterPos3s := GetProc(libgl, 'glRasterPos3s');
+  glRasterPos4d := GetProc(libgl, 'glRasterPos4d');
+  glRasterPos4f := GetProc(libgl, 'glRasterPos4f');
+  glRasterPos4i := GetProc(libgl, 'glRasterPos4i');
+  glRasterPos4s := GetProc(libgl, 'glRasterPos4s');
+  glRasterPos2dv := GetProc(libgl, 'glRasterPos2dv');
+  glRasterPos2fv := GetProc(libgl, 'glRasterPos2fv');
+  glRasterPos2iv := GetProc(libgl, 'glRasterPos2iv');
+  glRasterPos2sv := GetProc(libgl, 'glRasterPos2sv');
+  glRasterPos3dv := GetProc(libgl, 'glRasterPos3dv');
+  glRasterPos3fv := GetProc(libgl, 'glRasterPos3fv');
+  glRasterPos3iv := GetProc(libgl, 'glRasterPos3iv');
+  glRasterPos3sv := GetProc(libgl, 'glRasterPos3sv');
+  glRasterPos4dv := GetProc(libgl, 'glRasterPos4dv');
+  glRasterPos4fv := GetProc(libgl, 'glRasterPos4fv');
+  glRasterPos4iv := GetProc(libgl, 'glRasterPos4iv');
+  glRasterPos4sv := GetProc(libgl, 'glRasterPos4sv');
+  glRectd := GetProc(libgl, 'glRectd');
+  glRectf := GetProc(libgl, 'glRectf');
+  glRecti := GetProc(libgl, 'glRecti');
+  glRects := GetProc(libgl, 'glRects');
+  glRectdv := GetProc(libgl, 'glRectdv');
+  glRectfv := GetProc(libgl, 'glRectfv');
+  glRectiv := GetProc(libgl, 'glRectiv');
+  glRectsv := GetProc(libgl, 'glRectsv');
+// Lighting
+  glShadeModel := GetProc(libgl, 'glShadeModel');
+  glLightf := GetProc(libgl, 'glLightf');
+  glLighti := GetProc(libgl, 'glLighti');
+  glLightfv := GetProc(libgl, 'glLightfv');
+  glLightiv := GetProc(libgl, 'glLightiv');
+  glGetLightfv := GetProc(libgl, 'glGetLightfv');
+  glGetLightiv := GetProc(libgl, 'glGetLightiv');
+  glLightModelf := GetProc(libgl, 'glLightModelf');
+  glLightModeli := GetProc(libgl, 'glLightModeli');
+  glLightModelfv := GetProc(libgl, 'glLightModelfv');
+  glLightModeliv := GetProc(libgl, 'glLightModeliv');
+  glMaterialf := GetProc(libgl, 'glMaterialf');
+  glMateriali := GetProc(libgl, 'glMateriali');
+  glMaterialfv := GetProc(libgl, 'glMaterialfv');
+  glMaterialiv := GetProc(libgl, 'glMaterialiv');
+  glGetMaterialfv := GetProc(libgl, 'glGetMaterialfv');
+  glGetMaterialiv := GetProc(libgl, 'glGetMaterialiv');
+  glColorMaterial := GetProc(libgl, 'glColorMaterial');
+// Raster Functions
+  glPixelZoom := GetProc(libgl, 'glPixelZoom');
+  glPixelStoref := GetProc(libgl, 'glPixelStoref');
+  glPixelStorei := GetProc(libgl, 'glPixelStorei');
+  glPixelTransferf := GetProc(libgl, 'glPixelTransferf');
+  glPixelTransferi := GetProc(libgl, 'glPixelTransferi');
+  glPixelMapfv := GetProc(libgl, 'glPixelMapfv');
+  glPixelMapuiv := GetProc(libgl, 'glPixelMapuiv');
+  glPixelMapusv := GetProc(libgl, 'glPixelMapusv');
+  glGetPixelMapfv := GetProc(libgl, 'glGetPixelMapfv');
+  glGetPixelMapuiv := GetProc(libgl, 'glGetPixelMapuiv');
+  glGetPixelMapusv := GetProc(libgl, 'glGetPixelMapusv');
+  glBitmap := GetProc(libgl, 'glBitmap');
+  glReadPixels := GetProc(libgl, 'glReadPixels');
+  glDrawPixels := GetProc(libgl, 'glDrawPixels');
+  glCopyPixels := GetProc(libgl, 'glCopyPixels');
+// Stenciling
+  glStencilFunc := GetProc(libgl, 'glStencilFunc');
+  glStencilMask := GetProc(libgl, 'glStencilMask');
+  glStencilOp := GetProc(libgl, 'glStencilOp');
+  glClearStencil := GetProc(libgl, 'glClearStencil');
+// Texture Mapping
+  glTexGend := GetProc(libgl, 'glTexGend');
+  glTexGenf := GetProc(libgl, 'glTexGenf');
+  glTexGeni := GetProc(libgl, 'glTexGeni');
+  glTexGendv := GetProc(libgl, 'glTexGendv');
+  glTexGenfv := GetProc(libgl, 'glTexGenfv');
+  glTexGeniv := GetProc(libgl, 'glTexGeniv');
+  glGetTexGendv := GetProc(libgl, 'glGetTexGendv');
+  glGetTexGenfv := GetProc(libgl, 'glGetTexGenfv');
+  glGetTexGeniv := GetProc(libgl, 'glGetTexGeniv');
+  glTexEnvf := GetProc(libgl, 'glTexEnvf');
+  glTexEnvi := GetProc(libgl, 'glTexEnvi');
+  glTexEnvfv := GetProc(libgl, 'glTexEnvfv');
+  glTexEnviv := GetProc(libgl, 'glTexEnviv');
+  glGetTexEnvfv := GetProc(libgl, 'glGetTexEnvfv');
+  glGetTexEnviv := GetProc(libgl, 'glGetTexEnviv');
+  glTexParameterf := GetProc(libgl, 'glTexParameterf');
+  glTexParameteri := GetProc(libgl, 'glTexParameteri');
+  glTexParameterfv := GetProc(libgl, 'glTexParameterfv');
+  glTexParameteriv := GetProc(libgl, 'glTexParameteriv');
+  glGetTexParameterfv := GetProc(libgl, 'glGetTexParameterfv');
+  glGetTexParameteriv := GetProc(libgl, 'glGetTexParameteriv');
+  glGetTexLevelParameterfv := GetProc(libgl, 'glGetTexLevelParameterfv');
+  glGetTexLevelParameteriv := GetProc(libgl, 'glGetTexLevelParameteriv');
+  glTexImage1D := GetProc(libgl, 'glTexImage1D');
+  glTexImage2D := GetProc(libgl, 'glTexImage2D');
+  glGetTexImage := GetProc(libgl, 'glGetTexImage');
+// Evaluators
+  glMap1d := GetProc(libgl, 'glMap1d');
+  glMap1f := GetProc(libgl, 'glMap1f');
+  glMap2d := GetProc(libgl, 'glMap2d');
+  glMap2f := GetProc(libgl, 'glMap2f');
+  glGetMapdv := GetProc(libgl, 'glGetMapdv');
+  glGetMapfv := GetProc(libgl, 'glGetMapfv');
+  glGetMapiv := GetProc(libgl, 'glGetMapiv');
+  glEvalCoord1d := GetProc(libgl, 'glEvalCoord1d');
+  glEvalCoord1f := GetProc(libgl, 'glEvalCoord1f');
+  glEvalCoord1dv := GetProc(libgl, 'glEvalCoord1dv');
+  glEvalCoord1fv := GetProc(libgl, 'glEvalCoord1fv');
+  glEvalCoord2d := GetProc(libgl, 'glEvalCoord2d');
+  glEvalCoord2f := GetProc(libgl, 'glEvalCoord2f');
+  glEvalCoord2dv := GetProc(libgl, 'glEvalCoord2dv');
+  glEvalCoord2fv := GetProc(libgl, 'glEvalCoord2fv');
+  glMapGrid1d := GetProc(libgl, 'glMapGrid1d');
+  glMapGrid1f := GetProc(libgl, 'glMapGrid1f');
+  glMapGrid2d := GetProc(libgl, 'glMapGrid2d');
+  glMapGrid2f := GetProc(libgl, 'glMapGrid2f');
+  glEvalPoint1 := GetProc(libgl, 'glEvalPoint1');
+  glEvalPoint2 := GetProc(libgl, 'glEvalPoint2');
+  glEvalMesh1 := GetProc(libgl, 'glEvalMesh1');
+  glEvalMesh2 := GetProc(libgl, 'glEvalMesh2');
+// Fog
+  glFogf := GetProc(libgl, 'glFogf');
+  glFogi := GetProc(libgl, 'glFogi');
+  glFogfv := GetProc(libgl, 'glFogfv');
+  glFogiv := GetProc(libgl, 'glFogiv');
+// Selection and Feedback
+  glFeedbackBuffer := GetProc(libgl, 'glFeedbackBuffer');
+  glPassThrough := GetProc(libgl, 'glPassThrough');
+  glSelectBuffer := GetProc(libgl, 'glSelectBuffer');
+  glInitNames := GetProc(libgl, 'glInitNames');
+  glLoadName := GetProc(libgl, 'glLoadName');
+  glPushName := GetProc(libgl, 'glPushName');
+  glPopName := GetProc(libgl, 'glPopName');
+{$endif GL1_0}
+
+{$ifdef GL1_1}
+// Miscellaneous
+  glEnableClientState := GetProc(libgl, 'glEnableClientState');
+  glDisableClientState := GetProc(libgl, 'glDisableClientState');
+  glPushClientAttrib := GetProc(libgl, 'glPushClientAttrib');
+  glPopClientAttrib := GetProc(libgl, 'glPopClientAttrib');
+// Drawing Functions
+  glIndexub := GetProc(libgl, 'glIndexub');
+  glIndexubv := GetProc(libgl, 'glIndexubv');
+// Vertex Arrays
+  glVertexPointer := GetProc(libgl, 'glVertexPointer');
+  glNormalPointer := GetProc(libgl, 'glNormalPointer');
+  glColorPointer := GetProc(libgl, 'glColorPointer');
+  glIndexPointer := GetProc(libgl, 'glIndexPointer');
+  glTexCoordPointer := GetProc(libgl, 'glTexCoordPointer');
+  glEdgeFlagPointer := GetProc(libgl, 'glEdgeFlagPointer');
+  glGetPointerv := GetProc(libgl, 'glGetPointerv');
+  glArrayElement := GetProc(libgl, 'glArrayElement');
+  glDrawArrays := GetProc(libgl, 'glDrawArrays');
+  glDrawElements := GetProc(libgl, 'glDrawElements');
+  glInterleavedArrays := GetProc(libgl, 'glInterleavedArrays');
+// Texture Mapping
+  glGenTextures := GetProc(libgl, 'glGenTextures');
+  glDeleteTextures := GetProc(libgl, 'glDeleteTextures');
+  glBindTexture := GetProc(libgl, 'glBindTexture');
+  glPrioritizeTextures := GetProc(libgl, 'glPrioritizeTextures');
+  glAreTexturesResident := GetProc(libgl, 'glAreTexturesResident');
+  glIsTexture := GetProc(libgl, 'glIsTexture');
+  glTexSubImage1D := GetProc(libgl, 'glTexSubImage1D');
+  glTexSubImage2D := GetProc(libgl, 'glTexSubImage2D');
+  glCopyTexImage1D := GetProc(libgl, 'glCopyTexImage1D');
+  glCopyTexImage2D := GetProc(libgl, 'glCopyTexImage2D');
+  glCopyTexSubImage1D := GetProc(libgl, 'glCopyTexSubImage1D');
+  glCopyTexSubImage2D := GetProc(libgl, 'glCopyTexSubImage2D');
+{$endif GL1_1}
+
+{$ifdef GL1_2}
+  glDrawRangeElements := GetProc(libgl, 'glDrawRangeElements');
+  glTexImage3D := GetProc(libgl, 'glTexImage3D');
+  glTexSubImage3D := GetProc(libgl, 'glTexSubImage3D');
+  glCopyTexSubImage3D := GetProc(libgl, 'glCopyTexSubImage3D');
+{$endif GL1_2}
+
+{$ifdef EXTENSIONS}
+// === 1.0 Extensions ===
+// GL_EXT_blend_minmax
+  glBlendEquationEXT := GetProc(libgl, 'glBlendEquationEXT');
+// GL_EXT_blend_color
+  glBlendColorEXT := GetProc(libgl, 'glBlendColorEXT');
+// GL_EXT_polygon_offset
+  glPolygonOffsetEXT := GetProc(libgl, 'glPolygonOffsetEXT');
+// GL_EXT_vertex_array
+  glVertexPointerEXT := GetProc(libgl, 'glVertexPointerEXT');
+  glNormalPointerEXT := GetProc(libgl, 'glNormalPointerEXT');
+  glColorPointerEXT := GetProc(libgl, 'glColorPointerEXT');
+  glIndexPointerEXT := GetProc(libgl, 'glIndexPointerEXT');
+  glTexCoordPointerEXT := GetProc(libgl, 'glTexCoordPointerEXT');
+  glEdgeFlagPointerEXT := GetProc(libgl, 'glEdgeFlagPointerEXT');
+  glGetPointervEXT := GetProc(libgl, 'glGetPointervEXT');
+  glArrayElementEXT := GetProc(libgl, 'glArrayElementEXT');
+  glDrawArraysEXT := GetProc(libgl, 'glDrawArraysEXT');
+// GL_EXT_texture_object
+  glGenTexturesEXT := GetProc(libgl, 'glGenTexturesEXT');
+  glDeleteTexturesEXT := GetProc(libgl, 'glDeleteTexturesEXT');
+  glBindTextureEXT := GetProc(libgl, 'glBindTextureEXT');
+  glPrioritizeTexturesEXT := GetProc(libgl, 'glPrioritizeTexturesEXT');
+  glAreTexturesResidentEXT := GetProc(libgl, 'glAreTexturesResidentEXT');
+  glIsTextureEXT := GetProc(libgl, 'glIsTextureEXT');
+// GL_EXT_texture3D
+  glTexImage3DEXT := GetProc(libgl, 'glTexImage3DEXT');
+  glTexSubImage3DEXT := GetProc(libgl, 'glTexSubImage3DEXT');
+  glCopyTexSubImage3DEXT := GetProc(libgl, 'glCopyTexSubImage3DEXT');
+// GL_EXT_color_table
+  glColorTableEXT := GetProc(libgl, 'glColorTableEXT');
+  glColorSubTableEXT := GetProc(libgl, 'glColorSubTableEXT');
+  glGetColorTableEXT := GetProc(libgl, 'glGetColorTableEXT');
+  glGetColorTableParameterfvEXT := GetProc(libgl, 'glGetColorTableParameterfvEXT');
+  glGetColorTableParameterivEXT := GetProc(libgl, 'glGetColorTableParameterivEXT');
+{$endif EXTENSIONS}
+
+{$ifdef SGI_EXTENSIONS}
+// GL_SGIS_multitexture
+  glMultiTexCoord1dSGIS := GetProc(libgl, 'glMultiTexCoord1dSGIS');
+  glMultiTexCoord1dvSGIS := GetProc(libgl, 'glMultiTexCoord1dvSGIS');
+  glMultiTexCoord1fSGIS := GetProc(libgl, 'glMultiTexCoord1fSGIS');
+  glMultiTexCoord1fvSGIS := GetProc(libgl, 'glMultiTexCoord1fvSGIS');
+  glMultiTexCoord1iSGIS := GetProc(libgl, 'glMultiTexCoord1iSGIS');
+  glMultiTexCoord1ivSGIS := GetProc(libgl, 'glMultiTexCoord1ivSGIS');
+  glMultiTexCoord1sSGIS := GetProc(libgl, 'glMultiTexCoord1sSGIS');
+  glMultiTexCoord1svSGIS := GetProc(libgl, 'glMultiTexCoord1svSGIS');
+  glMultiTexCoord2dSGIS := GetProc(libgl, 'glMultiTexCoord2dSGIS');
+  glMultiTexCoord2dvSGIS := GetProc(libgl, 'glMultiTexCoord2dvSGIS');
+  glMultiTexCoord2fSGIS := GetProc(libgl, 'glMultiTexCoord2fSGIS');
+  glMultiTexCoord2fvSGIS := GetProc(libgl, 'glMultiTexCoord2fvSGIS');
+  glMultiTexCoord2iSGIS := GetProc(libgl, 'glMultiTexCoord2iSGIS');
+  glMultiTexCoord2ivSGIS := GetProc(libgl, 'glMultiTexCoord2ivSGIS');
+  glMultiTexCoord2sSGIS := GetProc(libgl, 'glMultiTexCoord2sSGIS');
+  glMultiTexCoord2svSGIS := GetProc(libgl, 'glMultiTexCoord2svSGIS');
+  glMultiTexCoord3dSGIS := GetProc(libgl, 'glMultiTexCoord3dSGIS');
+  glMultiTexCoord3dvSGIS := GetProc(libgl, 'glMultiTexCoord3dvSGIS');
+  glMultiTexCoord3fSGIS := GetProc(libgl, 'glMultiTexCoord3fSGIS');
+  glMultiTexCoord3fvSGIS := GetProc(libgl, 'glMultiTexCoord3fvSGIS');
+  glMultiTexCoord3iSGIS := GetProc(libgl, 'glMultiTexCoord3iSGIS');
+  glMultiTexCoord3ivSGIS := GetProc(libgl, 'glMultiTexCoord3ivSGIS');
+  glMultiTexCoord3sSGIS := GetProc(libgl, 'glMultiTexCoord3sSGIS');
+  glMultiTexCoord3svSGIS := GetProc(libgl, 'glMultiTexCoord3svSGIS');
+  glMultiTexCoord4dSGIS := GetProc(libgl, 'glMultiTexCoord4dSGIS');
+  glMultiTexCoord4dvSGIS := GetProc(libgl, 'glMultiTexCoord4dvSGIS');
+  glMultiTexCoord4fSGIS := GetProc(libgl, 'glMultiTexCoord4fSGIS');
+  glMultiTexCoord4fvSGIS := GetProc(libgl, 'glMultiTexCoord4fvSGIS');
+  glMultiTexCoord4iSGIS := GetProc(libgl, 'glMultiTexCoord4iSGIS');
+  glMultiTexCoord4ivSGIS := GetProc(libgl, 'glMultiTexCoord4ivSGIS');
+  glMultiTexCoord4sSGIS := GetProc(libgl, 'glMultiTexCoord4sSGIS');
+  glMultiTexCoord4svSGIS := GetProc(libgl, 'glMultiTexCoord4svSGIS');
+  glMultiTexCoordPointerSGIS := GetProc(libgl, 'glMultiTexCoordPointerSGIS');
+  glSelectTextureSGIS := GetProc(libgl, 'glSelectTextureSGIS');
+  glSelectTextureCoordSetSGIS := GetProc(libgl, 'glSelectTextureCoordSetSGIS');
+// GL_EXT_multitexture
+  glMultiTexCoord1dEXT := GetProc(libgl, 'glMultiTexCoord1dEXT');
+  glMultiTexCoord1dvEXT := GetProc(libgl, 'glMultiTexCoord1dvEXT');
+  glMultiTexCoord1fEXT := GetProc(libgl, 'glMultiTexCoord1fEXT');
+  glMultiTexCoord1fvEXT := GetProc(libgl, 'glMultiTexCoord1fvEXT');
+  glMultiTexCoord1iEXT := GetProc(libgl, 'glMultiTexCoord1iEXT');
+  glMultiTexCoord1ivEXT := GetProc(libgl, 'glMultiTexCoord1ivEXT');
+  glMultiTexCoord1sEXT := GetProc(libgl, 'glMultiTexCoord1sEXT');
+  glMultiTexCoord1svEXT := GetProc(libgl, 'glMultiTexCoord1svEXT');
+  glMultiTexCoord2dEXT := GetProc(libgl, 'glMultiTexCoord2dEXT');
+  glMultiTexCoord2dvEXT := GetProc(libgl, 'glMultiTexCoord2dvEXT');
+  glMultiTexCoord2fEXT := GetProc(libgl, 'glMultiTexCoord2fEXT');
+  glMultiTexCoord2fvEXT := GetProc(libgl, 'glMultiTexCoord2fvEXT');
+  glMultiTexCoord2iEXT := GetProc(libgl, 'glMultiTexCoord2iEXT');
+  glMultiTexCoord2ivEXT := GetProc(libgl, 'glMultiTexCoord2ivEXT');
+  glMultiTexCoord2sEXT := GetProc(libgl, 'glMultiTexCoord2sEXT');
+  glMultiTexCoord2svEXT := GetProc(libgl, 'glMultiTexCoord2svEXT');
+  glMultiTexCoord3dEXT := GetProc(libgl, 'glMultiTexCoord3dEXT');
+  glMultiTexCoord3dvEXT := GetProc(libgl, 'glMultiTexCoord3dvEXT');
+  glMultiTexCoord3fEXT := GetProc(libgl, 'glMultiTexCoord3fEXT');
+  glMultiTexCoord3fvEXT := GetProc(libgl, 'glMultiTexCoord3fvEXT');
+  glMultiTexCoord3iEXT := GetProc(libgl, 'glMultiTexCoord3iEXT');
+  glMultiTexCoord3ivEXT := GetProc(libgl, 'glMultiTexCoord3ivEXT');
+  glMultiTexCoord3sEXT := GetProc(libgl, 'glMultiTexCoord3sEXT');
+  glMultiTexCoord3svEXT := GetProc(libgl, 'glMultiTexCoord3svEXT');
+  glMultiTexCoord4dEXT := GetProc(libgl, 'glMultiTexCoord4dEXT');
+  glMultiTexCoord4dvEXT := GetProc(libgl, 'glMultiTexCoord4dvEXT');
+  glMultiTexCoord4fEXT := GetProc(libgl, 'glMultiTexCoord4fEXT');
+  glMultiTexCoord4fvEXT := GetProc(libgl, 'glMultiTexCoord4fvEXT');
+  glMultiTexCoord4iEXT := GetProc(libgl, 'glMultiTexCoord4iEXT');
+  glMultiTexCoord4ivEXT := GetProc(libgl, 'glMultiTexCoord4ivEXT');
+  glMultiTexCoord4sEXT := GetProc(libgl, 'glMultiTexCoord4sEXT');
+  glMultiTexCoord4svEXT := GetProc(libgl, 'glMultiTexCoord4svEXT');
+  glInterleavedTextureCoordSetsEXT := GetProc(libgl, 'glInterleavedTextureCoordSetsEXT');
+  glSelectTextureEXT := GetProc(libgl, 'glSelectTextureEXT');
+  glSelectTextureCoordSetEXT := GetProc(libgl, 'glSelectTextureCoordSetEXT');
+  glSelectTextureTransformEXT := GetProc(libgl, 'glSelectTextureTransformEXT');
+// GL_EXT_point_parameters
+  glPointParameterfEXT := GetProc(libgl, 'glPointParameterfEXT');
+  glPointParameterfvEXT := GetProc(libgl, 'glPointParameterfvEXT');
+{$endif SGI_EXTENSIONS}
+
+{$ifdef MESA}
+// GL_MESA_window_pos
+  glWindowPos2iMESA := GetProc(libgl, 'glWindowPos2iMESA');
+  glWindowPos2sMESA := GetProc(libgl, 'glWindowPos2sMESA');
+  glWindowPos2fMESA := GetProc(libgl, 'glWindowPos2fMESA');
+  glWindowPos2dMESA := GetProc(libgl, 'glWindowPos2dMESA');
+  glWindowPos2ivMESA := GetProc(libgl, 'glWindowPos2ivMESA');
+  glWindowPos2svMESA := GetProc(libgl, 'glWindowPos2svMESA');
+  glWindowPos2fvMESA := GetProc(libgl, 'glWindowPos2fvMESA');
+  glWindowPos2dvMESA := GetProc(libgl, 'glWindowPos2dvMESA');
+  glWindowPos3iMESA := GetProc(libgl, 'glWindowPos3iMESA');
+  glWindowPos3sMESA := GetProc(libgl, 'glWindowPos3sMESA');
+  glWindowPos3fMESA := GetProc(libgl, 'glWindowPos3fMESA');
+  glWindowPos3dMESA := GetProc(libgl, 'glWindowPos3dMESA');
+  glWindowPos3ivMESA := GetProc(libgl, 'glWindowPos3ivMESA');
+  glWindowPos3svMESA := GetProc(libgl, 'glWindowPos3svMESA');
+  glWindowPos3fvMESA := GetProc(libgl, 'glWindowPos3fvMESA');
+  glWindowPos3dvMESA := GetProc(libgl, 'glWindowPos3dvMESA');
+  glWindowPos4iMESA := GetProc(libgl, 'glWindowPos4iMESA');
+  glWindowPos4sMESA := GetProc(libgl, 'glWindowPos4sMESA');
+  glWindowPos4fMESA := GetProc(libgl, 'glWindowPos4fMESA');
+  glWindowPos4dMESA := GetProc(libgl, 'glWindowPos4dMESA');
+  glWindowPos4ivMESA := GetProc(libgl, 'glWindowPos4ivMESA');
+  glWindowPos4svMESA := GetProc(libgl, 'glWindowPos4svMESA');
+  glWindowPos4fvMESA := GetProc(libgl, 'glWindowPos4fvMESA');
+  glWindowPos4dvMESA := GetProc(libgl, 'glWindowPos4dvMESA');
+// GL_MESA_resize_buffers
+  glResizeBuffersMESA := GetProc(libgl, 'glResizeBuffersMESA');
+{$endif MESA}
+
+  GLInitialized := True;
+  Result := True;
+end;
+
+function InitGL: Boolean;
+begin
+  Result := InitGLFromLibrary('libGL.so') or
+            InitGLFromLibrary('libGL.so.1') or
+            InitGLFromLibrary('libMesaGL.so') or
+            InitGLFromLibrary('libMesaGL.so.3');
+end;
+
+initialization
+  InitGL;
+finalization
+  if Assigned(libGL)  then dlclose(libGL);
+end.
+{
+  $Log$
+  Revision 1.4  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:17  michael
+  + Initial import
+
+  Revision 1.2  2000/05/31 00:34:28  alex
+  made templates work
+
+}
+
+
+{
+  $Log$
+  Revision 1.4  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}

+ 385 - 0
packages/opengl/linux/glu.pp

@@ -0,0 +1,385 @@
+{
+  $Id$
+
+  Translation of the Mesa GLU headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GLU;
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Linux}
+  uses GL;
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+function InitGLUFromLibrary(libname: PChar): Boolean;
+
+
+// determines automatically which libraries to use:
+function InitGLU: Boolean;
+
+
+var
+  GLUDumpUnresolvedFunctions,
+  GLUInitialized: Boolean;
+
+
+// =======================================================
+//   GLU consts, types and functions
+// =======================================================
+
+const
+  GLU_TRUE                              = GL_TRUE;
+  GLU_FALSE                             = GL_FALSE;
+
+  // Normal vectors
+  GLU_SMOOTH                            = 100000;
+  GLU_FLAT                              = 100001;
+  GLU_NONE                              = 100002;
+
+  // Quadric draw styles
+  GLU_POINT                             = 100010;
+  GLU_LINE                              = 100011;
+  GLU_FILL                              = 100012;
+  GLU_SILHOUETTE                        = 100013;
+
+  // Quadric orientation
+  GLU_OUTSIDE                           = 100020;
+  GLU_INSIDE                            = 100021;
+
+  // Tesselator
+  GLU_BEGIN                             = 100100;
+  GLU_VERTEX                            = 100101;
+  GLU_END                               = 100102;
+  GLU_ERROR                             = 100103;
+  GLU_EDGE_FLAG                         = 100104;
+
+  // Contour types
+  GLU_CW                                = 100120;
+  GLU_CCW                               = 100121;
+  GLU_INTERIOR                          = 100122;
+  GLU_EXTERIOR                          = 100123;
+  GLU_UNKNOWN                           = 100124;
+
+  // Tesselation errors
+  GLU_TESS_ERROR1                       = 100151;  // missing gluEndPolygon
+  GLU_TESS_ERROR2                       = 100152;  // missing gluBeginPolygon
+  GLU_TESS_ERROR3                       = 100153;  // misoriented contour
+  GLU_TESS_ERROR4                       = 100154;  // vertex/edge intersection
+  GLU_TESS_ERROR5                       = 100155;  // misoriented or self-intersecting loops
+  GLU_TESS_ERROR6                       = 100156;  // coincident vertices
+  GLU_TESS_ERROR7                       = 100157;  // all vertices collinear
+  GLU_TESS_ERROR8                       = 100158;  // intersecting edges
+  GLU_TESS_ERROR9                       = 100159;  // not coplanar contours
+
+  // NURBS
+  GLU_AUTO_LOAD_MATRIX                  = 100200;
+  GLU_CULLING                           = 100201;
+  GLU_PARAMETRIC_TOLERANCE              = 100202;
+  GLU_SAMPLING_TOLERANCE                = 100203;
+  GLU_DISPLAY_MODE                      = 100204;
+  GLU_SAMPLING_METHOD                   = 100205;
+  GLU_U_STEP                            = 100206;
+  GLU_V_STEP                            = 100207;
+
+  GLU_PATH_LENGTH                       = 100215;
+  GLU_PARAMETRIC_ERROR                  = 100216;
+  GLU_DOMAIN_DISTANCE                   = 100217;
+
+  GLU_MAP1_TRIM_2                       = 100210;
+  GLU_MAP1_TRIM_3                       = 100211;
+
+  GLU_OUTLINE_POLYGON                   = 100240;
+  GLU_OUTLINE_PATCH                     = 100241;
+
+  GLU_NURBS_ERROR1                      = 100251;   // spline order un-supported
+  GLU_NURBS_ERROR2                      = 100252;   // too few knots
+  GLU_NURBS_ERROR3                      = 100253;   // valid knot range is empty
+  GLU_NURBS_ERROR4                      = 100254;   // decreasing knot sequence
+  GLU_NURBS_ERROR5                      = 100255;   // knot multiplicity > spline order
+  GLU_NURBS_ERROR6                      = 100256;   // endcurve() must follow bgncurve()
+  GLU_NURBS_ERROR7                      = 100257;   // bgncurve() must precede endcurve()
+  GLU_NURBS_ERROR8                      = 100258;   // ctrlarray or knot vector is NULL
+  GLU_NURBS_ERROR9                      = 100259;   // cannot draw pwlcurves
+  GLU_NURBS_ERROR10                     = 100260;   // missing gluNurbsCurve()
+  GLU_NURBS_ERROR11                     = 100261;   // missing gluNurbsSurface()
+  GLU_NURBS_ERROR12                     = 100262;   // endtrim() must precede endsurface()
+  GLU_NURBS_ERROR13                     = 100263;   // bgnsurface() must precede endsurface()
+  GLU_NURBS_ERROR14                     = 100264;   // curve of improper type passed as trim curve
+  GLU_NURBS_ERROR15                     = 100265;   // bgnsurface() must precede bgntrim()
+  GLU_NURBS_ERROR16                     = 100266;   // endtrim() must follow bgntrim()
+  GLU_NURBS_ERROR17                     = 100267;   // bgntrim() must precede endtrim()*/
+  GLU_NURBS_ERROR18                     = 100268;   // invalid or missing trim curve*/
+  GLU_NURBS_ERROR19                     = 100269;   // bgntrim() must precede pwlcurve()
+  GLU_NURBS_ERROR20                     = 100270;   // pwlcurve referenced twice*/
+  GLU_NURBS_ERROR21                     = 100271;   // pwlcurve and nurbscurve mixed
+  GLU_NURBS_ERROR22                     = 100272;   // improper usage of trim data type
+  GLU_NURBS_ERROR23                     = 100273;   // nurbscurve referenced twice
+  GLU_NURBS_ERROR24                     = 100274;   // nurbscurve and pwlcurve mixed
+  GLU_NURBS_ERROR25                     = 100275;   // nurbssurface referenced twice
+  GLU_NURBS_ERROR26                     = 100276;   // invalid property
+  GLU_NURBS_ERROR27                     = 100277;   // endsurface() must follow bgnsurface()
+  GLU_NURBS_ERROR28                     = 100278;   // intersecting or misoriented trim curves
+  GLU_NURBS_ERROR29                     = 100279;   // intersecting trim curves
+  GLU_NURBS_ERROR30                     = 100280;   // UNUSED
+  GLU_NURBS_ERROR31                     = 100281;   // unconnected trim curves
+  GLU_NURBS_ERROR32                     = 100282;   // unknown knot error
+  GLU_NURBS_ERROR33                     = 100283;   // negative vertex count encountered
+  GLU_NURBS_ERROR34                     = 100284;   // negative byte-stride
+  GLU_NURBS_ERROR35                     = 100285;   // unknown type descriptor
+  GLU_NURBS_ERROR36                     = 100286;   // null control point reference
+  GLU_NURBS_ERROR37                     = 100287;   // duplicate point on pwlcurve
+
+  // Errors
+  GLU_INVALID_ENUM                      = 100900;
+  GLU_INVALID_VALUE                     = 100901;
+  GLU_OUT_OF_MEMORY                     = 100902;
+  GLU_INCOMPATIBLE_GL_VERSION           = 100903;
+
+  // New in GLU 1.1
+  GLU_VERSION                           = 100800;
+  GLU_EXTENSIONS                        = 100801;
+
+type
+  PGLUquadricObj = ^TGLUquadricObj;
+  TGLUquadricObj = record end;
+  PGLUtriangulatorObj = ^TGLUtriangulatorObj;
+  TGLUtriangulatorObj = record end;
+  PGLUnurbsObj = ^TGLUnurbsObj;
+  TGLUnurbsObj = record end;
+
+  TGLUQuadricCallback = procedure; cdecl;
+  TGLUNurbsCallback = procedure; cdecl;
+  TGLUTessCallback = procedure; cdecl;
+
+  TGLUViewport = array[0..3] of LongInt;
+  TGLUMatrixd = array[0..15] of Double;
+  TGLUMatrixf = array[0..15] of Single;
+  TGLUVectord = array[0..2] of Double;
+
+
+var
+  // Miscellaneous functions
+  gluLookAt: procedure(eye, eyey, eyez, centerx, centery, centerz, upx, upy, upz: Double); cdecl;
+  gluOrtho2D: procedure(left, right, bottom, top: Double); cdecl;
+  gluPerspective: procedure(fovy, aspect, zNear, zFar: Double); cdecl;
+  gluPickMatrix: procedure(x, y, width, height: Double; const viewport: TGLUViewport); cdecl;
+  gluProject: procedure(objx, objy, objz: Double; const modelMatrix, projMatrix: TGLUMatrixd; const viewport: TGLUViewport; winx, winy, winz: Double); cdecl;
+  gluUnProject: procedure(winx, winy, winz: Double; const modelMatrix, projMatrix: TGLUMatrixd; const viewport: TGLUViewport; objx, objy, objz: Double); cdecl;
+  gluErrorString: procedure(errorCode: GLenum); cdecl;
+
+  // Mipmapping and image scaling
+  gluScaleImage: procedure(format: GLenum; within, heightin: LongInt; typein: GLenum; var datain; widthout, heightout: LongInt; typeout: GLenum; var dataout); cdecl;
+  gluBuild1DMipmaps: procedure(target: GLenum; components, width: LongInt; format, AType: GLEnum; var data); cdecl;
+  gluBuild2DMipmaps: procedure(target: GLenum; components, width, height: LongInt; format, AType: GLEnum; var data); cdecl;
+
+  // Quadrics
+  gluNewQuadric: function: PGLUquadricObj; cdecl;
+  gluDeleteQuadric: procedure(state: PGLUquadricObj); cdecl;
+  gluQuadricDrawStyle: procedure(quadObject: PGLUquadricObj; drawStyle: GLenum); cdecl;
+  gluQuadricOrientation: procedure(quadObject: PGLUquadricObj; orientation: GLenum); cdecl;
+  gluQuadricNormals: procedure(quadObject: PGLUquadricObj; normals: GLenum); cdecl;
+  gluQuadricTexture: procedure(quadObject: PGLUquadricObj; textureCoords: Boolean); cdecl;
+  gluQuadricCallback: procedure(quadObject: PGLUquadricObj; which: GLenum; fn: TGLUQuadricCallback); cdecl;
+  gluCylinder: procedure(qobj: PGLUquadricObj; baseRadius, topRadius, height: Double; slices, stacks: LongInt); cdecl;
+  gluSphere: procedure(qobj: PGLUquadricObj; radius: Double; slices, stacks: LongInt); cdecl;
+  gluDisk: procedure(qobj: PGLUquadricObj; innerRadius, outerRadius: Double; slices, loops: LongInt); cdecl;
+  gluPartialDisk: procedure(qobj: PGLUquadricObj; innerRadius, outerRadius: Double; slices, loops: LongInt; startAngle, sweepAngle: Double); cdecl;
+
+  // Nurbs
+  gluNewNurbsRenderer: function: PGLUnurbsObj; cdecl;
+  gluDeleteNurbsRenderer: procedure(nobj: PGLUnurbsObj); cdecl;
+  gluLoadSamplingMatrices: procedure(nobj: PGLUnurbsObj; const modelMatrix, projMatrix: TGLUMatrixf; const viewport: TGLUViewport); cdecl;
+  gluNurbsProperty: procedure(nobj: PGLUnurbsObj; AProperty: GLenum; value: Single); cdecl;
+  gluGetNurbsProperty: procedure(nobj: PGLUnurbsObj; AProperty: GLEnum; var value: Single); cdecl;
+  gluBeginCurve: procedure(nobj: PGLUnurbsObj); cdecl;
+  gluEndCurve: procedure(nobj: PGLUnurbsObj); cdecl;
+  gluNurbsCurve: procedure(nobj: PGLUnurbsObj; nknots: LongInt; var know: Single; stride: LongInt; var ctlarray: Single; order: LongInt; AType: GLenum); cdecl;
+  gluBeginSurface: procedure(nobj: PGLUnurbsObj); cdecl;
+  gluEndSurface: procedure(nobj: PGLUnurbsObj); cdecl;
+  gluNurbsSurface: procedure(nobj: PGLUnurbsObj; sknot_count: LongInt; var sknot: Single; tknot_count: LongInt; var tknot: Single; s_stride, t_stride: LongInt; var ctlarray: Single; sorder, torder: LongInt; AType: GLenum); cdecl;
+  gluBeginTrim: procedure(nobj: PGLUnurbsObj); cdecl;
+  gluEndTrim: procedure(nobj: PGLUnurbsObj); cdecl;
+  gluPwlCurve: procedure(nobj: PGLUnurbsObj; count: LongInt; var AArray: Single; stride: LongInt; AType: GLenum); cdecl;
+  gluNurbsCallback: procedure(nobj: PGLUnurbsObj; which: GLenum; fn: TGLUNurbsCallback); cdecl;
+
+  // Polygon tesselation
+  gluNewTess: function: PGLUtriangulatorObj; cdecl;
+  gluTessCallback: procedure(tobj: PGLUtriangulatorObj; which: GLenum; fn: TGLUTessCallback); cdecl;
+
+  gluDeleteTess: procedure(tobj: PGLUtriangulatorObj); cdecl;
+  gluBeginPolygon: procedure(tobj: PGLUtriangulatorObj); cdecl;
+  gluEndPolygon: procedure(tobj: PGLUtriangulatorObj); cdecl;
+  gluNextContour: procedure(tobj: PGLUtriangulatorObj; AType: GLenum); cdecl;
+  gluTessVertex: procedure(tobj: PGLUtriangulatorObj; v: TGLUVectord; var data); cdecl;
+
+  // New functions in GLU 1.1
+  gluGetString: function(name: GLenum): PChar; cdecl;
+
+
+// =======================================================
+//
+// =======================================================
+
+implementation
+
+{$LINKLIB m}
+
+function dlopen(AFile: PChar; mode: LongInt): Pointer; external 'dl';
+function dlclose(handle: Pointer): LongInt; external 'dl';
+function dlsym(handle: Pointer; name: PChar): Pointer; external 'dl';
+
+function LoadLibrary(name: PChar): Pointer;
+begin
+  Result := dlopen(name, $101 {RTLD_GLOBAL or RTLD_LAZY});
+end;
+
+function GetProc(handle: Pointer; name: PChar): Pointer;
+begin
+  Result := dlsym(handle, name);
+  if (Result = nil) and GLUDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+var
+  libGLU : Pointer;
+
+function InitGLUFromLibrary(libname: PChar): Boolean;
+begin
+  Result := False;
+  libGLU := LoadLibrary(libname);
+  if not Assigned(libGLU) then exit;
+
+  // Miscellaneous functions
+  gluLookAt := GetProc(libglu, 'gluLookAt');
+  gluOrtho2D := GetProc(libglu, 'gluOrtho2D');
+  gluPerspective := GetProc(libglu, 'gluPerspective');
+  gluPickMatrix := GetProc(libglu, 'gluPickMatrix');
+  gluProject := GetProc(libglu, 'gluProject');
+  gluUnProject := GetProc(libglu, 'gluUnProject');
+  gluErrorString := GetProc(libglu, 'gluErrorString');
+  // Mipmapping and image scaling
+  gluScaleImage := GetProc(libglu, 'gluScaleImage');
+  gluBuild1DMipmaps := GetProc(libglu, 'gluBuild1DMipmaps');
+  gluBuild2DMipmaps := GetProc(libglu, 'gluBuild2DMipmaps');
+  // Quadrics
+  gluNewQuadric := GetProc(libglu, 'gluNewQuadric');
+  gluDeleteQuadric := GetProc(libglu, 'gluDeleteQuadric');
+  gluQuadricDrawStyle := GetProc(libglu, 'gluQuadricDrawStyle');
+  gluQuadricOrientation := GetProc(libglu, 'gluQuadricOrientation');
+  gluQuadricNormals := GetProc(libglu, 'gluQuadricNormals');
+  gluQuadricTexture := GetProc(libglu, 'gluQuadricTexture');
+  gluQuadricCallback := GetProc(libglu, 'gluQuadricCallback');
+  gluCylinder := GetProc(libglu, 'gluCylinder');
+  gluSphere := GetProc(libglu, 'gluSphere');
+  gluDisk := GetProc(libglu, 'gluDisk');
+  gluPartialDisk := GetProc(libglu, 'gluPartialDisk');
+  // Nurbs
+  gluNewNurbsRenderer := GetProc(libglu, 'gluNewNurbsRenderer');
+  gluDeleteNurbsRenderer := GetProc(libglu, 'gluDeleteNurbsRenderer');
+  gluLoadSamplingMatrices := GetProc(libglu, 'gluLoadSamplingMatrices');
+  gluNurbsProperty := GetProc(libglu, 'gluNurbsProperty');
+  gluGetNurbsProperty := GetProc(libglu, 'gluGetNurbsProperty');
+  gluBeginCurve := GetProc(libglu, 'gluBeginCurve');
+  gluEndCurve := GetProc(libglu, 'gluEndCurve');
+  gluNurbsCurve := GetProc(libglu, 'gluNurbsCurve');
+  gluBeginSurface := GetProc(libglu, 'gluBeginSurface');
+  gluEndSurface := GetProc(libglu, 'gluEndSurface');
+  gluNurbsSurface := GetProc(libglu, 'gluNurbsSurface');
+  gluBeginTrim := GetProc(libglu, 'gluBeginTrim');
+  gluEndTrim := GetProc(libglu, 'gluEndTrim');
+  gluPwlCurve := GetProc(libglu, 'gluPwlCurve');
+  gluNurbsCallback := GetProc(libglu, 'gluNurbsCallback');
+  // Polygon tesselation
+  gluNewTess := GetProc(libglu, 'gluNewTess');
+  gluTessCallback := GetProc(libglu, 'gluTessCallback');
+  gluDeleteTess := GetProc(libglu, 'gluDeleteTess');
+  gluBeginPolygon := GetProc(libglu, 'gluBeginPolygon');
+  gluEndPolygon := GetProc(libglu, 'gluEndPolygon');
+  gluNextContour := GetProc(libglu, 'gluNextContour');
+  gluTessVertex := GetProc(libglu, 'gluTessVertex');
+  // New functions in GLU 1.1
+  gluGetString := GetProc(libglu, 'gluGetString');
+
+  GLUInitialized := True;
+  Result := True;
+end;
+
+
+function InitGLU: Boolean;
+begin
+  Result := InitGLUFromLibrary('libGLU.so') or
+            InitGLUFromLibrary('libGLU.so.1') or
+            InitGLUFromLibrary('libMesaGLU.so') or
+            InitGLUFromLibrary('libMesaGLU.so.3');
+end;
+
+
+initialization
+  InitGlU;
+finalization
+  if Assigned(libGLU) then dlclose(libGLU);
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:18  michael
+  + Initial import
+
+  Revision 1.1  2000/05/31 00:35:14  alex
+  added working templates
+
+}
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}

+ 458 - 0
packages/opengl/linux/glut.pp

@@ -0,0 +1,458 @@
+{
+  $Id$
+
+  Translation of the Mesa GLUT headers for FreePascal
+  Linux Version, Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}
+
+unit GLUT;
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Linux}
+  {$DEFINE gldecl := cdecl;}
+  {$DEFINE extdecl := cdecl;}
+  uses GL;
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+function InitGLUTFromLibrary(libname: PChar): Boolean;
+
+// determines automatically which library to use:
+function InitGLUT: Boolean;
+
+
+var
+  GLUTDumpUnresolvedFunctions,
+  GLUTInitialized: Boolean;
+
+
+const
+  // Display mode bit masks
+  GLUT_RGB                      = 0;
+  GLUT_RGBA                     = GLUT_RGB;
+  GLUT_INDEX                    = 1;
+  GLUT_SINGLE                   = 0;
+  GLUT_DOUBLE                   = 2;
+  GLUT_ACCUM                    = 4;
+  GLUT_ALPHA                    = 8;
+  GLUT_DEPTH                    = 16;
+  GLUT_STENCIL                  = 32;
+  GLUT_MULTISAMPLE              = 128;
+  GLUT_STEREO                   = 256;
+  GLUT_LUMINANCE                = 512;
+
+  // Mouse buttons
+  GLUT_LEFT_BUTTON              = 0;
+  GLUT_MIDDLE_BUTTON            = 1;
+  GLUT_RIGHT_BUTTON             = 2;
+
+  // Mouse button state
+  GLUT_DOWN                     = 0;
+  GLUT_UP                       = 1;
+
+  // Keys ###
+
+  // Enter / exit state
+  GLUT_LEFT                     = 0;
+  GLUT_ENTERED                  = 1;
+
+  // Menu usage state
+  GLUT_MENU_NOT_IN_USE          = 0;
+  GLUT_MENU_IN_USE              = 1;
+
+  // Visibility state
+  GLUT_NOT_VISIBLE              = 0;
+  GLUT_VISIBLE                  = 1;
+
+  // Window status state
+  GLUT_HIDDEN                   = 0;
+  GLUT_FULLY_RETAINED           = 1;
+  GLUT_PARTIALLY_RETAINED       = 2;
+  GLUT_FULLY_COVERED            = 3;
+
+  // Color index component selection values
+  GLUT_RED                      = 0;
+  GLUT_GREEN                    = 1;
+  GLUT_BLUE                     = 2;
+
+  // Layers for use
+  GLUT_NORMAL                   = 0;
+  GLUT_OVERLAY                  = 1;
+
+  // Bitmap stuff###
+
+
+  // glutGet parameters
+  GLUT_WINDOW_X                 = 100;
+  GLUT_WINDOW_Y                 = 101;
+  GLUT_WINDOW_WIDTH             = 102;
+  GLUT_WINDOW_HEIGHT            = 103;
+  GLUT_WINDOW_BUFFER_SIZE       = 104;
+  GLUT_WINDOW_STENCIL_SIZE      = 105;
+  GLUT_WINDOW_DEPTH_SIZE        = 106;
+  GLUT_WINDOW_RED_SIZE          = 107;
+  GLUT_WINDOW_GREEN_SIZE        = 108;
+  GLUT_WINDOW_BLUE_SIZE         = 109;
+  GLUT_WINDOW_ALPHA_SIZE        = 110;
+  GLUT_WINDOW_ACCUM_RED_SIZE    = 111;
+  GLUT_WINDOW_ACCUM_GREEN_SIZE  = 112;
+  GLUT_WINDOW_ACCUM_BLUE_SIZE   = 113;
+  GLUT_WINDOW_ACCUM_ALPHA_SIZE  = 114;
+  GLUT_WINDOW_DOUBLEBUFFER      = 115;
+  GLUT_WINDOW_RGBA              = 116;
+  GLUT_WINDOW_PARENT            = 117;
+  GLUT_WINDOW_NUM_CHILDREN      = 118;
+  GLUT_WINDOW_COLORMAP_SIZE     = 119;
+  GLUT_WINDOW_NUM_SAMPLES       = 120;
+  GLUT_WINDOW_STEREO            = 121;
+  GLUT_WINDOW_CURSOR            = 122;
+  GLUT_SCREEN_WIDTH             = 200;
+  GLUT_SCREEN_HEIGHT            = 201;
+  GLUT_SCREEN_WIDTH_MM          = 202;
+  GLUT_SCREEN_HEIGHT_MM         = 203;
+  GLUT_MENU_NUM_ITEMS           = 300;
+  GLUT_DISPLAY_MODE_POSSIBLE    = 400;
+  GLUT_INIT_WINDOW_X            = 500;
+  GLUT_INIT_WINDOW_Y            = 501;
+  GLUT_INIT_WINDOW_WIDTH        = 502;
+  GLUT_INIT_WINDOW_HEIGHT       = 503;
+  GLUT_INIT_DISPLAY_MODE        = 504;
+  GLUT_ELAPSED_TIME             = 700;
+  GLUT_WINDOW_FORMAT_ID         = 123;
+
+  // glutDeviceGet parameters
+  GLUT_HAS_KEYBOARD             = 600;
+  GLUT_HAS_MOUSE                = 601;
+  GLUT_HAS_SPACEBALL            = 602;
+  GLUT_HAS_DIAL_AND_BUTTON_BOX  = 603;
+  GLUT_HAS_TABLET               = 604;
+  GLUT_NUM_MOUSE_BUTTONS        = 605;
+  GLUT_NUM_SPACEBALL_BUTTONS    = 606;
+  GLUT_NUM_BUTTON_BOX_BUTTONS   = 607;
+  GLUT_NUM_DIALS                = 608;
+  GLUT_NUM_TABLET_BUTTONS       = 609;
+  GLUT_DEVICE_IGNORE_KEY_REPEAT = 610;
+  GLUT_DEVICE_KEY_REPEAT        = 611;
+  GLUT_HAS_JOYSTICK             = 612;
+  GLUT_OWNS_JOYSTICK            = 613;
+  GLUT_JOYSTICK_BUTTONS         = 614;
+  GLUT_JOYSTICK_AXES            = 615;
+  GLUT_JOYSTICK_POLL_RATE       = 616;
+
+  // glutLayerGet parameters
+  GLUT_OVERLAY_POSSIBLE         = 800;
+  GLUT_LAYER_IN_USE             = 801;
+  GLUT_HAS_OVERLAY              = 802;
+  GLUT_TRANSPARENT_INDEX        = 803;
+  GLUT_NORMAL_DAMAGED           = 804;
+  GLUT_OVERLAY_DAMAGED          = 805;
+
+  // glutVideoResizeGet parameters
+  GLUT_VIDEO_RESIZE_POSSIBLE    = 900;
+  GLUT_VIDEO_RESIZE_IN_USE      = 901;
+  GLUT_VIDEO_RESIZE_X_DELTA     = 902;
+  GLUT_VIDEO_RESIZE_Y_DELTA     = 903;
+  GLUT_VIDEO_RESIZE_WIDTH_DELTA = 904;
+  GLUT_VIDEO_RESIZE_HEIGHT_DELTA= 905;
+  GLUT_VIDEO_RESIZE_X           = 906;
+  GLUT_VIDEO_RESIZE_Y           = 907;
+  GLUT_VIDEO_RESIZE_WIDTH       = 908;
+  GLUT_VIDEO_RESIZE_HEIGHT      = 909;
+
+  // glutGetModifiers return mask
+  GLUT_ACTIVE_SHIFT             = 1;
+  GLUT_ACTIVE_CTRL              = 2;
+  GLUT_ACTIVE_ALT               = 4;
+
+  // Cursor stuff ###
+
+// GLUT window callback sub-API
+type
+  TGlutDisplayFunc = procedure; extdecl
+  TGlutReshapeFunc = procedure(width, height: Integer); extdecl
+  TGlutTimerFunc = procedure(value: Integer); extdecl
+  TGlutKeyboardFunc = procedure(key: char;x,y:Integer); extdecl
+  TGlutIdleFunc = procedure; extdecl
+
+// GLUT game mode sub-API
+{$ifdef GLUT_GAME}
+// glutGameModeGet
+const
+  GLUT_GAME_MODE_ACTIVE         = 0;
+  GLUT_GAME_MODE_POSSIBLE       = 1;
+  GLUT_GAME_MODE_WIDTH          = 2;
+  GLUT_GAME_MODE_HEIGHT         = 3;
+  GLUT_GAME_MODE_PIXEL_DEPTH    = 4;
+  GLUT_GAME_MODE_REFRESH_RATE   = 5;
+  GLUT_GAME_MODE_DISPLAY_CHANGED= 6;
+{$endif GLUT_GAME}
+
+var
+// GLUT initialization sub-API
+  glutInit: procedure(var argcp: Integer; var argv: PChar); cdecl;
+  glutInitDisplayMode: procedure(mode: LongWord); cdecl;
+  glutInitDisplayString: procedure(AString: PChar); cdecl;
+  glutInitWindowPosition: procedure(x, y: Integer); cdecl;
+  glutInitWindowSize: procedure(width, height: Integer); cdecl;
+  glutMainLoop: procedure; cdecl;
+
+// GLUT window sub-API
+  glutCreateWindow: function(title: PChar): Integer; cdecl;
+  glutCreateSubWindow: function(win, x, y, width, height: Integer): Integer; cdecl;
+  glutDestroyWindow: procedure(win: Integer); cdecl;
+  glutPostRedisplay: procedure; cdecl;
+  glutPostWindowRedisplay: procedure(win: Integer); cdecl;
+  glutSwapBuffers: procedure; cdecl;
+  glutGetWindow: function: Integer; cdecl;
+  glutSetWindow: procedure(win: Integer); cdecl;
+  glutSetWindowTitle: procedure(title: PChar); cdecl;
+  glutSetIconTitle: procedure(title: PChar); cdecl;
+  glutPositionWindow: procedure(x, y: Integer); cdecl;
+  glutReshapeWindow: procedure(width, height: Integer); cdecl;
+  glutPopWindow: procedure; cdecl;
+  glutPushWindow: procedure; cdecl;
+  glutIconifyWindow: procedure; cdecl;
+  glutShowWindow: procedure; cdecl;
+  glutHideWindow: procedure; cdecl;
+  glutFullScreen: procedure; cdecl;
+  glutSetCursor: procedure(cursor: Integer); cdecl;
+  glutWarpPointer: procedure(x, y: Integer); cdecl;
+
+//overlays ###
+
+//menus ###
+
+// GLUT window callback sub-API
+  glutDisplayFunc: procedure(func: TGlutDisplayFunc); cdecl;
+  glutReshapeFunc: procedure(func: TGlutReshapeFunc); cdecl;
+
+  glutTimerFunc: procedure(millis: LongWord; func: TGlutTimerFunc; value: longint); cdecl;
+  glutKeyboardFunc : procedure(func: TGlutKeyboardFunc); cdecl;
+  glutIdleFunc : procedure(func: TGlutIdleFunc); cdecl;
+
+
+// GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK * func)(int width, int height));
+// GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK * func)(unsigned char key, int x, int y));
+// GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK * func)(int button, int state, int x, int y));
+// GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK * func)(int value), int value);
+// GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutSpecialFunc(void (GLUTCALLBACK * func)(int key, int x, int y));
+// GLUTAPI void APIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK * func)(int x, int y, int z));
+// GLUTAPI void APIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK * func)(int x, int y, int z));
+// GLUTAPI void APIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK * func)(int button, int state));
+// GLUTAPI void APIENTRY glutButtonBoxFunc(void (GLUTCALLBACK * func)(int button, int state));
+// GLUTAPI void APIENTRY glutDialsFunc(void (GLUTCALLBACK * func)(int dial, int value));
+// GLUTAPI void APIENTRY glutTabletMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutTabletButtonFunc(void (GLUTCALLBACK * func)(int button, int state, int x, int y));
+// GLUTAPI void APIENTRY glutMenuStatusFunc(void (GLUTCALLBACK * func)(int status, int x, int y));
+// GLUTAPI void APIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutWindowStatusFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK * func)(unsigned char key, int x, int y));
+// GLUTAPI void APIENTRY glutSpecialUpFunc(void (GLUTCALLBACK * func)(int key, int x, int y));
+// GLUTAPI void APIENTRY glutJoystickFunc(void (GLUTCALLBACK * func)(unsigned int buttonMask, int x, int y, int z), int pollInterval)
+
+// GLUT color index sub-API
+  glutSetColor: procedure(index: Integer; red, green, blue: Single); cdecl;
+  glutGetColor: function(ndx, component: Integer): Single; cdecl;
+  glutCopyColormap: procedure(win: Integer); cdecl;
+
+// GLUT state retrieval sub-API
+  glutGet: function(AType: GLEnum): Integer; cdecl;
+  glutDeviceGet: function(AType: GLEnum): Integer; cdecl;
+  glutExtensionSupported: function(name: PChar): Integer; cdecl;
+  glutGetModifiers: function: Integer; cdecl;
+  glutLayerGet: function(AType: GLEnum): Integer; cdecl;
+
+// fonts ###
+
+// pre-built models ###
+
+// video resize ###
+
+// debugging ###
+
+// device control ###
+
+
+// GLUT game mode sub-API
+{$ifdef GLUT_GAME}
+  glutGameModeString: procedure(AString: PChar); cdecl;
+  glutEnterGameMode: function: Integer; cdecl;
+  glutLeaveGameMode: procedure; cdecl;
+  glutGameModeGet: function(mode: GLEnum): Integer; cdecl;
+{$endif GLUT_GAME}
+
+
+implementation
+
+{$LINKLIB Xmu}
+
+function dlopen(AFile: PChar; mode: LongInt): Pointer; external 'dl';
+function dlclose(handle: Pointer): LongInt; external 'dl';
+function dlsym(handle: Pointer; name: PChar): Pointer; external 'dl';
+
+function LoadLibrary(name: PChar): Pointer;
+begin
+  Result := dlopen(name, $101 {RTLD_GLOBAL or RTLD_LAZY});
+end;
+
+function GetProc(handle: Pointer; name: PChar): Pointer;
+begin
+  Result := dlsym(handle, name);
+  if (Result = nil) and GLUTDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+var
+  libGLUT: Pointer;
+
+function InitGLUTFromLibrary(libname: PChar): Boolean;
+begin
+  Result := False;
+  libGLUT := LoadLibrary(libname);
+  if not Assigned(libGLUT) then exit;
+
+// GLUT initialization sub-API
+  glutInit := GetProc(libglut, 'glutInit');
+  glutInitDisplayMode := GetProc(libglut, 'glutInitDisplayMode');
+  glutInitDisplayString := GetProc(libglut, 'glutInitDisplayString');
+  glutInitWindowPosition := GetProc(libglut, 'glutInitWindowPosition');
+  glutInitWindowSize := GetProc(libglut, 'glutInitWindowSize');
+  glutMainLoop := GetProc(libglut, 'glutMainLoop');
+// GLUT window sub-API
+  glutCreateWindow := GetProc(libglut, 'glutCreateWindow');
+  glutCreateSubWindow := GetProc(libglut, 'glutCreateSubWindow');
+  glutDestroyWindow := GetProc(libglut, 'glutDestroyWindow');
+  glutPostRedisplay := GetProc(libglut, 'glutPostRedisplay');
+  glutPostWindowRedisplay := GetProc(libglut, 'glutPostWindowRedisplay');
+  glutSwapBuffers := GetProc(libglut, 'glutSwapBuffers');
+  glutGetWindow := GetProc(libglut, 'glutGetWindow');
+  glutSetWindow := GetProc(libglut, 'glutSetWindow');
+  glutSetWindowTitle := GetProc(libglut, 'glutSetWindowTitle');
+  glutSetIconTitle := GetProc(libglut, 'glutSetIconTitle');
+  glutPositionWindow := GetProc(libglut, 'glutPositionWindow');
+  glutReshapeWindow := GetProc(libglut, 'glutReshapeWindow');
+  glutPopWindow := GetProc(libglut, 'glutPopWindow');
+  glutPushWindow := GetProc(libglut, 'glutPushWindow');
+  glutIconifyWindow := GetProc(libglut, 'glutIconifyWindow');
+  glutShowWindow := GetProc(libglut, 'glutShowWindow');
+  glutHideWindow := GetProc(libglut, 'glutHideWindow');
+  glutFullScreen := GetProc(libglut, 'glutFullScreen');
+  glutSetCursor := GetProc(libglut, 'glutSetCursor');
+  glutWarpPointer := GetProc(libglut, 'glutWarpPointer');
+//overlays ###
+//menus ###
+// GLUT window callback sub-API
+  glutDisplayFunc := GetProc(libglut, 'glutDisplayFunc');
+  glutReshapeFunc := GetProc(libglut, 'glutReshapeFunc');
+  glutTimerFunc := GetProc(libglut, 'glutTimerFunc');
+  glutKeyboardFunc := GetProc(libglut, 'glutKeyboardFunc');
+  glutIdleFunc := GetProc(libglut, 'glutIdleFunc');
+// GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK * func)(int width, int height));
+// GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK * func)(unsigned char key, int x, int y));
+// GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK * func)(int button, int state, int x, int y));
+// GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK * func)(int value), int value);
+// GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutSpecialFunc(void (GLUTCALLBACK * func)(int key, int x, int y));
+// GLUTAPI void APIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK * func)(int x, int y, int z));
+// GLUTAPI void APIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK * func)(int x, int y, int z));
+// GLUTAPI void APIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK * func)(int button, int state));
+// GLUTAPI void APIENTRY glutButtonBoxFunc(void (GLUTCALLBACK * func)(int button, int state));
+// GLUTAPI void APIENTRY glutDialsFunc(void (GLUTCALLBACK * func)(int dial, int value));
+// GLUTAPI void APIENTRY glutTabletMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutTabletButtonFunc(void (GLUTCALLBACK * func)(int button, int state, int x, int y));
+// GLUTAPI void APIENTRY glutMenuStatusFunc(void (GLUTCALLBACK * func)(int status, int x, int y));
+// GLUTAPI void APIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutWindowStatusFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK * func)(unsigned char key, int x, int y));
+// GLUTAPI void APIENTRY glutSpecialUpFunc(void (GLUTCALLBACK * func)(int key, int x, int y));
+// GLUTAPI void APIENTRY glutJoystickFunc(void (GLUTCALLBACK * func)(unsigned int buttonMask, int x, int y, int z), int pollInterval)
+// GLUT color index sub-API
+  glutSetColor := GetProc(libglut, 'glutSetColor');
+  glutGetColor := GetProc(libglut, 'glutGetColor');
+  glutCopyColormap := GetProc(libglut, 'glutCopyColormap');
+// GLUT state retrieval sub-API
+  glutGet := GetProc(libglut, 'glutGet');
+  glutDeviceGet := GetProc(libglut, 'glutDeviceGet');
+  glutExtensionSupported := GetProc(libglut, 'glutExtensionSupported');
+  glutGetModifiers := GetProc(libglut, 'glutGetModifiers');
+  glutLayerGet := GetProc(libglut, 'glutLayerGet');
+// fonts ###
+// pre-built models ###
+// video resize ###
+// debugging ###
+// device control ###
+// GLUT game mode sub-API
+{$ifdef GLUT_GAME}
+  glutGameModeString := GetProc(libglut, 'glutGameModeString');
+  glutEnterGameMode := GetProc(libglut, 'glutEnterGameMode');
+  glutLeaveGameMode := GetProc(libglut, 'glutLeaveGameMode');
+  glutGameModeGet := GetProc(libglut, 'glutGameModeGet');
+{$endif GLUT_GAME}
+
+  GLUTInitialized := True;
+  Result := True;
+end;
+
+
+function InitGLUT: Boolean;
+begin
+  Result := InitGLUTFromLibrary('libglut.so') or
+            InitGLUTFromLibrary('libglut.so.3');
+end;
+
+
+initialization
+  InitGLUT;
+finalization
+  if Assigned(libGLUT) then dlClose(libGLUT);
+end.
+
+
+{
+  $Log$
+  Revision 1.4  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}

+ 272 - 0
packages/opengl/linux/glx.pp

@@ -0,0 +1,272 @@
+{
+  $Id$
+
+  Translation of the Mesa GLX headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GLX;
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Linux}
+  uses
+    X, XLib, XUtil;
+  {$DEFINE HasGLX}  // Activate GLX stuff
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+{$IFNDEF HasGLX}
+  {$MESSAGE GLX not present on this platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+// Note: Requires that the GL library has already been initialized
+function InitGLX: Boolean;
+
+var
+  GLXDumpUnresolvedFunctions,
+  GLXInitialized: Boolean;
+
+
+// =======================================================
+//   GLX consts, types and functions
+// =======================================================
+
+// Tokens for glXChooseVisual and glXGetConfig:
+const
+  GLX_USE_GL                            = 1;
+  GLX_BUFFER_SIZE                       = 2;
+  GLX_LEVEL                             = 3;
+  GLX_RGBA                              = 4;
+  GLX_DOUBLEBUFFER                      = 5;
+  GLX_STEREO                            = 6;
+  GLX_AUX_BUFFERS                       = 7;
+  GLX_RED_SIZE                          = 8;
+  GLX_GREEN_SIZE                        = 9;
+  GLX_BLUE_SIZE                         = 10;
+  GLX_ALPHA_SIZE                        = 11;
+  GLX_DEPTH_SIZE                        = 12;
+  GLX_STENCIL_SIZE                      = 13;
+  GLX_ACCUM_RED_SIZE                    = 14;
+  GLX_ACCUM_GREEN_SIZE                  = 15;
+  GLX_ACCUM_BLUE_SIZE                   = 16;
+  GLX_ACCUM_ALPHA_SIZE                  = 17;
+
+  // GLX_EXT_visual_info extension
+  GLX_X_VISUAL_TYPE_EXT                 = $22;
+  GLX_TRANSPARENT_TYPE_EXT              = $23;
+  GLX_TRANSPARENT_INDEX_VALUE_EXT       = $24;
+  GLX_TRANSPARENT_RED_VALUE_EXT         = $25;
+  GLX_TRANSPARENT_GREEN_VALUE_EXT       = $26;
+  GLX_TRANSPARENT_BLUE_VALUE_EXT        = $27;
+  GLX_TRANSPARENT_ALPHA_VALUE_EXT       = $28;
+
+
+  // Error codes returned by glXGetConfig:
+  GLX_BAD_SCREEN                        = 1;
+  GLX_BAD_ATTRIBUTE                     = 2;
+  GLX_NO_EXTENSION                      = 3;
+  GLX_BAD_VISUAL                        = 4;
+  GLX_BAD_CONTEXT                       = 5;
+  GLX_BAD_VALUE                         = 6;
+  GLX_BAD_ENUM                          = 7;
+
+  // GLX 1.1 and later:
+  GLX_VENDOR                            = 1;
+  GLX_VERSION                           = 2;
+  GLX_EXTENSIONS                        = 3;
+
+  // GLX_visual_info extension
+  GLX_TRUE_COLOR_EXT                    = $8002;
+  GLX_DIRECT_COLOR_EXT                  = $8003;
+  GLX_PSEUDO_COLOR_EXT                  = $8004;
+  GLX_STATIC_COLOR_EXT                  = $8005;
+  GLX_GRAY_SCALE_EXT                    = $8006;
+  GLX_STATIC_GRAY_EXT                   = $8007;
+  GLX_NONE_EXT                          = $8000;
+  GLX_TRANSPARENT_RGB_EXT               = $8008;
+  GLX_TRANSPARENT_INDEX_EXT             = $8009;
+
+type
+  // From XLib:
+  XPixmap = TXID;
+  XFont = TXID;
+  XColormap = TXID;
+
+  GLXContext = Pointer;
+  GLXPixmap = TXID;
+  GLXDrawable = TXID;
+  GLXContextID = TXID;
+
+var
+  glXChooseVisual: function(dpy: PDisplay; screen: Integer; var attribList: Integer): PXVisualInfo; cdecl; cdecl;
+  glXCreateContext: function(dpy: PDisplay; vis: PXVisualInfo; shareList: GLXContext; direct: Boolean): GLXContext; cdecl; cdecl;
+  glXDestroyContext: procedure(dpy: PDisplay; ctx: GLXContext); cdecl; cdecl;
+  glXMakeCurrent: function(dpy: PDisplay; drawable: GLXDrawable; ctx: GLXContext): Boolean; cdecl; cdecl;
+  glXCopyContext: procedure(dpy: PDisplay; src, dst: GLXContext; mask: LongWord); cdecl; cdecl;
+  glXSwapBuffers: procedure(dpy: PDisplay; drawable: GLXDrawable); cdecl; cdecl;
+  glXCreateGLXPixmap: function(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap): GLXPixmap; cdecl; cdecl;
+  glXDestroyGLXPixmap: procedure(dpy: PDisplay; pixmap: GLXPixmap); cdecl; cdecl;
+  glXQueryExtension: function(dpy: PDisplay; var errorb, event: Integer): Boolean; cdecl; cdecl;
+  glXQueryVersion: function(dpy: PDisplay; var maj, min: Integer): Boolean; cdecl; cdecl;
+  glXIsDirect: function(dpy: PDisplay; ctx: GLXContext): Boolean; cdecl; cdecl;
+  glXGetConfig: function(dpy: PDisplay; visual: PXVisualInfo; attrib: Integer; var value: Integer): Integer; cdecl; cdecl;
+  glXGetCurrentContext: function: GLXContext; cdecl; cdecl;
+  glXGetCurrentDrawable: function: GLXDrawable; cdecl; cdecl;
+  glXWaitGL: procedure; cdecl; cdecl;
+  glXWaitX: procedure; cdecl; cdecl;
+  glXUseXFont: procedure(font: XFont; first, count, list: Integer); cdecl; cdecl;
+
+  // GLX 1.1 and later
+  glXQueryExtensionsString: function(dpy: PDisplay; screen: Integer): PChar; cdecl; cdecl;
+  glXQueryServerString: function(dpy: PDisplay; screen, name: Integer): PChar; cdecl; cdecl;
+  glXGetClientString: function(dpy: PDisplay; name: Integer): PChar; cdecl; cdecl;
+
+  // Mesa GLX Extensions
+  glXCreateGLXPixmapMESA: function(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap; cmap: XColormap): GLXPixmap; cdecl; cdecl;
+  glXReleaseBufferMESA: function(dpy: PDisplay; d: GLXDrawable): Boolean; cdecl; cdecl;
+  glXCopySubBufferMESA: procedure(dpy: PDisplay; drawbale: GLXDrawable; x, y, width, height: Integer); cdecl; cdecl;
+  glXGetVideoSyncSGI: function(var counter: LongWord): Integer; cdecl; cdecl;
+  glXWaitVideoSyncSGI: function(divisor, remainder: Integer; var count: LongWord): Integer; cdecl; cdecl;
+
+
+// =======================================================
+//
+// =======================================================
+
+implementation
+
+{$LINKLIB m}
+
+function dlopen(AFile: PChar; mode: LongInt): Pointer; external 'dl';
+function dlclose(handle: Pointer): LongInt; external 'dl';
+function dlsym(handle: Pointer; name: PChar): Pointer; external 'dl';
+
+function LoadLibrary(name: PChar): Pointer;
+begin
+  Result := dlopen(name, $101 {RTLD_GLOBAL or RTLD_LAZY});
+end;
+
+function GetProc(handle: Pointer; name: PChar): Pointer;
+begin
+  Result := dlsym(handle, name);
+  if (Result = nil) and GLXDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+var
+  libGLX: Pointer;
+
+function InitGLXFromLibrary(libname:pchar): Boolean;
+begin
+  Result := False;
+  libGLX := LoadLibrary(libname);
+  if not Assigned(libGLX) then exit;
+
+  glXChooseVisual := GetProc(libglx, 'glXChooseVisual');
+  glXCreateContext := GetProc(libglx, 'glXCreateContext');
+  glXDestroyContext := GetProc(libglx, 'glXDestroyContext');
+  glXMakeCurrent := GetProc(libglx, 'glXMakeCurrent');
+  glXCopyContext := GetProc(libglx, 'glXCopyContext');
+  glXSwapBuffers := GetProc(libglx, 'glXSwapBuffers');
+  glXCreateGLXPixmap := GetProc(libglx, 'glXCreateGLXPixmap');
+  glXDestroyGLXPixmap := GetProc(libglx, 'glXDestroyGLXPixmap');
+  glXQueryExtension := GetProc(libglx, 'glXQueryExtension');
+  glXQueryVersion := GetProc(libglx, 'glXQueryVersion');
+  glXIsDirect := GetProc(libglx, 'glXIsDirect');
+  glXGetConfig := GetProc(libglx, 'glXGetConfig');
+  glXGetCurrentContext := GetProc(libglx, 'glXGetCurrentContext');
+  glXGetCurrentDrawable := GetProc(libglx, 'glXGetCurrentDrawable');
+  glXWaitGL := GetProc(libglx, 'glXWaitGL');
+  glXWaitX := GetProc(libglx, 'glXWaitX');
+  glXUseXFont := GetProc(libglx, 'glXUseXFont');
+  // GLX 1.1 and later
+  glXQueryExtensionsString := GetProc(libglx, 'glXQueryExtensionsString');
+  glXQueryServerString := GetProc(libglx, 'glXQueryServerString');
+  glXGetClientString := GetProc(libglx, 'glXGetClientString');
+  // Mesa GLX Extensions
+  glXCreateGLXPixmapMESA := GetProc(libglx, 'glXCreateGLXPixmapMESA');
+  glXReleaseBufferMESA := GetProc(libglx, 'glXReleaseBufferMESA');
+  glXCopySubBufferMESA := GetProc(libglx, 'glXCopySubBufferMESA');
+  glXGetVideoSyncSGI := GetProc(libglx, 'glXGetVideoSyncSGI');
+  glXWaitVideoSyncSGI := GetProc(libglx, 'glXWaitVideoSyncSGI');
+
+  GLXInitialized := True;
+  Result := True;
+end;
+
+function InitGLX: Boolean;
+begin
+  Result := InitGLXFromLibrary('libGL.so') or
+            InitGLXFromLibrary('libGL.so.1') or
+            InitGLXFromLibrary('libMesaGL.so') or
+            InitGLXFromLibrary('libMesaGL.so.3');
+end;
+
+
+initialization
+  InitGLX;
+finalization
+  if Assigned(libGLX) then dlclose(libGLX);
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:18  michael
+  + Initial import
+
+  Revision 1.1  2000/05/31 00:36:08  alex
+  dummy - incomplete code.
+
+}
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:45  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}

+ 58 - 0
packages/opengl/readme

@@ -0,0 +1,58 @@
+Free Pascal GL* (GL, GLU, GLUT, GLX) Units
+(c) 1999-2000 Sebastian Guenther, [email protected]
+
+
+subdirectory "build"
+--------------------
+This directory contains tools which create the sources of the real GL* units
+based on some template files. It contains its own README file, look there for
+further informations.
+
+
+subdirectory "linux"
+--------------------
+Contains the GL* units for Linux; currently you can use all GL, GLU and GLX
+functions as well as most GLUT functions. Automatic loading of GL extensions
+is not supported yet, but is planned for the future.
+Under Linux, the GL* units try to locate the underlying libraries at run-time;
+they search for the libraries in the following order:
+
+GL: (includes GLX)
+    1. libGL.so
+    2. libGL.so.1
+    3. libMesaGL.so.3
+
+GLU:
+    1. libGLU.so
+    2. libGLU.so.1
+    3. libMesaGLU.so.3
+
+GLUT:
+    1. libglut.so
+    2. libglut.so.3
+
+This should work on all more recent Linux installations.
+
+
+The GL unit has a variable called "GLDumpUnresolvedFunctions", and the GLUT
+unit one called "GLUTDumpUnresolvedFunctions". Set them to True in your
+applications if you want to get all function names dumped to the console
+which couldn't be resolved, i.e. which are not available in the loaded
+libraries.
+
+
+=== gtkglarea: ===
+
+Additionally, there is an adaption for the gtkglarea (GTK GL area widget)
+available; as gtkglarea uses the XLib it is only available for Linux here.
+
+
+subdirectory "examples"
+-----------------------
+Only contains a test program called "glutdemo" at the moment, which
+demonstrates the use of the GL and GLUT units.
+
+
+
+Have fun,
+Sebastian

+ 1240 - 0
packages/opengl/win32/Makefile

@@ -0,0 +1,1240 @@
+#
+# Makefile generated by fpcmake v1.00 [2000/09/02]
+#
+
+defaultrule: all
+
+#####################################################################
+# Autodetect OS (Linux or Dos or Windows NT)
+# define inlinux when running under linux
+# define inWinNT when running under WinNT
+#####################################################################
+
+# We need only / in the path
+override PATH:=$(subst \,/,$(PATH))
+
+# Search for PWD and determine also if we are under linux
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(subst ;, ,$(PATH)))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(subst :, ,$(PATH)))))
+ifeq ($(PWD),)
+nopwd:
+	@echo You need the GNU utils package to use this Makefile!
+	@echo Get ftp://ftp.freepascal.org/pub/fpc/dist/go32v2/utilgo32.zip
+	@exit
+else
+inlinux=1
+endif
+else
+PWD:=$(firstword $(PWD))
+endif
+
+# Detect NT - NT sets OS to Windows_NT
+ifndef inlinux
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+endif
+endif
+
+# Detect OS/2 - OS/2 has OS2_SHELL defined
+ifndef inlinux
+ifndef inWinNT
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+endif
+
+# The extension of executables
+ifdef inlinux
+EXEEXT=
+else
+EXEEXT=.exe
+endif
+
+# The path which is searched separated by spaces
+ifdef inlinux
+SEARCHPATH=$(subst :, ,$(PATH))
+else
+SEARCHPATH=$(subst ;, ,$(PATH))
+endif
+
+# Base dir
+ifdef PWD
+BASEDIR:=$(shell $(PWD))
+else
+BASEDIR=.
+endif
+
+#####################################################################
+# Default target
+#####################################################################
+
+override OS_TARGET:=win32
+
+#####################################################################
+# FPC version/target Detection
+#####################################################################
+
+# What compiler to use ?
+ifndef FPC
+# Compatibility with old makefiles
+ifdef PP
+FPC=$(PP)
+else
+ifdef inOS2
+FPC=ppos2
+else
+FPC=ppc386
+endif
+endif
+endif
+override FPC:=$(subst $(EXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(EXEEXT)
+
+# Target OS
+ifndef OS_TARGET
+OS_TARGET:=$(shell $(FPC) -iTO)
+endif
+
+# Source OS
+ifndef OS_SOURCE
+OS_SOURCE:=$(shell $(FPC) -iSO)
+endif
+
+# Target CPU
+ifndef CPU_TARGET
+CPU_TARGET:=$(shell $(FPC) -iTP)
+endif
+
+# Source CPU
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(shell $(FPC) -iSP)
+endif
+
+# FPC version
+ifndef FPC_VERSION
+FPC_VERSION:=$(shell $(FPC) -iV)
+endif
+
+export FPC OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FPC_VERSION
+
+#####################################################################
+# FPCDIR Setting
+#####################################################################
+
+# Test FPCDIR to look if the RTL dir exists
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=wrong
+endif
+endif
+else
+override FPCDIR=wrong
+endif
+
+# Default FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR=../../..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=wrong
+endif
+endif
+endif
+
+# Detect FPCDIR
+ifeq ($(FPCDIR),wrong)
+ifdef inlinux
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(FPCDIR)/rtl),)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+endif
+
+ifndef PACKAGESDIR
+PACKAGESDIR=$(FPCDIR)/packages
+endif
+ifndef TOOLKITSDIR
+TOOLKITSDIR=
+endif
+ifndef COMPONENTSDIR
+COMPONENTSDIR=
+endif
+
+# Create units dir
+ifneq ($(FPCDIR),.)
+UNITSDIR=$(FPCDIR)/units/$(OS_TARGET)
+endif
+
+#####################################################################
+# User Settings
+#####################################################################
+
+
+# Targets
+
+override UNITOBJECTS+=gl glut glaux gl_sl glut_sl glaux_sl gtkglarea
+
+# Clean
+
+
+# Install
+
+ZIPTARGET=install
+
+# Defaults
+
+
+# Directories
+
+
+# Packages
+
+override PACKAGES+=rtl gtk
+
+# Libraries
+
+
+# Info
+
+INFOTARGET=fpc_infocfg fpc_infoobjects fpc_infoinstall 
+
+#####################################################################
+# Shell tools
+#####################################################################
+
+# echo
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=echo
+ECHOE:=echo
+else
+ECHO:=$(firstword $(ECHO))
+ECHOE=$(ECHO) -E
+endif
+else
+ECHO:=$(firstword $(ECHO))
+ECHOE=$(ECHO) -E
+endif
+endif
+
+# To copy pograms
+ifndef COPY
+COPY:=cp -fp
+endif
+
+# Copy a whole tree
+ifndef COPYTREE
+COPYTREE:=cp -rfp
+endif
+
+# To move pograms
+ifndef MOVE
+MOVE:=mv -f
+endif
+
+# Check delete program
+ifndef DEL
+DEL:=rm -f
+endif
+
+# Check deltree program
+ifndef DELTREE
+DELTREE:=rm -rf
+endif
+
+# To install files
+ifndef INSTALL
+ifdef inlinux
+INSTALL:=install -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+
+# To install programs
+ifndef INSTALLEXE
+ifdef inlinux
+INSTALLEXE:=install -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+
+# To make a directory.
+ifndef MKDIR
+ifdef inlinux
+MKDIR:=install -m 755 -d
+else
+MKDIR:=ginstall -m 755 -d
+endif
+endif
+
+export ECHO ECHOE COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+
+#####################################################################
+# Default Tools
+#####################################################################
+
+# assembler, redefine it if cross compiling
+ifndef AS
+AS=as
+endif
+
+# linker, but probably not used
+ifndef LD
+LD=ld
+endif
+
+# ppas.bat / ppas.sh
+ifdef inlinux
+PPAS=ppas.sh
+else
+ifdef inOS2
+PPAS=ppas.cmd
+else
+PPAS=ppas.bat
+endif
+endif
+
+# ldconfig to rebuild .so cache
+ifdef inlinux
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+
+# ppumove
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE=
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+
+# ppufiles
+ifndef PPUFILES
+PPUFILES:=$(strip $(wildcard $(addsuffix /ppufiles$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUFILES),)
+PPUFILES=
+else
+PPUFILES:=$(firstword $(PPUFILES))
+endif
+endif
+export PPUFILES
+
+# Look if UPX is found for go32v2 and win32. We can't use $UPX becuase
+# upx uses that one itself (PFV)
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+
+# ZipProg, you can't use Zip as the var name (PFV)
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG=
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+
+ZIPOPT=-9
+ZIPEXT=.zip
+
+# Tar
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(EXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG=
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+
+ifeq ($(USETAR),bz2)
+TAROPT=vI
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+
+#####################################################################
+# Default extensions
+#####################################################################
+
+# Default needed extensions (Go32v2,Linux)
+LOADEREXT=.as
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+RSTEXT=.rst
+FPCMADE=fpcmade
+
+# Go32v1
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+FPCMADE=fpcmade.v1
+endif
+
+# Go32v2
+ifeq ($(OS_TARGET),go32v2)
+FPCMADE=fpcmade.dos
+endif
+
+# Linux
+ifeq ($(OS_TARGET),linux)
+FPCMADE=fpcmade.lnx
+endif
+
+# Win32
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.w32
+endif
+
+# OS/2
+ifeq ($(OS_TARGET),os2)
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+SMARTEXT=.so
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.os2
+endif
+
+# library prefix
+LIBPREFIX=lib
+ifeq ($(OS_TARGET),go32v2)
+LIBPREFIX=
+endif
+ifeq ($(OS_TARGET),go32v1)
+LIBPREFIX=
+endif
+
+# determine which .pas extension is used
+ifndef PASEXT
+ifdef EXEOBJECTS
+override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(EXEOBJECTS)))))
+else
+override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(UNITOBJECTS)))))
+endif
+ifeq ($(TESTPAS),)
+PASEXT=.pp
+else
+PASEXT=.pas
+endif
+endif
+
+
+# Check if the dirs really exists, else turn it off
+ifeq ($(wildcard $(UNITSDIR)),)
+UNITSDIR=
+endif
+ifeq ($(wildcard $(TOOLKITSDIR)),)
+TOOLKITSDIR=
+endif
+ifeq ($(wildcard $(PACKAGESDIR)),)
+PACKAGESDIR=
+endif
+ifeq ($(wildcard $(COMPONENTSDIR)),)
+COMPONENTSDIR=
+endif
+
+
+# PACKAGESDIR packages
+
+PACKAGERTL=1
+PACKAGEGTK=1
+
+ifdef PACKAGERTL
+ifneq ($(wildcard $(FPCDIR)/rtl),)
+ifneq ($(wildcard $(FPCDIR)/rtl/$(OS_TARGET)),)
+PACKAGEDIR_RTL=$(FPCDIR)/rtl/$(OS_TARGET)
+else
+PACKAGEDIR_RTL=$(FPCDIR)/rtl
+endif
+ifeq ($(wildcard $(PACKAGEDIR_RTL)/$(FPCMADE)),)
+override COMPILEPACKAGES+=package_rtl
+package_rtl:
+	$(MAKE) -C $(PACKAGEDIR_RTL) all
+endif
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+else
+PACKAGEDIR_RTL=
+ifneq ($(wildcard $(UNITSDIR)/rtl),)
+ifneq ($(wildcard $(UNITSDIR)/rtl/$(OS_TARGET)),)
+UNITDIR_RTL=$(UNITSDIR)/rtl/$(OS_TARGET)
+else
+UNITDIR_RTL=$(UNITSDIR)/rtl
+endif
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override NEEDUNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifdef PACKAGEGTK
+ifneq ($(wildcard $(PACKAGESDIR)/gtk),)
+ifneq ($(wildcard $(PACKAGESDIR)/gtk/$(OS_TARGET)),)
+PACKAGEDIR_GTK=$(PACKAGESDIR)/gtk/$(OS_TARGET)
+else
+PACKAGEDIR_GTK=$(PACKAGESDIR)/gtk
+endif
+ifeq ($(wildcard $(PACKAGEDIR_GTK)/$(FPCMADE)),)
+override COMPILEPACKAGES+=package_gtk
+package_gtk:
+	$(MAKE) -C $(PACKAGEDIR_GTK) all
+endif
+UNITDIR_GTK=$(PACKAGEDIR_GTK)
+else
+PACKAGEDIR_GTK=
+ifneq ($(wildcard $(UNITSDIR)/gtk),)
+ifneq ($(wildcard $(UNITSDIR)/gtk/$(OS_TARGET)),)
+UNITDIR_GTK=$(UNITSDIR)/gtk/$(OS_TARGET)
+else
+UNITDIR_GTK=$(UNITSDIR)/gtk
+endif
+else
+UNITDIR_GTK=
+endif
+endif
+ifdef UNITDIR_GTK
+override NEEDUNITDIR+=$(UNITDIR_GTK)
+endif
+endif
+
+
+#####################################################################
+# Default Directories
+#####################################################################
+
+# set the prefix directory where to install everything
+ifndef PREFIXINSTALLDIR
+ifdef inlinux
+PREFIXINSTALLDIR=/usr
+else
+PREFIXINSTALLDIR=/pp
+endif
+endif
+export PREFIXINSTALLDIR
+
+# Where to place the resulting zip files
+ifndef DESTZIPDIR
+DESTZIPDIR:=$(BASEDIR)
+endif
+export DESTZIPDIR
+
+#####################################################################
+# Install Directories
+#####################################################################
+
+# set the base directory where to install everything
+ifndef BASEINSTALLDIR
+ifdef inlinux
+BASEINSTALLDIR=$(PREFIXINSTALLDIR)/lib/fpc/$(FPC_VERSION)
+else
+BASEINSTALLDIR=$(PREFIXINSTALLDIR)
+endif
+endif
+
+# set the directory where to install the binaries
+ifndef BININSTALLDIR
+ifdef inlinux
+BININSTALLDIR=$(PREFIXINSTALLDIR)/bin
+else
+BININSTALLDIR=$(BASEINSTALLDIR)/bin/$(OS_TARGET)
+endif
+endif
+
+# set the directory where to install the units.
+ifndef UNITINSTALLDIR
+UNITINSTALLDIR=$(BASEINSTALLDIR)/units/$(OS_TARGET)
+ifdef UNITSUBDIR
+UNITINSTALLDIR:=$(UNITINSTALLDIR)/$(UNITSUBDIR)
+endif
+endif
+
+# Where to install shared libraries
+ifndef LIBINSTALLDIR
+ifdef inlinux
+LIBINSTALLDIR=$(PREFIXINSTALLDIR)/lib
+else
+LIBINSTALLDIR=$(UNITINSTALLDIR)
+endif
+endif
+
+# Where the source files will be stored
+ifndef SOURCEINSTALLDIR
+ifdef inlinux
+SOURCEINSTALLDIR=$(PREFIXINSTALLDIR)/src/fpc-$(FPC_VERSION)
+else
+SOURCEINSTALLDIR=$(BASEINSTALLDIR)/source
+endif
+ifdef SOURCESUBDIR
+SOURCEINSTALLDIR:=$(SOURCEINSTALLDIR)/$(SOURCESUBDIR)
+endif
+endif
+
+# Where the doc files will be stored
+ifndef DOCINSTALLDIR
+ifdef inlinux
+DOCINSTALLDIR=$(PREFIXINSTALLDIR)/doc/fpc-$(FPC_VERSION)
+else
+DOCINSTALLDIR=$(BASEINSTALLDIR)/doc
+endif
+endif
+
+# Where to install the examples, under linux we use the doc dir
+# because the copytree command will create a subdir itself
+ifndef EXAMPLEINSTALLDIR
+ifdef inlinux
+EXAMPLEINSTALLDIR=$(DOCINSTALLDIR)/examples
+else
+EXAMPLEINSTALLDIR=$(BASEINSTALLDIR)/examples
+endif
+ifdef EXAMPLESUBDIR
+EXAMPLEINSTALLDIR:=$(EXAMPLEINSTALLDIR)/$(EXAMPLESUBDIR)
+endif
+endif
+
+# Where the some extra (data)files will be stored
+ifndef DATAINSTALLDIR
+DATAINSTALLDIR=$(BASEINSTALLDIR)
+endif
+
+#####################################################################
+# Redirection
+#####################################################################
+
+ifndef REDIRFILE
+REDIRFILE=log
+endif
+
+ifdef REDIR
+ifndef inlinux
+override FPC=redir -eo $(FPC)
+endif
+# set the verbosity to max
+override FPCOPT+=-va
+override REDIR:= >> $(REDIRFILE)
+endif
+
+
+#####################################################################
+# Compiler Command Line
+#####################################################################
+
+# Load commandline OPTDEF and add FPC_CPU define
+override FPCOPTDEF:=-d$(CPU_TARGET)
+
+# Load commandline OPT and add target and unit dir to be sure
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+
+# User dirs should be first, so they are looked at first
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+
+# Smartlinking
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+
+# Smartlinking creation
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+
+# Debug
+ifdef DEBUG
+override FPCOPT+=-g -dDEBUG
+endif
+
+# Release mode (strip, optimize and don't load ppc386.cfg)
+# 0.99.12b has a bug in the optimizer so don't use it by default
+ifdef RELEASE
+ifeq ($(FPC_VERSION),0.99.12)
+override FPCOPT+=-Xs -OGp3 -n
+else
+override FPCOPT+=-Xs -OG2p3 -n
+endif
+endif
+
+# Strip
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+
+# Optimizer
+ifdef OPTIMIZE
+override FPCOPT+=-OG2p3
+endif
+
+# Verbose settings (warning,note,info)
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+
+ifdef NEEDUNITDIR
+override FPCOPT+=$(addprefix -Fu,$(NEEDUNITDIR))
+endif
+
+ifdef UNITSDIR
+override FPCOPT+=-Fu$(UNITSDIR)
+endif
+
+# Target dirs and the prefix to use for clean/install
+ifdef TARGETDIR
+override FPCOPT+=-FE$(TARGETDIR)
+ifeq ($(TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(TARGETDIR)/
+endif
+endif
+ifdef UNITTARGETDIR
+override FPCOPT+=-FU$(UNITTARGETDIR)
+ifeq ($(UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(TARGETDIR)/
+endif
+else
+ifdef TARGETDIR
+override UNITTARGETDIR=$(TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+
+# Add commandline options last so they can override
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+
+# Add defines from FPCOPTDEF to FPCOPT
+ifdef FPCOPTDEF
+override FPCOPT+=$(FPCOPTDEF)
+endif
+
+# Error file ?
+ifdef ERRORFILE
+override FPCOPT+=-Fr$(ERRORFILE)
+endif
+
+# Was a config file specified ?
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+
+# For win32 the options are passed using the environment FPCEXTCMD
+ifeq ($(OS_SOURCE),win32)
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+
+# Compiler commandline
+override COMPILER:=$(FPC) $(FPCOPT)
+
+# also call ppas if with command option -s
+# but only if the OS_SOURCE and OS_TARGE are equal
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(OS_SOURCE),$(OS_TARGET))
+EXECPPAS:=@$(PPAS)
+endif
+endif
+
+#####################################################################
+# Standard rules
+#####################################################################
+
+all: fpc_all
+
+debug: fpc_debug
+
+smart: fpc_smart
+
+shared: fpc_shared
+
+showinstall: fpc_showinstall
+
+install: fpc_install
+
+sourceinstall: fpc_sourceinstall
+
+exampleinstall: fpc_exampleinstall
+
+zipinstall: fpc_zipinstall
+
+zipsourceinstall: fpc_zipsourceinstall
+
+zipexampleinstall: fpc_zipexampleinstall
+
+clean: fpc_clean
+
+distclean: fpc_distclean
+
+cleanall: fpc_cleanall
+
+info: fpc_info
+
+.PHONY:  all debug smart shared showinstall install sourceinstall exampleinstall zipinstall zipsourceinstall zipexampleinstall clean distclean cleanall info
+
+#####################################################################
+# Units
+#####################################################################
+
+.PHONY: fpc_units
+
+override ALLTARGET+=fpc_units
+
+override UNITPPUFILES=$(addsuffix $(PPUEXT),$(UNITOBJECTS))
+override INSTALLPPUFILES+=$(UNITPPUFILES)
+override CLEANPPUFILES+=$(UNITPPUFILES)
+
+fpc_units: $(UNITPPUFILES)
+
+#####################################################################
+# General compile rules
+#####################################################################
+
+.PHONY: fpc_packages fpc_all fpc_debug
+
+$(FPCMADE): $(ALLTARGET)
+	@$(ECHO) Compiled > $(FPCMADE)
+
+fpc_packages: $(COMPILEPACKAGES)
+
+fpc_all: fpc_packages $(FPCMADE)
+
+fpc_debug:
+	$(MAKE) all DEBUG=1
+
+# Search paths for .ppu if targetdir is set
+ifdef UNITTARGETDIR
+vpath %$(PPUEXT) $(UNITTARGETDIR)
+endif
+
+# General compile rules, available for both possible PASEXT
+
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .pp
+
+%$(PPUEXT): %.pp
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(PPUEXT): %.pas
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(EXEEXT): %.pp
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+%$(EXEEXT): %.pas
+	$(COMPILER) $< $(REDIR)
+	$(EXECPPAS)
+
+#####################################################################
+# Library
+#####################################################################
+
+.PHONY: fpc_smart fpc_shared
+
+ifdef LIBVERSION
+LIBFULLNAME=$(LIBNAME).$(LIBVERSION)
+else
+LIBFULLNAME=$(LIBNAME)
+endif
+
+# Default sharedlib units are all unit objects
+ifndef SHAREDLIBUNITOBJECTS
+SHAREDLIBUNITOBJECTS:=$(UNITOBJECTS)
+endif
+
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+
+fpc_shared: all
+ifdef inlinux
+ifndef LIBNAME
+	@$(ECHO) "LIBNAME not set"
+else
+	$(PPUMOVE) $(SHAREDLIBUNITOBJECTS) -o$(LIBFULLNAME)
+endif
+else
+	@$(ECHO) "Shared Libraries not supported"
+endif
+
+#####################################################################
+# Install rules
+#####################################################################
+
+.PHONY: fpc_showinstall fpc_install
+
+ifdef EXTRAINSTALLUNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(EXTRAINSTALLUNITS))
+endif
+
+ifdef INSTALLPPUFILES
+override INSTALLPPUFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLPPUFILES))
+ifdef PPUFILES
+INSTALLPPULINKFILES:=$(shell $(PPUFILES) -S -O $(INSTALLPPUFILES))
+else
+INSTALLPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(LIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))))
+endif
+override INSTALLPPULINKFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLPPULINKFILES))
+endif
+
+ifdef INSTALLEXEFILES
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLEXEFILES))
+endif
+
+fpc_showinstall: $(SHOWINSTALLTARGET)
+ifdef INSTALLEXEFILES
+	@$(ECHO) -e $(addprefix "\n"$(BININSTALLDIR)/,$(INSTALLEXEFILES))
+endif
+ifdef INSTALLPPUFILES
+	@$(ECHO) -e $(addprefix "\n"$(UNITINSTALLDIR)/,$(INSTALLPPUFILES))
+ifneq ($(INSTALLPPULINKFILES),)
+	@$(ECHO) -e $(addprefix "\n"$(UNITINSTALLDIR)/,$(INSTALLPPULINKFILES))
+endif
+ifneq ($(wildcard $(LIBFULLNAME)),)
+	@$(ECHO) $(LIBINSTALLDIR)/$(LIBFULLNAME)
+ifdef inlinux
+	@$(ECHO) $(LIBINSTALLDIR)/$(LIBNAME)
+endif
+endif
+endif
+ifdef EXTRAINSTALLFILES
+	@$(ECHO) -e $(addprefix "\n"$(DATAINSTALLDIR)/,$(EXTRAINSTALLFILES))
+endif
+
+fpc_install: $(INSTALLTARGET)
+# Create UnitInstallFiles
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(BININSTALLDIR)
+# Compress the exes if upx is defined
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(BININSTALLDIR)
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(UNITINSTALLDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(UNITINSTALLDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(UNITINSTALLDIR)
+endif
+ifneq ($(wildcard $(LIBFULLNAME)),)
+	$(MKDIR) $(LIBINSTALLDIR)
+	$(INSTALL) $(LIBFULLNAME) $(LIBINSTALLDIR)
+ifdef inlinux
+	ln -sf $(LIBFULLNAME) $(LIBINSTALLDIR)/$(LIBNAME)
+endif
+endif
+endif
+ifdef EXTRAINSTALLFILES
+	$(MKDIR) $(DATAINSTALLDIR)
+	$(INSTALL) $(EXTRAINSTALLFILES) $(DATAINSTALLDIR)
+endif
+
+#####################################################################
+# SourceInstall rules
+#####################################################################
+
+.PHONY: fpc_sourceinstall
+
+ifndef SOURCETOPDIR
+SOURCETOPDIR=$(BASEDIR)
+endif
+
+fpc_sourceinstall: clean
+	$(MKDIR) $(SOURCEINSTALLDIR)
+	$(COPYTREE) $(SOURCETOPDIR) $(SOURCEINSTALLDIR)
+
+#####################################################################
+# exampleinstall rules
+#####################################################################
+
+.PHONY: fpc_exampleinstall
+
+fpc_exampleinstall: $(addsuffix _clean,$(EXAMPLEDIROBJECTS))
+ifdef EXAMPLESOURCEFILES
+	$(MKDIR) $(EXAMPLEINSTALLDIR)
+	$(COPY) $(EXAMPLESOURCEFILES) $(EXAMPLEINSTALLDIR)
+endif
+ifdef EXAMPLEDIROBJECTS
+ifndef EXAMPLESOURCEFILES
+	$(MKDIR) $(EXAMPLEINSTALLDIR)
+endif
+	$(COPYTREE) $(addsuffix /*,$(EXAMPLEDIROBJECTS)) $(EXAMPLEINSTALLDIR)
+endif
+
+#####################################################################
+# Zip
+#####################################################################
+
+.PHONY: fpc_zipinstall
+
+# Create suffix to add
+ifndef PACKAGESUFFIX
+PACKAGESUFFIX=$(OS_TARGET)
+ifeq ($(OS_TARGET),go32v2)
+PACKAGESUFFIX=go32
+endif
+ifeq ($(OS_TARGET),win32)
+PACKAGESUFFIX=w32
+endif
+endif
+
+# Temporary path to pack a file
+ifndef PACKDIR
+ifndef inlinux
+PACKDIR=$(BASEDIR)/pack_tmp
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+
+# Maybe create default zipname from packagename
+ifndef ZIPNAME
+ifdef PACKAGENAME
+ZIPNAME=$(PACKAGEPREFIX)$(PACKAGENAME)$(PACKAGESUFFIX)
+endif
+endif
+
+# Use tar by default under linux
+ifndef USEZIP
+ifdef inlinux
+USETAR=1
+endif
+endif
+
+fpc_zipinstall:
+ifndef ZIPNAME
+	@$(ECHO) "Please specify ZIPNAME!"
+	@exit 1
+else
+	$(MAKE) $(ZIPTARGET) PREFIXINSTALLDIR=$(PACKDIR)
+ifdef USETAR
+	$(DEL) $(DESTZIPDIR)/$(ZIPNAME)$(TAREXT)
+	cd $(PACKDIR) ; $(TARPROG) c$(TAROPT) --file $(DESTZIPDIR)/$(ZIPNAME)$(TAREXT) * ; cd $(BASEDIR)
+else
+	$(DEL) $(DESTZIPDIR)/$(ZIPNAME)$(ZIPEXT)
+	cd $(PACKDIR) ; $(ZIPPROG) -Dr $(ZIPOPT) $(DESTZIPDIR)/$(ZIPNAME)$(ZIPEXT) * ; cd $(BASEDIR)
+endif
+	$(DELTREE) $(PACKDIR)
+endif
+
+.PHONY:  fpc_zipsourceinstall
+
+fpc_zipsourceinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall PACKAGESUFFIX=src
+
+.PHONY:  fpc_zipexampleinstall
+
+fpc_zipexampleinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall PACKAGESUFFIX=exm
+
+#####################################################################
+# Clean rules
+#####################################################################
+
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+
+ifdef EXTRACLEANUNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(EXTRACLEANUNITS))
+endif
+
+ifdef CLEANPPUFILES
+override CLEANPPUFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANPPUFILES))
+# Get the .o and .a files created for the units
+ifdef PPUFILES
+CLEANPPULINKFILES:=$(shell $(PPUFILES) $(CLEANPPUFILES))
+else
+CLEANPPULINKFILES:=$(wildcard $(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(LIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))))
+endif
+override CLEANPPULINKFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANPPULINKFILES))
+endif
+
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef EXTRACLEANFILES
+	-$(DEL) $(EXTRACLEANFILES)
+endif
+ifdef LIBNAME
+	-$(DEL) $(LIBNAME) $(LIBFULLNAME)
+endif
+	-$(DEL) $(FPCMADE) $(PPAS) link.res $(FPCEXTFILE) $(REDIRFILE)
+
+fpc_distclean: fpc_clean
+
+# Also run clean first if targetdir is set. Unittargetdir is always
+# set if targetdir or unittargetdir is specified
+ifdef UNITTARGETDIR
+TARGETDIRCLEAN=fpc_clean
+endif
+
+fpc_cleanall: $(CLEANTARGET) $(TARGETDIRCLEAN)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) $(FPCMADE) $(PPAS) link.res $(FPCEXTFILE) $(REDIRFILE)
+
+#####################################################################
+# Info rules
+#####################################################################
+
+.PHONY: fpc_info fpc_cfginfo fpc_objectinfo fpc_toolsinfo fpc_installinfo \
+	fpc_dirinfo
+
+fpc_info: $(INFOTARGET)
+
+fpc_infocfg:
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC....... $(FPC)
+	@$(ECHO)  Version... $(FPC_VERSION)
+	@$(ECHO)  CPU....... $(CPU_TARGET)
+	@$(ECHO)  Source.... $(OS_SOURCE)
+	@$(ECHO)  Target.... $(OS_TARGET)
+	@$(ECHO)
+
+fpc_infoobjects:
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  LoaderObjects..... $(LOADEROBJECTS)
+	@$(ECHO)  UnitObjects....... $(UNITOBJECTS)
+	@$(ECHO)  ExeObjects........ $(EXEOBJECTS)
+	@$(ECHO)
+	@$(ECHO)  ExtraCleanUnits... $(EXTRACLEANUNITS)
+	@$(ECHO)  ExtraCleanFiles... $(EXTRACLEANFILES)
+	@$(ECHO)
+	@$(ECHO)  ExtraInstallUnits. $(EXTRAINSTALLUNITS)
+	@$(ECHO)  ExtraInstallFiles. $(EXTRAINSTALLFILES)
+	@$(ECHO)
+
+fpc_infoinstall:
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+ifdef DATE
+	@$(ECHO)  DateStr.............. $(DATESTR)
+endif
+ifdef PACKAGEPREFIX
+	@$(ECHO)  PackagePrefix........ $(PACKAGEPREFIX)
+endif
+ifdef PACKAGENAME
+	@$(ECHO)  PackageName.......... $(PACKAGENAME)
+endif
+	@$(ECHO)  PackageSuffix........ $(PACKAGESUFFIX)
+	@$(ECHO)
+	@$(ECHO)  BaseInstallDir....... $(BASEINSTALLDIR)
+	@$(ECHO)  BinInstallDir........ $(BININSTALLDIR)
+	@$(ECHO)  LibInstallDir........ $(LIBINSTALLDIR)
+	@$(ECHO)  UnitInstallDir....... $(UNITINSTALLDIR)
+	@$(ECHO)  SourceInstallDir..... $(SOURCEINSTALLDIR)
+	@$(ECHO)  DocInstallDir........ $(DOCINSTALLDIR)
+	@$(ECHO)  DataInstallDir....... $(DATAINSTALLDIR)
+	@$(ECHO)
+	@$(ECHO)  DestZipDir........... $(DESTZIPDIR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)
+
+#####################################################################
+# Local Makefile
+#####################################################################
+
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+

+ 15 - 0
packages/opengl/win32/Makefile.fpc

@@ -0,0 +1,15 @@
+#
+#   Makefile.fpc for Win32 dynamic and static GL units
+#
+
+[defaults]
+defaulttarget=win32
+
+[require]
+packages=gtk
+
+[targets]
+units=gl glut glaux gl_sl glut_sl glaux_sl gtkglarea
+
+[dirs]
+fpcdir=../../..

+ 2058 - 0
packages/opengl/win32/gl.pp

@@ -0,0 +1,2058 @@
+{
+  $Id$
+
+  Translation of the Mesa GL headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GL;
+
+interface
+
+{$DEFINE GL1_0}
+{x$DEFINE GL1_1}
+{x$DEFINE GL1_2}
+{x$DEFINE MESA}                 {enable if you want to use some special mesa extensions}
+{x$DEFINE EXTENSIONS}           {enable if you need one/all of extensions}
+{x$DEFINE SGI_EXTENSIONS}       {enable if you need one/all of extensions}
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE ogl_dll := }
+  uses Windows;
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+function InitGLFromLibrary(libname: PChar): Boolean;
+
+// determines automatically which libraries to use:
+function InitGL: Boolean;
+
+
+var
+  GLDumpUnresolvedFunctions,
+  GLInitialized: Boolean;
+
+
+// =======================================================
+//   GL consts, types and functions
+// =======================================================
+
+
+// -------------------------------------------------------
+//   GL types
+// -------------------------------------------------------
+
+type
+  PSingle   = ^Single;
+  PDouble   = ^Double;
+
+  GLvoid    = Pointer;
+  GLboolean = Byte;
+
+  GLbyte    = ShortInt; // 1-byte signed
+  GLshort   = Integer;  // 2-byte signed
+  GLint     = LongInt;  // 4-byte signed
+
+  GLubyte   = Byte;     // 1-byte unsigned
+  GLushort  = Word;     // 2-byte unsigned
+  GLuint    = DWord;    // 4-byte signed
+
+  GLsizei   = LongInt;  // 4-byte signed
+
+  GLfloat   = Single;   // single precision float
+  GLclampf  = Single;   // single precision float in [0,1]
+  GLdouble  = Double;   // double precision float
+  GLclampd  = Double;   // double precision float in [0,1]
+
+  GLenum    = DWord;
+
+  PGLBoolean = ^GLBoolean;
+  PGLFloat   = ^GLfloat;
+  PGLDouble  = ^GLDouble;
+
+type
+  GLbitfield = DWord;  { was an enum - no corresponding thing in pascal }
+const
+  GL_CURRENT_BIT        = $00000001;
+  GL_POINT_BIT          = $00000002;
+  GL_LINE_BIT           = $00000004;
+  GL_POLYGON_BIT        = $00000008;
+  GL_POLYGON_STIPPLE_BIT= $00000010;
+  GL_PIXEL_MODE_BIT     = $00000020;
+  GL_LIGHTING_BIT       = $00000040;
+  GL_FOG_BIT            = $00000080;
+  GL_DEPTH_BUFFER_BIT   = $00000100;
+  GL_ACCUM_BUFFER_BIT   = $00000200;
+  GL_STENCIL_BUFFER_BIT = $00000400;
+  GL_VIEWPORT_BIT       = $00000800;
+  GL_TRANSFORM_BIT      = $00001000;
+  GL_ENABLE_BIT         = $00002000;
+  GL_COLOR_BUFFER_BIT   = $00004000;
+  GL_HINT_BIT           = $00008000;
+  GL_EVAL_BIT           = $00010000;
+  GL_LIST_BIT           = $00020000;
+  GL_TEXTURE_BIT        = $00040000;
+  GL_SCISSOR_BIT        = $00080000;
+  GL_ALL_ATTRIB_BITS    = $000fffff;
+
+
+// -------------------------------------------------------
+//   GL constants
+// -------------------------------------------------------
+
+{$IFDEF GL1_0}
+
+const
+  GL_NO_ERROR                           = 0;
+
+  // Boolean values
+  GL_FALSE                              = 0;
+  GL_TRUE                               = 1;
+
+  // Data types
+  GL_BYTE                               = $1400;
+  GL_UNSIGNED_BYTE                      = $1401;
+  GL_SHORT                              = $1402;
+  GL_UNSIGNED_SHORT                     = $1403;
+  GL_INT                                = $1404;
+  GL_UNSIGNED_INT                       = $1405;
+  GL_FLOAT                              = $1406;
+  GL_DOUBLE                             = $140A;
+  GL_2_BYTES                            = $1407;
+  GL_3_BYTES                            = $1408;
+  GL_4_BYTES                            = $1409;
+
+  // Primitives
+  GL_LINES                              = $0001;
+  GL_POINTS                             = $0000;
+  GL_LINE_STRIP                         = $0003;
+  GL_LINE_LOOP                          = $0002;
+  GL_TRIANGLES                          = $0004;
+  GL_TRIANGLE_STRIP                     = $0005;
+  GL_TRIANGLE_FAN                       = $0006;
+  GL_QUADS                              = $0007;
+  GL_QUAD_STRIP                         = $0008;
+  GL_POLYGON                            = $0009;
+  GL_EDGE_FLAG                          = $0B43;
+
+  // Vertex arrays
+  GL_VERTEX_ARRAY                       = $8074;
+  GL_NORMAL_ARRAY                       = $8075;
+  GL_COLOR_ARRAY                        = $8076;
+  GL_INDEX_ARRAY                        = $8077;
+  GL_TEXTURE_COORD_ARRAY                = $8078;
+  GL_EDGE_FLAG_ARRAY                    = $8079;
+  GL_VERTEX_ARRAY_SIZE                  = $807A;
+  GL_VERTEX_ARRAY_TYPE                  = $807B;
+  GL_VERTEX_ARRAY_STRIDE                = $807C;
+  GL_NORMAL_ARRAY_TYPE                  = $807E;
+  GL_NORMAL_ARRAY_STRIDE                = $807F;
+  GL_COLOR_ARRAY_SIZE                   = $8081;
+  GL_COLOR_ARRAY_TYPE                   = $8082;
+  GL_COLOR_ARRAY_STRIDE                 = $8083;
+  GL_INDEX_ARRAY_TYPE                   = $8085;
+  GL_INDEX_ARRAY_STRIDE                 = $8086;
+  GL_TEXTURE_COORD_ARRAY_SIZE           = $8088;
+  GL_TEXTURE_COORD_ARRAY_TYPE           = $8089;
+  GL_TEXTURE_COORD_ARRAY_STRIDE         = $808A;
+  GL_EDGE_FLAG_ARRAY_STRIDE             = $808C;
+  GL_VERTEX_ARRAY_POINTER               = $808E;
+  GL_NORMAL_ARRAY_POINTER               = $808F;
+  GL_COLOR_ARRAY_POINTER                = $8090;
+  GL_INDEX_ARRAY_POINTER                = $8091;
+  GL_TEXTURE_COORD_ARRAY_POINTER        = $8092;
+  GL_EDGE_FLAG_ARRAY_POINTER            = $8093;
+  GL_V2F                                = $2A20;
+  GL_V3F                                = $2A21;
+  GL_C4UB_V2F                           = $2A22;
+  GL_C4UB_V3F                           = $2A23;
+  GL_C3F_V3F                            = $2A24;
+  GL_N3F_V3F                            = $2A25;
+  GL_C4F_N3F_V3F                        = $2A26;
+  GL_T2F_V3F                            = $2A27;
+  GL_T4F_V4F                            = $2A28;
+  GL_T2F_C4UB_V3F                       = $2A29;
+  GL_T2F_C3F_V3F                        = $2A2A;
+  GL_T2F_N3F_V3F                        = $2A2B;
+  GL_T2F_C4F_N3F_V3F                    = $2A2C;
+  GL_T4F_C4F_N3F_V4F                    = $2A2D;
+
+  // Matrix Mode
+  GL_MATRIX_MODE                        = $0BA0;
+  GL_MODELVIEW                          = $1700;
+  GL_PROJECTION                         = $1701;
+  GL_TEXTURE                            = $1702;
+
+  // Points
+  GL_POINT_SMOOTH                       = $0B10;
+  GL_POINT_SIZE                         = $0B11;
+  GL_POINT_SIZE_GRANULARITY             = $0B13;
+  GL_POINT_SIZE_RANGE                   = $0B12;
+
+  // Lines
+  GL_LINE_SMOOTH                        = $0B20;
+  GL_LINE_STIPPLE                       = $0B24;
+  GL_LINE_STIPPLE_PATTERN               = $0B25;
+  GL_LINE_STIPPLE_REPEAT                = $0B26;
+  GL_LINE_WIDTH                         = $0B21;
+  GL_LINE_WIDTH_GRANULARITY             = $0B23;
+  GL_LINE_WIDTH_RANGE                   = $0B22;
+
+  // Polygons
+  GL_POINT                              = $1B00;
+  GL_LINE                               = $1B01;
+  GL_FILL                               = $1B02;
+  GL_CCW                                = $0901;
+  GL_CW                                 = $0900;
+  GL_FRONT                              = $0404;
+  GL_BACK                               = $0405;
+  GL_CULL_FACE                          = $0B44;
+  GL_CULL_FACE_MODE                     = $0B45;
+  GL_POLYGON_SMOOTH                     = $0B41;
+  GL_POLYGON_STIPPLE                    = $0B42;
+  GL_FRONT_FACE                         = $0B46;
+  GL_POLYGON_MODE                       = $0B40;
+  GL_POLYGON_OFFSET_FACTOR              = $8038;
+  GL_POLYGON_OFFSET_UNITS               = $2A00;
+  GL_POLYGON_OFFSET_POINT               = $2A01;
+  GL_POLYGON_OFFSET_LINE                = $2A02;
+  GL_POLYGON_OFFSET_FILL                = $8037;
+
+  // Display lists
+  GL_COMPILE                            = $1300;
+  GL_COMPILE_AND_EXECUTE                = $1301;
+  GL_LIST_BASE                          = $0B32;
+  GL_LIST_INDEX                         = $0B33;
+  GL_LIST_MODE                          = $0B30;
+
+  // Depth buffer
+  GL_NEVER                              = $0200;
+  GL_LESS                               = $0201;
+  GL_GEQUAL                             = $0206;
+  GL_LEQUAL                             = $0203;
+  GL_GREATER                            = $0204;
+  GL_NOTEQUAL                           = $0205;
+  GL_EQUAL                              = $0202;
+  GL_ALWAYS                             = $0207;
+  GL_DEPTH_TEST                         = $0B71;
+  GL_DEPTH_BITS                         = $0D56;
+  GL_DEPTH_CLEAR_VALUE                  = $0B73;
+  GL_DEPTH_FUNC                         = $0B74;
+  GL_DEPTH_RANGE                        = $0B70;
+  GL_DEPTH_WRITEMASK                    = $0B72;
+  GL_DEPTH_COMPONENT                    = $1902;
+
+  // Lighting
+  GL_LIGHTING                           = $0B50;
+  GL_LIGHT0                             = $4000;
+  GL_LIGHT1                             = $4001;
+  GL_LIGHT2                             = $4002;
+  GL_LIGHT3                             = $4003;
+  GL_LIGHT4                             = $4004;
+  GL_LIGHT5                             = $4005;
+  GL_LIGHT6                             = $4006;
+  GL_LIGHT7                             = $4007;
+  GL_SPOT_EXPONENT                      = $1205;
+  GL_SPOT_CUTOFF                        = $1206;
+  GL_CONSTANT_ATTENUATION               = $1207;
+  GL_LINEAR_ATTENUATION                 = $1208;
+  GL_QUADRATIC_ATTENUATION              = $1209;
+  GL_AMBIENT                            = $1200;
+  GL_DIFFUSE                            = $1201;
+  GL_SPECULAR                           = $1202;
+  GL_SHININESS                          = $1601;
+  GL_EMISSION                           = $1600;
+  GL_POSITION                           = $1203;
+  GL_SPOT_DIRECTION                     = $1204;
+  GL_AMBIENT_AND_DIFFUSE                = $1602;
+  GL_COLOR_INDEXES                      = $1603;
+  GL_LIGHT_MODEL_TWO_SIDE               = $0B52;
+  GL_LIGHT_MODEL_LOCAL_VIEWER           = $0B51;
+  GL_LIGHT_MODEL_AMBIENT                = $0B53;
+  GL_FRONT_AND_BACK                     = $0408;
+  GL_SHADE_MODEL                        = $0B54;
+  GL_FLAT                               = $1D00;
+  GL_SMOOTH                             = $1D01;
+  GL_COLOR_MATERIAL                     = $0B57;
+  GL_COLOR_MATERIAL_FACE                = $0B55;
+  GL_COLOR_MATERIAL_PARAMETER           = $0B56;
+  GL_NORMALIZE                          = $0BA1;
+
+  // User clipping planes
+  GL_CLIP_PLANE0                        = $3000;
+  GL_CLIP_PLANE1                        = $3001;
+  GL_CLIP_PLANE2                        = $3002;
+  GL_CLIP_PLANE3                        = $3003;
+  GL_CLIP_PLANE4                        = $3004;
+  GL_CLIP_PLANE5                        = $3005;
+
+  // Accumulation buffer
+  GL_ACCUM_RED_BITS                     = $0D58;
+  GL_ACCUM_GREEN_BITS                   = $0D59;
+  GL_ACCUM_BLUE_BITS                    = $0D5A;
+  GL_ACCUM_ALPHA_BITS                   = $0D5B;
+  GL_ACCUM_CLEAR_VALUE                  = $0B80;
+  GL_ACCUM                              = $0100;
+  GL_ADD                                = $0104;
+  GL_LOAD                               = $0101;
+  GL_MULT                               = $0103;
+  GL_RETURN                             = $0102;
+
+  // Alpha testing
+  GL_ALPHA_TEST                         = $0BC0;
+  GL_ALPHA_TEST_REF                     = $0BC2;
+  GL_ALPHA_TEST_FUNC                    = $0BC1;
+
+  // Blending
+  GL_BLEND                              = $0BE2;
+  GL_BLEND_SRC                          = $0BE1;
+  GL_BLEND_DST                          = $0BE0;
+  GL_ZERO                               = 0;
+  GL_ONE                                = 1;
+  GL_SRC_COLOR                          = $0300;
+  GL_ONE_MINUS_SRC_COLOR                = $0301;
+  GL_DST_COLOR                          = $0306;
+  GL_ONE_MINUS_DST_COLOR                = $0307;
+  GL_SRC_ALPHA                          = $0302;
+  GL_ONE_MINUS_SRC_ALPHA                = $0303;
+  GL_DST_ALPHA                          = $0304;
+  GL_ONE_MINUS_DST_ALPHA                = $0305;
+  GL_SRC_ALPHA_SATURATE                 = $0308;
+  GL_CONSTANT_COLOR                     = $8001;
+  GL_ONE_MINUS_CONSTANT_COLOR           = $8002;
+  GL_CONSTANT_ALPHA                     = $8003;
+  GL_ONE_MINUS_CONSTANT_ALPHA           = $8004;
+
+  // Render mode
+  GL_FEEDBACK                           = $1C01;
+  GL_RENDER                             = $1C00;
+  GL_SELECT                             = $1C02;
+
+  // Feedback
+  GL_2D                                 = $0600;
+  GL_3D                                 = $0601;
+  GL_3D_COLOR                           = $0602;
+  GL_3D_COLOR_TEXTURE                   = $0603;
+  GL_4D_COLOR_TEXTURE                   = $0604;
+  GL_POINT_TOKEN                        = $0701;
+  GL_LINE_TOKEN                         = $0702;
+  GL_LINE_RESET_TOKEN                   = $0707;
+  GL_POLYGON_TOKEN                      = $0703;
+  GL_BITMAP_TOKEN                       = $0704;
+  GL_DRAW_PIXEL_TOKEN                   = $0705;
+  GL_COPY_PIXEL_TOKEN                   = $0706;
+  GL_PASS_THROUGH_TOKEN                 = $0700;
+  GL_FEEDBACK_BUFFER_POINTER            = $0DF0;
+  GL_FEEDBACK_BUFFER_SIZE               = $0DF1;
+  GL_FEEDBACK_BUFFER_TYPE               = $0DF2;
+
+  // Selection
+  GL_SELECTION_BUFFER_POINTER           = $0DF3;
+  GL_SELECTION_BUFFER_SIZE              = $0DF4;
+
+  // Fog
+  GL_FOG                                = $0B60;
+  GL_FOG_MODE                           = $0B65;
+  GL_FOG_DENSITY                        = $0B62;
+  GL_FOG_COLOR                          = $0B66;
+  GL_FOG_INDEX                          = $0B61;
+  GL_FOG_START                          = $0B63;
+  GL_FOG_END                            = $0B64;
+  GL_LINEAR                             = $2601;
+  GL_EXP                                = $0800;
+  GL_EXP2                               = $0801;
+
+  // Logic ops
+  GL_LOGIC_OP                           = $0BF1;
+  GL_INDEX_LOGIC_OP                     = $0BF1;
+  GL_COLOR_LOGIC_OP                     = $0BF2;
+  GL_LOGIC_OP_MODE                      = $0BF0;
+  GL_CLEAR                              = $1500;
+  GL_SET                                = $150F;
+  GL_COPY                               = $1503;
+  GL_COPY_INVERTED                      = $150C;
+  GL_NOOP                               = $1505;
+  GL_INVERT                             = $150A;
+  GL_AND                                = $1501;
+  GL_NAND                               = $150E;
+  GL_OR                                 = $1507;
+  GL_NOR                                = $1508;
+  GL_XOR                                = $1506;
+  GL_EQUIV                              = $1509;
+  GL_AND_REVERSE                        = $1502;
+  GL_AND_INVERTED                       = $1504;
+  GL_OR_REVERSE                         = $150B;
+  GL_OR_INVERTED                        = $150D;
+
+  // Stencil
+  GL_STENCIL_TEST                       = $0B90;
+  GL_STENCIL_WRITEMASK                  = $0B98;
+  GL_STENCIL_BITS                       = $0D57;
+  GL_STENCIL_FUNC                       = $0B92;
+  GL_STENCIL_VALUE_MASK                 = $0B93;
+  GL_STENCIL_REF                        = $0B97;
+  GL_STENCIL_FAIL                       = $0B94;
+  GL_STENCIL_PASS_DEPTH_PASS            = $0B96;
+  GL_STENCIL_PASS_DEPTH_FAIL            = $0B95;
+  GL_STENCIL_CLEAR_VALUE                = $0B91;
+  GL_STENCIL_INDEX                      = $1901;
+  GL_KEEP                               = $1E00;
+  GL_REPLACE                            = $1E01;
+  GL_INCR                               = $1E02;
+  GL_DECR                               = $1E03;
+
+  // Buffers, Pixel Drawing/Reading
+  GL_NONE                               = 0;
+  GL_LEFT                               = $0406;
+  GL_RIGHT                              = $0407;
+  //GL_FRONT                            = $0404;
+  //GL_BACK                             = $0405;
+  //GL_FRONT_AND_BACK                   = $0408;
+  GL_FRONT_LEFT                         = $0400;
+  GL_FRONT_RIGHT                        = $0401;
+  GL_BACK_LEFT                          = $0402;
+  GL_BACK_RIGHT                         = $0403;
+  GL_AUX0                               = $0409;
+  GL_AUX1                               = $040A;
+  GL_AUX2                               = $040B;
+  GL_AUX3                               = $040C;
+  GL_COLOR_INDEX                        = $1900;
+  GL_RED                                = $1903;
+  GL_GREEN                              = $1904;
+  GL_BLUE                               = $1905;
+  GL_ALPHA                              = $1906;
+  GL_LUMINANCE                          = $1909;
+  GL_LUMINANCE_ALPHA                    = $190A;
+  GL_ALPHA_BITS                         = $0D55;
+  GL_RED_BITS                           = $0D52;
+  GL_GREEN_BITS                         = $0D53;
+  GL_BLUE_BITS                          = $0D54;
+  GL_INDEX_BITS                         = $0D51;
+  GL_SUBPIXEL_BITS                      = $0D50;
+  GL_AUX_BUFFERS                        = $0C00;
+  GL_READ_BUFFER                        = $0C02;
+  GL_DRAW_BUFFER                        = $0C01;
+  GL_DOUBLEBUFFER                       = $0C32;
+  GL_STEREO                             = $0C33;
+  GL_BITMAP                             = $1A00;
+  GL_COLOR                              = $1800;
+  GL_DEPTH                              = $1801;
+  GL_STENCIL                            = $1802;
+  GL_DITHER                             = $0BD0;
+  GL_RGB                                = $1907;
+  GL_RGBA                               = $1908;
+
+  // Implementation limits
+  GL_MAX_LIST_NESTING                   = $0B31;
+  GL_MAX_ATTRIB_STACK_DEPTH             = $0D35;
+  GL_MAX_MODELVIEW_STACK_DEPTH          = $0D36;
+  GL_MAX_NAME_STACK_DEPTH               = $0D37;
+  GL_MAX_PROJECTION_STACK_DEPTH         = $0D38;
+  GL_MAX_TEXTURE_STACK_DEPTH            = $0D39;
+  GL_MAX_EVAL_ORDER                     = $0D30;
+  GL_MAX_LIGHTS                         = $0D31;
+  GL_MAX_CLIP_PLANES                    = $0D32;
+  GL_MAX_TEXTURE_SIZE                   = $0D33;
+  GL_MAX_PIXEL_MAP_TABLE                = $0D34;
+  GL_MAX_VIEWPORT_DIMS                  = $0D3A;
+  GL_MAX_CLIENT_ATTRIB_STACK_DEPTH      = $0D3B;
+
+  // Gets
+  GL_ATTRIB_STACK_DEPTH                 = $0BB0;
+  GL_CLIENT_ATTRIB_STACK_DEPTH          = $0BB1;
+  GL_COLOR_CLEAR_VALUE                  = $0C22;
+  GL_COLOR_WRITEMASK                    = $0C23;
+  GL_CURRENT_INDEX                      = $0B01;
+  GL_CURRENT_COLOR                      = $0B00;
+  GL_CURRENT_NORMAL                     = $0B02;
+  GL_CURRENT_RASTER_COLOR               = $0B04;
+  GL_CURRENT_RASTER_DISTANCE            = $0B09;
+  GL_CURRENT_RASTER_INDEX               = $0B05;
+  GL_CURRENT_RASTER_POSITION            = $0B07;
+  GL_CURRENT_RASTER_TEXTURE_COORDS      = $0B06;
+  GL_CURRENT_RASTER_POSITION_VALID      = $0B08;
+  GL_CURRENT_TEXTURE_COORDS             = $0B03;
+  GL_INDEX_CLEAR_VALUE                  = $0C20;
+  GL_INDEX_MODE                         = $0C30;
+  GL_INDEX_WRITEMASK                    = $0C21;
+  GL_MODELVIEW_MATRIX                   = $0BA6;
+  GL_MODELVIEW_STACK_DEPTH              = $0BA3;
+  GL_NAME_STACK_DEPTH                   = $0D70;
+  GL_PROJECTION_MATRIX                  = $0BA7;
+  GL_PROJECTION_STACK_DEPTH             = $0BA4;
+  GL_RENDER_MODE                        = $0C40;
+  GL_RGBA_MODE                          = $0C31;
+  GL_TEXTURE_MATRIX                     = $0BA8;
+  GL_TEXTURE_STACK_DEPTH                = $0BA5;
+  GL_VIEWPORT                           = $0BA2;
+
+  // Evaluators
+  GL_AUTO_NORMAL                        = $0D80;
+  GL_MAP1_COLOR_4                       = $0D90;
+  GL_MAP1_GRID_DOMAIN                   = $0DD0;
+  GL_MAP1_GRID_SEGMENTS                 = $0DD1;
+  GL_MAP1_INDEX                         = $0D91;
+  GL_MAP1_NORMAL                        = $0D92;
+  GL_MAP1_TEXTURE_COORD_1               = $0D93;
+  GL_MAP1_TEXTURE_COORD_2               = $0D94;
+  GL_MAP1_TEXTURE_COORD_3               = $0D95;
+  GL_MAP1_TEXTURE_COORD_4               = $0D96;
+  GL_MAP1_VERTEX_3                      = $0D97;
+  GL_MAP1_VERTEX_4                      = $0D98;
+  GL_MAP2_COLOR_4                       = $0DB0;
+  GL_MAP2_GRID_DOMAIN                   = $0DD2;
+  GL_MAP2_GRID_SEGMENTS                 = $0DD3;
+  GL_MAP2_INDEX                         = $0DB1;
+  GL_MAP2_NORMAL                        = $0DB2;
+  GL_MAP2_TEXTURE_COORD_1               = $0DB3;
+  GL_MAP2_TEXTURE_COORD_2               = $0DB4;
+  GL_MAP2_TEXTURE_COORD_3               = $0DB5;
+  GL_MAP2_TEXTURE_COORD_4               = $0DB6;
+  GL_MAP2_VERTEX_3                      = $0DB7;
+  GL_MAP2_VERTEX_4                      = $0DB8;
+  GL_COEFF                              = $0A00;
+  GL_DOMAIN                             = $0A02;
+  GL_ORDER                              = $0A01;
+
+  // Hints
+  GL_FOG_HINT                           = $0C54;
+  GL_LINE_SMOOTH_HINT                   = $0C52;
+  GL_PERSPECTIVE_CORRECTION_HINT        = $0C50;
+  GL_POINT_SMOOTH_HINT                  = $0C51;
+  GL_POLYGON_SMOOTH_HINT                = $0C53;
+  GL_DONT_CARE                          = $1100;
+  GL_FASTEST                            = $1101;
+  GL_NICEST                             = $1102;
+
+  // Scissor box
+  GL_SCISSOR_TEST                       = $0C11;
+  GL_SCISSOR_BOX                        = $0C10;
+
+  // Pixel Mode / Transfer
+  GL_MAP_COLOR                          = $0D10;
+  GL_MAP_STENCIL                        = $0D11;
+  GL_INDEX_SHIFT                        = $0D12;
+  GL_INDEX_OFFSET                       = $0D13;
+  GL_RED_SCALE                          = $0D14;
+  GL_RED_BIAS                           = $0D15;
+  GL_GREEN_SCALE                        = $0D18;
+  GL_GREEN_BIAS                         = $0D19;
+  GL_BLUE_SCALE                         = $0D1A;
+  GL_BLUE_BIAS                          = $0D1B;
+  GL_ALPHA_SCALE                        = $0D1C;
+  GL_ALPHA_BIAS                         = $0D1D;
+  GL_DEPTH_SCALE                        = $0D1E;
+  GL_DEPTH_BIAS                         = $0D1F;
+  GL_PIXEL_MAP_S_TO_S_SIZE              = $0CB1;
+  GL_PIXEL_MAP_I_TO_I_SIZE              = $0CB0;
+  GL_PIXEL_MAP_I_TO_R_SIZE              = $0CB2;
+  GL_PIXEL_MAP_I_TO_G_SIZE              = $0CB3;
+  GL_PIXEL_MAP_I_TO_B_SIZE              = $0CB4;
+  GL_PIXEL_MAP_I_TO_A_SIZE              = $0CB5;
+  GL_PIXEL_MAP_R_TO_R_SIZE              = $0CB6;
+  GL_PIXEL_MAP_G_TO_G_SIZE              = $0CB7;
+  GL_PIXEL_MAP_B_TO_B_SIZE              = $0CB8;
+  GL_PIXEL_MAP_A_TO_A_SIZE              = $0CB9;
+  GL_PIXEL_MAP_S_TO_S                   = $0C71;
+  GL_PIXEL_MAP_I_TO_I                   = $0C70;
+  GL_PIXEL_MAP_I_TO_R                   = $0C72;
+  GL_PIXEL_MAP_I_TO_G                   = $0C73;
+  GL_PIXEL_MAP_I_TO_B                   = $0C74;
+  GL_PIXEL_MAP_I_TO_A                   = $0C75;
+  GL_PIXEL_MAP_R_TO_R                   = $0C76;
+  GL_PIXEL_MAP_G_TO_G                   = $0C77;
+  GL_PIXEL_MAP_B_TO_B                   = $0C78;
+  GL_PIXEL_MAP_A_TO_A                   = $0C79;
+  GL_PACK_ALIGNMENT                     = $0D05;
+  GL_PACK_LSB_FIRST                     = $0D01;
+  GL_PACK_ROW_LENGTH                    = $0D02;
+  GL_PACK_SKIP_PIXELS                   = $0D04;
+  GL_PACK_SKIP_ROWS                     = $0D03;
+  GL_PACK_SWAP_BYTES                    = $0D00;
+  GL_UNPACK_ALIGNMENT                   = $0CF5;
+  GL_UNPACK_LSB_FIRST                   = $0CF1;
+  GL_UNPACK_ROW_LENGTH                  = $0CF2;
+  GL_UNPACK_SKIP_PIXELS                 = $0CF4;
+  GL_UNPACK_SKIP_ROWS                   = $0CF3;
+  GL_UNPACK_SWAP_BYTES                  = $0CF0;
+  GL_ZOOM_X                             = $0D16;
+  GL_ZOOM_Y                             = $0D17;
+
+  // Texture mapping
+  GL_TEXTURE_ENV                        = $2300;
+  GL_TEXTURE_ENV_MODE                   = $2200;
+  GL_TEXTURE_1D                         = $0DE0;
+  GL_TEXTURE_2D                         = $0DE1;
+  GL_TEXTURE_WRAP_S                     = $2802;
+  GL_TEXTURE_WRAP_T                     = $2803;
+  GL_TEXTURE_MAG_FILTER                 = $2800;
+  GL_TEXTURE_MIN_FILTER                 = $2801;
+  GL_TEXTURE_ENV_COLOR                  = $2201;
+  GL_TEXTURE_GEN_S                      = $0C60;
+  GL_TEXTURE_GEN_T                      = $0C61;
+  GL_TEXTURE_GEN_MODE                   = $2500;
+  GL_TEXTURE_BORDER_COLOR               = $1004;
+  GL_TEXTURE_WIDTH                      = $1000;
+  GL_TEXTURE_HEIGHT                     = $1001;
+  GL_TEXTURE_BORDER                     = $1005;
+  GL_TEXTURE_COMPONENTS                 = $1003;
+  GL_TEXTURE_RED_SIZE                   = $805C;
+  GL_TEXTURE_GREEN_SIZE                 = $805D;
+  GL_TEXTURE_BLUE_SIZE                  = $805E;
+  GL_TEXTURE_ALPHA_SIZE                 = $805F;
+  GL_TEXTURE_LUMINANCE_SIZE             = $8060;
+  GL_TEXTURE_INTENSITY_SIZE             = $8061;
+  GL_NEAREST_MIPMAP_NEAREST             = $2700;
+  GL_NEAREST_MIPMAP_LINEAR              = $2702;
+  GL_LINEAR_MIPMAP_NEAREST              = $2701;
+  GL_LINEAR_MIPMAP_LINEAR               = $2703;
+  GL_OBJECT_LINEAR                      = $2401;
+  GL_OBJECT_PLANE                       = $2501;
+  GL_EYE_LINEAR                         = $2400;
+  GL_EYE_PLANE                          = $2502;
+  GL_SPHERE_MAP                         = $2402;
+  GL_DECAL                              = $2101;
+  GL_MODULATE                           = $2100;
+  GL_NEAREST                            = $2600;
+  GL_REPEAT                             = $2901;
+  GL_CLAMP                              = $2900;
+  GL_S                                  = $2000;
+  GL_T                                  = $2001;
+  GL_R                                  = $2002;
+  GL_Q                                  = $2003;
+  GL_TEXTURE_GEN_R                      = $0C62;
+  GL_TEXTURE_GEN_Q                      = $0C63;
+{$ENDIF GL1_0}
+
+{$IFDEF GL1_1}
+
+const
+  // GL 1.1 texturing
+  GL_PROXY_TEXTURE_1D                   = $8063;
+  GL_PROXY_TEXTURE_2D                   = $8064;
+  GL_TEXTURE_PRIORITY                   = $8066;
+  GL_TEXTURE_RESIDENT                   = $8067;
+  GL_TEXTURE_BINDING_1D                 = $8068;
+  GL_TEXTURE_BINDING_2D                 = $8069;
+  GL_TEXTURE_INTERNAL_FORMAT            = $1003;
+
+  // Internal texture formats (GL 1.1)
+  GL_ALPHA4                             = $803B;
+  GL_ALPHA8                             = $803C;
+  GL_ALPHA12                            = $803D;
+  GL_ALPHA16                            = $803E;
+  GL_LUMINANCE4                         = $803F;
+  GL_LUMINANCE8                         = $8040;
+  GL_LUMINANCE12                        = $8041;
+  GL_LUMINANCE16                        = $8042;
+  GL_LUMINANCE4_ALPHA4                  = $8043;
+  GL_LUMINANCE6_ALPHA2                  = $8044;
+  GL_LUMINANCE8_ALPHA8                  = $8045;
+  GL_LUMINANCE12_ALPHA4                 = $8046;
+  GL_LUMINANCE12_ALPHA12                = $8047;
+  GL_LUMINANCE16_ALPHA16                = $8048;
+  GL_INTENSITY                          = $8049;
+  GL_INTENSITY4                         = $804A;
+  GL_INTENSITY8                         = $804B;
+  GL_INTENSITY12                        = $804C;
+  GL_INTENSITY16                        = $804D;
+  GL_R3_G3_B2                           = $2A10;
+  GL_RGB4                               = $804F;
+  GL_RGB5                               = $8050;
+  GL_RGB8                               = $8051;
+  GL_RGB10                              = $8052;
+  GL_RGB12                              = $8053;
+  GL_RGB16                              = $8054;
+  GL_RGBA2                              = $8055;
+  GL_RGBA4                              = $8056;
+  GL_RGB5_A1                            = $8057;
+  GL_RGBA8                              = $8058;
+  GL_RGB10_A2                           = $8059;
+  GL_RGBA12                             = $805A;
+  GL_RGBA16                             = $805B;
+
+{$ENDIF GL1_1}
+
+{$IFDEF GL1_2}
+
+const
+  // GL 1.2 texturing
+  GL_PACK_SKIP_IMAGES                   = $806B;
+  GL_PACK_IMAGE_HEIGHT                  = $806C;
+  GL_UNPACK_SKIP_IMAGES                 = $806D;
+  GL_UNPACK_IMAGE_HEIGHT                = $806E;
+  GL_TEXTURE_3D                         = $806F;
+  GL_PROXY_TEXTURE_3D                   = $8070;
+  GL_TEXTURE_DEPTH                      = $8071;
+  GL_TEXTURE_WRAP_R                     = $8072;
+  GL_MAX_3D_TEXTURE_SIZE                = $8073;
+  GL_TEXTURE_BINDING_3D                 = $806A;
+
+const
+  GL_RESCALE_NORMAL                     = $803A;
+  GL_CLAMP_TO_EDGE                      = $812F;
+  GL_MAX_ELEMENTS_VERTICES              = $F0E8;
+  GL_MAX_ELEMENTS_INDICES               = $F0E9;
+  GL_BGR                                = $80E0;
+  GL_BGRA                               = $80E1;
+  GL_UNSIGNED_BYTE_3_3_2                = $8032;
+  GL_UNSIGNED_BYTE_2_3_3_REV            = $8362;
+  GL_UNSIGNED_SHORT_5_6_5               = $8363;
+  GL_UNSIGNED_SHORT_5_6_5_REV           = $8364;
+  GL_UNSIGNED_SHORT_4_4_4_4             = $8033;
+  GL_UNSIGNED_SHORT_4_4_4_4_REV         = $8365;
+  GL_UNSIGNED_SHORT_5_5_5_1             = $8034;
+  GL_UNSIGNED_SHORT_1_5_5_5_REV         = $8366;
+  GL_UNSIGNED_INT_8_8_8_8               = $8035;
+  GL_UNSIGNED_INT_8_8_8_8_REV           = $8367;
+  GL_UNSIGNED_INT_10_10_10_2            = $8036;
+  GL_UNSIGNED_INT_2_10_10_10_REV        = $8368;
+  GL_LIGHT_MODEL_COLOR_CONTROL          = $81F8;
+  GL_SINGLE_COLOR                       = $81F9;
+  GL_SEPARATE_SPECULAR_COLOR            = $81FA;
+  GL_TEXTURE_MIN_LOD                    = $813A;
+  GL_TEXTURE_MAX_LOD                    = $813B;
+  GL_TEXTURE_BASE_LEVEL                 = $813C;
+  GL_TEXTURE_MAX_LEVEL                  = $813D;
+
+{$ENDIF GL1_2}
+
+const
+  // Utility
+  GL_VENDOR                             = $1F00;
+  GL_RENDERER                           = $1F01;
+  GL_VERSION                            = $1F02;
+  GL_EXTENSIONS                         = $1F03;
+
+  // Errors
+  GL_INVALID_VALUE                      = $0501;
+  GL_INVALID_ENUM                       = $0500;
+  GL_INVALID_OPERATION                  = $0502;
+  GL_STACK_OVERFLOW                     = $0503;
+  GL_STACK_UNDERFLOW                    = $0504;
+  GL_OUT_OF_MEMORY                      = $0505;
+
+
+// -------------------------------------------------------
+//   GL extensions constants
+// -------------------------------------------------------
+
+{$IFDEF EXTENSIONS}
+
+const
+  // GL_EXT_blend_minmax and GL_EXT_blend_color
+  GL_CONSTANT_COLOR_EXT                 = $8001;
+  GL_ONE_MINUS_CONSTANT_COLOR_EXT       = $8002;
+  GL_CONSTANT_ALPHA_EXT                 = $8003;
+  GL_ONE_MINUS_CONSTANT_ALPHA_EXT       = $8004;
+  GL_BLEND_EQUATION_EXT                 = $8009;
+  GL_MIN_EXT                            = $8007;
+  GL_MAX_EXT                            = $8008;
+  GL_FUNC_ADD_EXT                       = $8006;
+  GL_FUNC_SUBTRACT_EXT                  = $800A;
+  GL_FUNC_REVERSE_SUBTRACT_EXT          = $800B;
+  GL_BLEND_COLOR_EXT                    = $8005;
+
+  // GL_EXT_polygon_offset
+  GL_POLYGON_OFFSET_EXT                 = $8037;
+  GL_POLYGON_OFFSET_FACTOR_EXT          = $8038;
+  GL_POLYGON_OFFSET_BIAS_EXT            = $8039;
+
+  // GL_EXT_vertex_array
+  GL_VERTEX_ARRAY_EXT                   = $8074;
+  GL_NORMAL_ARRAY_EXT                   = $8075;
+  GL_COLOR_ARRAY_EXT                    = $8076;
+  GL_INDEX_ARRAY_EXT                    = $8077;
+  GL_TEXTURE_COORD_ARRAY_EXT            = $8078;
+  GL_EDGE_FLAG_ARRAY_EXT                = $8079;
+  GL_VERTEX_ARRAY_SIZE_EXT              = $807A;
+  GL_VERTEX_ARRAY_TYPE_EXT              = $807B;
+  GL_VERTEX_ARRAY_STRIDE_EXT            = $807C;
+  GL_VERTEX_ARRAY_COUNT_EXT             = $807D;
+  GL_NORMAL_ARRAY_TYPE_EXT              = $807E;
+  GL_NORMAL_ARRAY_STRIDE_EXT            = $807F;
+  GL_NORMAL_ARRAY_COUNT_EXT             = $8080;
+  GL_COLOR_ARRAY_SIZE_EXT               = $8081;
+  GL_COLOR_ARRAY_TYPE_EXT               = $8082;
+  GL_COLOR_ARRAY_STRIDE_EXT             = $8083;
+  GL_COLOR_ARRAY_COUNT_EXT              = $8084;
+  GL_INDEX_ARRAY_TYPE_EXT               = $8085;
+  GL_INDEX_ARRAY_STRIDE_EXT             = $8086;
+  GL_INDEX_ARRAY_COUNT_EXT              = $8087;
+  GL_TEXTURE_COORD_ARRAY_SIZE_EXT       = $8088;
+  GL_TEXTURE_COORD_ARRAY_TYPE_EXT       = $8089;
+  GL_TEXTURE_COORD_ARRAY_STRIDE_EXT     = $808A;
+  GL_TEXTURE_COORD_ARRAY_COUNT_EXT      = $808B;
+  GL_EDGE_FLAG_ARRAY_STRIDE_EXT         = $808C;
+  GL_EDGE_FLAG_ARRAY_COUNT_EXT          = $808D;
+  GL_VERTEX_ARRAY_POINTER_EXT           = $808E;
+  GL_NORMAL_ARRAY_POINTER_EXT           = $808F;
+  GL_COLOR_ARRAY_POINTER_EXT            = $8090;
+  GL_INDEX_ARRAY_POINTER_EXT            = $8091;
+  GL_TEXTURE_COORD_ARRAY_POINTER_EXT    = $8092;
+  GL_EDGE_FLAG_ARRAY_POINTER_EXT        = $8093;
+
+  // GL_EXT_texture_object
+  GL_TEXTURE_PRIORITY_EXT               = $8066;
+  GL_TEXTURE_RESIDENT_EXT               = $8067;
+  GL_TEXTURE_1D_BINDING_EXT             = $8068;
+  GL_TEXTURE_2D_BINDING_EXT             = $8069;
+
+  // GL_EXT_texture3D
+  GL_PACK_SKIP_IMAGES_EXT               = $806B;
+  GL_PACK_IMAGE_HEIGHT_EXT              = $806C;
+  GL_UNPACK_SKIP_IMAGES_EXT             = $806D;
+  GL_UNPACK_IMAGE_HEIGHT_EXT            = $806E;
+  GL_TEXTURE_3D_EXT                     = $806F;
+  GL_PROXY_TEXTURE_3D_EXT               = $8070;
+  GL_TEXTURE_DEPTH_EXT                  = $8071;
+  GL_TEXTURE_WRAP_R_EXT                 = $8072;
+  GL_MAX_3D_TEXTURE_SIZE_EXT            = $8073;
+  GL_TEXTURE_3D_BINDING_EXT             = $806A;
+
+  // GL_EXT_paletted_texture
+  GL_TABLE_TOO_LARGE_EXT                = $8031;
+  GL_COLOR_TABLE_FORMAT_EXT             = $80D8;
+  GL_COLOR_TABLE_WIDTH_EXT              = $80D9;
+  GL_COLOR_TABLE_RED_SIZE_EXT           = $80DA;
+  GL_COLOR_TABLE_GREEN_SIZE_EXT         = $80DB;
+  GL_COLOR_TABLE_BLUE_SIZE_EXT          = $80DC;
+  GL_COLOR_TABLE_ALPHA_SIZE_EXT         = $80DD;
+  GL_COLOR_TABLE_LUMINANCE_SIZE_EXT     = $80DE;
+  GL_COLOR_TABLE_INTENSITY_SIZE_EXT     = $80DF;
+  GL_TEXTURE_INDEX_SIZE_EXT             = $80ED;
+  GL_COLOR_INDEX1_EXT                   = $80E2;
+  GL_COLOR_INDEX2_EXT                   = $80E3;
+  GL_COLOR_INDEX4_EXT                   = $80E4;
+  GL_COLOR_INDEX8_EXT                   = $80E5;
+  GL_COLOR_INDEX12_EXT                  = $80E6;
+  GL_COLOR_INDEX16_EXT                  = $80E7;
+
+  // GL_EXT_shared_texture_palette
+  GL_SHARED_TEXTURE_PALETTE_EXT         = $81FB;
+
+  // GL_EXT_point_parameters
+  GL_POINT_SIZE_MIN_EXT                 = $8126;
+  GL_POINT_SIZE_MAX_EXT                 = $8127;
+  GL_POINT_FADE_THRESHOLD_SIZE_EXT      = $8128;
+  GL_DISTANCE_ATTENUATION_EXT           = $8129;
+
+  // GL_EXT_rescale_normal
+  GL_RESCALE_NORMAL_EXT                 = $803A;
+
+  // GL_EXT_abgr
+  GL_ABGR_EXT                           = $8000;
+
+const
+  // GL_EXT_multitexture
+  GL_SELECTED_TEXTURE_EXT               = $83C0;
+  GL_SELECTED_TEXTURE_COORD_SET_EXT     = $83C1;
+  GL_SELECTED_TEXTURE_TRANSFORM_EXT     = $83C2;
+  GL_MAX_TEXTURES_EXT                   = $83C3;
+  GL_MAX_TEXTURE_COORD_SETS_EXT         = $83C4;
+  GL_TEXTURE_ENV_COORD_SET_EXT          = $83C5;
+  GL_TEXTURE0_EXT                       = $83C6;
+  GL_TEXTURE1_EXT                       = $83C7;
+  GL_TEXTURE2_EXT                       = $83C8;
+  GL_TEXTURE3_EXT                       = $83C9;
+
+{$ENDIF EXTENSIONS}
+
+{$IFDEF SGI_EXTENSIONS}
+
+const
+  // GL_SGIS_multitexture
+  GL_SELECTED_TEXTURE_SGIS              = $835C;
+  GL_SELECTED_TEXTURE_COORD_SET_SGIS    = $835D;
+  GL_MAX_TEXTURES_SGIS                  = $835E;
+  GL_TEXTURE0_SGIS                      = $835F;
+  GL_TEXTURE1_SGIS                      = $8360;
+  GL_TEXTURE2_SGIS                      = $8361;
+  GL_TEXTURE3_SGIS                      = $8362;
+  GL_TEXTURE_COORD_SET_SOURCE_SGIS      = $8363;
+
+const
+  // GL_SGIS_texture_edge_clamp
+  GL_CLAMP_TO_EDGE_SGIS                 = $812F;
+
+{$ENDIF SGI_EXTENSIONS}
+
+{$IFDEF MESA}
+{$ENDIF MESA}
+
+
+// -------------------------------------------------------
+//   GL procedures and functions
+// -------------------------------------------------------
+
+{$IFDEF GL1_0}
+var
+// Miscellaneous
+glClearIndex: procedure(c: Single); ogl_dll
+glClearColor: procedure(red, green, blue, alpha: GLclampf); ogl_dll
+glClear: procedure(mask: GLbitfield); ogl_dll
+glIndexMask: procedure(mask: LongWord); ogl_dll
+glColorMask: procedure(red, green, blue, alpha: GLboolean); ogl_dll
+glAlphaFunc: procedure(func: GLenum; ref: GLclampf); ogl_dll
+glBlendFunc: procedure(sfactor, dfactor: GLenum); ogl_dll
+glLogicOp: procedure(opcode: GLenum); ogl_dll
+glCullFace: procedure(mode: GLenum); ogl_dll
+glFrontFace: procedure(mode: GLenum); ogl_dll
+glPointSize: procedure(size: Single); ogl_dll
+glLineWidth: procedure(width: Single); ogl_dll
+glLineStipple: procedure(factor: LongInt; pattern: Word); ogl_dll
+glPolygonMode: procedure(face, mode: GLenum); ogl_dll
+glPolygonOffset: procedure(factor, units: Single); ogl_dll
+glPolygonStipple: procedure(var mask: Byte); ogl_dll
+glGetPolygonStipple: procedure(var mask: Byte); ogl_dll
+glEdgeFlag: procedure(flag: GLBoolean); ogl_dll
+glEdgeFlagv: procedure(var flag: GLBoolean); ogl_dll
+glScissor: procedure(x, y, width, height: LongInt); ogl_dll
+glClipPlane: procedure(plane: GLenum; var equation: Double); ogl_dll
+glGetClipPlane: procedure(plane: GLenum; var equation: Double); ogl_dll
+glDrawBuffer: procedure(mode: GLenum); ogl_dll
+glReadBuffer: procedure(mode: GLenum); ogl_dll
+glEnable: procedure(cap: LongInt); ogl_dll
+glDisable: procedure(cap: LongInt); ogl_dll
+glIsEnabled: function(cap: GLenum): GLBoolean; ogl_dll
+glGetBooleanv: procedure(pname: GLenum; params : PGLBoolean); ogl_dll
+glGetDoublev: procedure(pname: GLenum; params : PDouble); ogl_dll
+glGetFloatv: procedure(pname: GLenum; params : PSingle); ogl_dll
+glGetIntegerv: procedure(pname: GLenum; params : PLongInt); ogl_dll
+glPushAttrib: procedure(mask: GLbitfield); ogl_dll
+glPopAttrib: procedure; ogl_dll
+glRenderMode: function(mode: GLenum): LongInt; ogl_dll
+glGetError: function: GLenum; ogl_dll
+glGetString: function(name: GLenum): PChar; ogl_dll
+glFinish: procedure; ogl_dll
+glFlush: procedure; ogl_dll
+glHint: procedure(target, mode: GLenum); ogl_dll
+
+// Depth Buffer
+glClearDepth: procedure(depth: GLclampd); ogl_dll
+glDepthFunc: procedure(func: LongInt); ogl_dll
+glDepthMask: procedure(flag: GLBoolean); ogl_dll
+glDepthRange: procedure(near_val, far_val: GLclampd); ogl_dll
+
+// Accumulation Buffer
+glClearAccum: procedure(red, green, blue, alpha: Single); ogl_dll
+glAccum: procedure(op: GLenum; value: Single); ogl_dll
+
+// Tranformation
+glMatrixMode: procedure(mode: GLenum); ogl_dll
+glOrtho: procedure(left, right, bottom, top, near_val, far_val: Double); ogl_dll
+glFrustum: procedure(left, right, bottom, top, near_val, far_val: Double); ogl_dll
+glViewport: procedure(x, y, width, height: LongInt); ogl_dll
+glPushMatrix: procedure; ogl_dll
+glPopMatrix: procedure; ogl_dll
+glLoadIdentity: procedure; ogl_dll
+glLoadMatrixd: procedure(var m: Double); ogl_dll
+glLoadMatrixf: procedure(var m: PSingle); ogl_dll
+glMultMatrixd: procedure(var m: Double); ogl_dll
+glMultMatrixf: procedure(var m: Single); ogl_dll
+glRotated: procedure(angle, x, y, z: Double); ogl_dll
+glRotatef: procedure(angle, x, y, z: Single); ogl_dll
+glScaled: procedure(x, y, z: Double); ogl_dll
+glScalef: procedure(x, y, z: Single); ogl_dll
+glTranslated: procedure(x, y, z: Double); ogl_dll
+glTranslatef: procedure(x, y, z: Single); ogl_dll
+
+// Display Lists
+glIsList: function(list: LongWord): GLBoolean; ogl_dll
+glDeleteLists: procedure(list: LongWord; range: LongInt); ogl_dll
+glGenLists: function(range: LongInt): LongWord; ogl_dll
+glNewList: procedure(list: LongWord; mode: GLenum); ogl_dll
+glEndList: procedure; ogl_dll
+glCallList: procedure(list: LongWord); ogl_dll
+glCallLists: procedure(n: LongInt; AType: GLenum; var lists); ogl_dll
+glListBase: procedure(base: LongWord); ogl_dll
+
+// Drawing Functions
+glBegin: procedure(mode: GLenum); ogl_dll
+glEnd: procedure; ogl_dll
+glVertex2d: procedure(x, y: Double); ogl_dll
+glVertex2f: procedure(x, y: Single); ogl_dll
+glVertex2i: procedure(x, y: LongInt); ogl_dll
+glVertex2s: procedure(x, y: SmallInt); ogl_dll
+glVertex3d: procedure(x, y, z: Double); ogl_dll
+glVertex3f: procedure(x, y, z: Single); ogl_dll
+glVertex3i: procedure(x, y, z: LongInt); ogl_dll
+glVertex3s: procedure(x, y, z: SmallInt); ogl_dll
+glVertex4d: procedure(x, y, z, w: Double); ogl_dll
+glVertex4f: procedure(x, y, z, w: Single); ogl_dll
+glVertex4i: procedure(x, y, z, w: LongInt); ogl_dll
+glVertex4s: procedure(x, y, z, w: SmallInt); ogl_dll
+glVertex2dv: procedure(var v: Double); ogl_dll
+glVertex2fv: procedure(var v: Single); ogl_dll
+glVertex2iv: procedure(var v: LongInt); ogl_dll
+glVertex2sv: procedure(var v: SmallInt); ogl_dll
+glVertex3dv: procedure(var v: Double); ogl_dll
+glVertex3fv: procedure(var v: Single); ogl_dll
+glVertex3iv: procedure(var v: LongInt); ogl_dll
+glVertex3sv: procedure(var v: SmallInt); ogl_dll
+glVertex4dv: procedure(var v: Double); ogl_dll
+glVertex4fv: procedure(var v: Single); ogl_dll
+glVertex4iv: procedure(var v: LongInt); ogl_dll
+glVertex4sv: procedure(var v: SmallInt); ogl_dll
+glNormal3b: procedure(nx, ny, nz: Byte); ogl_dll
+glNormal3d: procedure(nx, ny, nz: Double); ogl_dll
+glNormal3f: procedure(nx, ny, nz: Single); ogl_dll
+glNormal3i: procedure(nx, ny, nz: LongInt); ogl_dll
+glNormal3s: procedure(nx, ny, nz: SmallInt); ogl_dll
+glNormal3bv: procedure(var v: ShortInt); ogl_dll
+glNormal3dv: procedure(var v: Double); ogl_dll
+glNormal3fv: procedure(var v: Single); ogl_dll
+glNormal3iv: procedure(var v: LongInt); ogl_dll
+glNormal3sv: procedure(var v: SmallInt); ogl_dll
+glIndexd: procedure(c: Double); ogl_dll
+glIndexf: procedure(c: Single); ogl_dll
+glIndexi: procedure(c: LongInt); ogl_dll
+glIndexs: procedure(c: SmallInt); ogl_dll
+glIndexdv: procedure(var c: Double); ogl_dll
+glIndexfv: procedure(var c: Single); ogl_dll
+glIndexiv: procedure(var c: LongInt); ogl_dll
+glIndexsv: procedure(var c: SmallInt); ogl_dll
+glColor3b: procedure (red, green, blue: ShortInt); ogl_dll
+glColor3d: procedure (red, green, blue: Double); ogl_dll
+glColor3f: procedure (red, green, blue: Single); ogl_dll
+glColor3i: procedure (red, green, blue: LongInt); ogl_dll
+glColor3s: procedure (red, green, blue: SmallInt); ogl_dll
+glColor3ub: procedure(red, green, blue: Byte); ogl_dll
+glColor3ui: procedure(red, green, blue: LongWord); ogl_dll
+glColor3us: procedure(red, green, blue: Word); ogl_dll
+glColor4b: procedure (red, green, blue, alpha: ShortInt); ogl_dll
+glColor4d: procedure (red, green, blue, alpha: Double); ogl_dll
+glColor4f: procedure (red, green, blue, alpha: Single); ogl_dll
+glColor4i: procedure (red, green, blue, alpha: LongInt); ogl_dll
+glColor4s: procedure (red, green, blue, alpha: SmallInt); ogl_dll
+glColor4ub: procedure(red, green, blue, alpha: Byte); ogl_dll
+glColor4ui: procedure(red, green, blue, alpha: LongWord); ogl_dll
+glColor4us: procedure(red, green, blue, alpha: Word); ogl_dll
+glColor3bv: procedure (var v: ShortInt); ogl_dll
+glColor3dv: procedure (var v: Double); ogl_dll
+glColor3fv: procedure (var v: Single); ogl_dll
+glColor3iv: procedure (var v: LongInt); ogl_dll
+glColor3sv: procedure (var v: SmallInt); ogl_dll
+glColor3ubv: procedure(var v: Byte); ogl_dll
+glColor3uiv: procedure(var v: LongWord); ogl_dll
+glColor3usv: procedure(var v: Word); ogl_dll
+glColor4bv: procedure (var v: ShortInt); ogl_dll
+glColor4dv: procedure (var v: Double); ogl_dll
+glColor4fv: procedure (var v: Single); ogl_dll
+glColor4iv: procedure (var v: LongInt); ogl_dll
+glColor4sv: procedure (var v: SmallInt); ogl_dll
+glColor4ubv: procedure(var v: Byte); ogl_dll
+glColor4uiv: procedure(var v: LongWord); ogl_dll
+glColor4usv: procedure(var v: Word); ogl_dll
+glTexCoord1d: procedure(s: Double); ogl_dll
+glTexCoord1f: procedure(s: Single); ogl_dll
+glTexCoord1i: procedure(s: LongInt); ogl_dll
+glTexCoord1s: procedure(s: SmallInt); ogl_dll
+glTexCoord2d: procedure(s, t: Double); ogl_dll
+glTexCoord2f: procedure(s, t: Single); ogl_dll
+glTexCoord2i: procedure(s, t: LongInt); ogl_dll
+glTexCoord2s: procedure(s, t: SmallInt); ogl_dll
+glTexCoord3d: procedure(s, t, r: Double); ogl_dll
+glTexCoord3f: procedure(s, t, r: Single); ogl_dll
+glTexCoord3i: procedure(s, t, r: LongInt); ogl_dll
+glTexCoord3s: procedure(s, t, r: SmallInt); ogl_dll
+glTexCoord4d: procedure(s, t, r, q: Double); ogl_dll
+glTexCoord4f: procedure(s, t, r, q: Single); ogl_dll
+glTexCoord4i: procedure(s, t, r, q: LongInt); ogl_dll
+glTexCoord4s: procedure(s, t, r, q: SmallInt); ogl_dll
+glTexCoord1dv: procedure(var v: Double); ogl_dll
+glTexCoord1fv: procedure(var v: Single); ogl_dll
+glTexCoord1iv: procedure(var v: LongInt); ogl_dll
+glTexCoord1sv: procedure(var v: SmallInt); ogl_dll
+glTexCoord2dv: procedure(var v: Double); ogl_dll
+glTexCoord2fv: procedure(var v: Single); ogl_dll
+glTexCoord2iv: procedure(var v: LongInt); ogl_dll
+glTexCoord2sv: procedure(var v: SmallInt); ogl_dll
+glTexCoord3dv: procedure(var v: Double); ogl_dll
+glTexCoord3fv: procedure(var v: Single); ogl_dll
+glTexCoord3iv: procedure(var v: LongInt); ogl_dll
+glTexCoord3sv: procedure(var v: SmallInt); ogl_dll
+glTexCoord4dv: procedure(var v: Double); ogl_dll
+glTexCoord4fv: procedure(var v: Single); ogl_dll
+glTexCoord4iv: procedure(var v: LongInt); ogl_dll
+glTexCoord4sv: procedure(var v: SmallInt); ogl_dll
+glRasterPos2d: procedure(x, y: Double); ogl_dll
+glRasterPos2f: procedure(x, y: Single); ogl_dll
+glRasterPos2i: procedure(x, y: LongInt); ogl_dll
+glRasterPos2s: procedure(x, y: SmallInt); ogl_dll
+glRasterPos3d: procedure(x, y, z: Double); ogl_dll
+glRasterPos3f: procedure(x, y, z: Single); ogl_dll
+glRasterPos3i: procedure(x, y, z: LongInt); ogl_dll
+glRasterPos3s: procedure(x, y, z: SmallInt); ogl_dll
+glRasterPos4d: procedure(x, y, z, w: Double); ogl_dll
+glRasterPos4f: procedure(x, y, z, w: Single); ogl_dll
+glRasterPos4i: procedure(x, y, z, w: LongInt); ogl_dll
+glRasterPos4s: procedure(x, y, z, w: SmallInt); ogl_dll
+glRasterPos2dv: procedure(var v: Double); ogl_dll
+glRasterPos2fv: procedure(var v: Single); ogl_dll
+glRasterPos2iv: procedure(var v: LongInt); ogl_dll
+glRasterPos2sv: procedure(var v: SmallInt); ogl_dll
+glRasterPos3dv: procedure(var v: Double); ogl_dll
+glRasterPos3fv: procedure(var v: Single); ogl_dll
+glRasterPos3iv: procedure(var v: LongInt); ogl_dll
+glRasterPos3sv: procedure(var v: SmallInt); ogl_dll
+glRasterPos4dv: procedure(var v: Double); ogl_dll
+glRasterPos4fv: procedure(var v: Single); ogl_dll
+glRasterPos4iv: procedure(var v: LongInt); ogl_dll
+glRasterPos4sv: procedure(var v: SmallInt); ogl_dll
+glRectd: procedure(x1, y1, x2, y2: Double); ogl_dll
+glRectf: procedure(x1, y1, x2, y2: Single); ogl_dll
+glRecti: procedure(x1, y1, x2, y2: LongInt); ogl_dll
+glRects: procedure(x1, y1, x2, y2: SmallInt); ogl_dll
+glRectdv: procedure(var v1, v2: Double); ogl_dll
+glRectfv: procedure(var v1, v2: Single); ogl_dll
+glRectiv: procedure(var v1, v2: LongInt); ogl_dll
+glRectsv: procedure(var v1, v2: SmallInt); ogl_dll
+
+// Lighting
+glShadeModel: procedure(mode: GLenum); ogl_dll
+glLightf: procedure(light, pname: GLenum; param: Single); ogl_dll
+glLighti: procedure(light, pname: GLenum; param: LongInt); ogl_dll
+glLightfv: procedure(light, pname: GLenum; params : PSingle); ogl_dll
+glLightiv: procedure(light, pname: GLenum; params : PLongInt); ogl_dll
+glGetLightfv: procedure(light, pname: GLenum; params : PSingle); ogl_dll
+glGetLightiv: procedure(light, pname: GLenum; params : PLongInt); ogl_dll
+glLightModelf: procedure(pname: GLenum; param: Single); ogl_dll
+glLightModeli: procedure(pname: GLenum; param: LongInt); ogl_dll
+glLightModelfv: procedure(pname: GLenum; params : PSingle); ogl_dll
+glLightModeliv: procedure(pname: GLenum; params : PLongInt); ogl_dll
+glMaterialf: procedure(face, pname: GLenum; param: Single); ogl_dll
+glMateriali: procedure(face, pname: GLenum; param: LongInt); ogl_dll
+glMaterialfv: procedure(face, pname: GLenum; params : PSingle); ogl_dll
+glMaterialiv: procedure(face, pname: GLenum; params : PLongInt); ogl_dll
+glGetMaterialfv: procedure(face, pname: GLenum; params : PSingle); ogl_dll
+glGetMaterialiv: procedure(face, pname: GLenum; params : PLongInt); ogl_dll
+glColorMaterial: procedure(face, mode: GLenum); ogl_dll
+
+// Raster Functions
+glPixelZoom: procedure(xfactor, yfactor: Single); ogl_dll
+glPixelStoref: procedure(pname: GLenum; param: Single); ogl_dll
+glPixelStorei: procedure(pname: GLenum; param: LongInt); ogl_dll
+glPixelTransferf: procedure(pname: GLenum; param: Single); ogl_dll
+glPixelTransferi: procedure(pname: GLenum; param: LongInt); ogl_dll
+glPixelMapfv: procedure(map: GLenum; mapsize: LongInt; var values: Single); ogl_dll
+glPixelMapuiv: procedure(map: GLenum; mapsize: LongInt; var values: LongWord); ogl_dll
+glPixelMapusv: procedure(map: GLenum; mapsize: LongInt; var values: Word); ogl_dll
+glGetPixelMapfv: procedure(map: GLenum; var values: Single); ogl_dll
+glGetPixelMapuiv: procedure(map: GLenum; var values: LongWord); ogl_dll
+glGetPixelMapusv: procedure(map: GLenum; var values: Word); ogl_dll
+glBitmap: procedure(width, height: LongInt; xorig, yorig, xmove, ymove: Single; var bitmap); ogl_dll
+glReadPixels: procedure(x, y, width, height: LongInt; format, AType: GLenum; var pixels); ogl_dll
+glDrawPixels: procedure(width, height: LongInt; format, AType: GLenum; var pixels); ogl_dll
+glCopyPixels: procedure(x, y, width, height: LongInt; AType: GLenum); ogl_dll
+
+// Stenciling
+glStencilFunc: procedure(func: GLenum; ref: LongInt; mask: LongWord); ogl_dll
+glStencilMask: procedure(mask: LongWord); ogl_dll
+glStencilOp: procedure(fail, zfail, zpass: GLenum); ogl_dll
+glClearStencil: procedure(s: LongInt); ogl_dll
+
+// Texture Mapping
+glTexGend: procedure(cord, pname: GLenum; param: Double); ogl_dll
+glTexGenf: procedure(cord, pname: GLenum; param: Single); ogl_dll
+glTexGeni: procedure(cord, pname: GLenum; param: LongInt); ogl_dll
+glTexGendv: procedure(cord, pname: GLenum; params : PDouble); ogl_dll
+glTexGenfv: procedure(cord, pname: GLenum; params : PSingle); ogl_dll
+glTexGeniv: procedure(cord, pname: GLenum; params : PLongInt); ogl_dll
+glGetTexGendv: procedure(cord, pname: GLenum; params : PDouble); ogl_dll
+glGetTexGenfv: procedure(cord, pname: GLenum; params : PSingle); ogl_dll
+glGetTexGeniv: procedure(cord, pname: GLenum; params : PLongInt); ogl_dll
+glTexEnvf: procedure(target, pname: GLenum; param: Single); ogl_dll
+glTexEnvi: procedure(target, pname: GLenum; param: LongInt); ogl_dll
+glTexEnvfv: procedure(target, pname: GLenum; params : PSingle); ogl_dll
+glTexEnviv: procedure(target, pname: GLenum; params : PLongInt); ogl_dll
+glGetTexEnvfv: procedure(target, pname: GLenum; params : PSingle); ogl_dll
+glGetTexEnviv: procedure(target, pname: GLenum; params : PLongInt); ogl_dll
+glTexParameterf: procedure(target, pname: GLenum; param: Single); ogl_dll
+glTexParameteri: procedure(target, pname: GLenum; param: LongInt); ogl_dll
+glTexParameterfv: procedure(target, pname: GLenum; params : PSingle); ogl_dll
+glTexParameteriv: procedure(target, pname: GLenum; params : PLongInt); ogl_dll
+glGetTexParameterfv: procedure(target, pname: GLenum; params : PSingle); ogl_dll
+glGetTexParameteriv: procedure(target, pname: GLenum; params : PLongInt); ogl_dll
+glGetTexLevelParameterfv: procedure(target: GLenum; level: LongInt; pname: GLenum; params : PSingle); ogl_dll
+glGetTexLevelParameteriv: procedure(target: GLenum; level: LongInt; pname: GLenum; params : PLongInt); ogl_dll
+glTexImage1D: procedure(target: GLenum; level, internalFormat, width, border: LongInt; format, AType: GLenum; var pixels); ogl_dll
+glTexImage2D: procedure(target: GLenum; level, internalFormat, width, height, border: LongInt; format, AType: GLenum; var pixels); ogl_dll
+glGetTexImage: procedure(target: GLenum; level: LongInt; format, AType: GLenum; var pixels); ogl_dll
+
+// Evaluators
+glMap1d: procedure(target: GLenum; u1, u2: Double; stride, order: LongInt; var points: Double); ogl_dll
+glMap1f: procedure(target: GLenum; u1, u2: Single; stride, order: LongInt; var points: Single); ogl_dll
+glMap2d: procedure(target: GLenum; u1, u2: Double; ustride, uorder: LongInt; v1, v2: Double; vstride, vorder: LongInt; var points: Double); ogl_dll
+glMap2f: procedure(target: GLenum; u1, u2: Single; ustride, uorder: LongInt; v1, v2: Single; vstride, vorder: LongInt; var points: Single); ogl_dll
+glGetMapdv: procedure(target, query: GLenum; var v: Double); ogl_dll
+glGetMapfv: procedure(target, query: GLenum; var v: Single); ogl_dll
+glGetMapiv: procedure(target, query: GLenum; var v: LongInt); ogl_dll
+glEvalCoord1d: procedure(u: Double); ogl_dll
+glEvalCoord1f: procedure(u: Single); ogl_dll
+glEvalCoord1dv: procedure(var u: Double); ogl_dll
+glEvalCoord1fv: procedure(var u: Single); ogl_dll
+glEvalCoord2d: procedure(u, v: Double); ogl_dll
+glEvalCoord2f: procedure(u, v: Single); ogl_dll
+glEvalCoord2dv: procedure(var u, v: Double); ogl_dll
+glEvalCoord2fv: procedure(var u, v: Single); ogl_dll
+glMapGrid1d: procedure(un: LongInt; u1, u2: Double); ogl_dll
+glMapGrid1f: procedure(un: LongInt; u1, u2: Single); ogl_dll
+glMapGrid2d: procedure(un: LongInt; u1, u2: Double; vn: LongInt; v1, v2: Double); ogl_dll
+glMapGrid2f: procedure(un: LongInt; u1, u2: Single; vn: LongInt; v1, v2: Single); ogl_dll
+glEvalPoint1: procedure(i: LongInt); ogl_dll
+glEvalPoint2: procedure(i, j: LongInt); ogl_dll
+glEvalMesh1: procedure(mode: GLenum; i1, i2: LongInt); ogl_dll
+glEvalMesh2: procedure(mode: GLenum; i1, i2, j1, j2: LongInt); ogl_dll
+
+// Fog
+glFogf: procedure(pname: GLenum; param: Single); ogl_dll
+glFogi: procedure(pname: GLenum; param: LongInt); ogl_dll
+glFogfv: procedure(pname: GLenum; params : PSingle); ogl_dll
+glFogiv: procedure(pname: GLenum; params : PLongInt); ogl_dll
+
+// Selection and Feedback
+glFeedbackBuffer: procedure(size: LongInt; AType: GLenum; var buffer: Single); ogl_dll
+glPassThrough: procedure(token: Single); ogl_dll
+glSelectBuffer: procedure(size: LongInt; var buffer: LongWord); ogl_dll
+glInitNames: procedure; ogl_dll
+glLoadName: procedure(name: LongWord); ogl_dll
+glPushName: procedure(name: LongWord); ogl_dll
+glPopName: procedure; ogl_dll
+
+{$ENDIF GL1_0}
+
+{$IFDEF GL1_1}
+var
+
+// Miscellaneous
+glEnableClientState: procedure(cap: GLenum); ogl_dll
+glDisableClientState: procedure(cap: GLenum); ogl_dll
+glPushClientAttrib: procedure(mask: GLbitfield); ogl_dll
+glPopClientAttrib: procedure; ogl_dll
+
+// Drawing Functions
+glIndexub: procedure(c: Byte); ogl_dll
+glIndexubv: procedure(var c: Byte); ogl_dll
+
+// Vertex Arrays
+glVertexPointer: procedure(size: LongInt; AType: GLenum; stride: LongInt; var ptr); ogl_dll
+glNormalPointer: procedure(AType: GLenum; stride: LongInt; var ptr); ogl_dll
+glColorPointer: procedure(size: LongInt; AType: GLenum; stride: LongInt; var ptr); ogl_dll
+glIndexPointer: procedure(AType: GLenum; stride: LongInt; var ptr); ogl_dll
+glTexCoordPointer: procedure(size: LongInt; AType: GLenum; stride: LongInt; var ptr); ogl_dll
+glEdgeFlagPointer: procedure(stride: LongInt; var ptr); ogl_dll
+glGetPointerv: procedure(pname: GLenum; var params: Pointer); ogl_dll
+glArrayElement: procedure(i: LongInt); ogl_dll
+glDrawArrays: procedure(mode: GLenum; first, count: LongInt); ogl_dll
+glDrawElements: procedure(mode: GLenum; count: Integer; AType: GLenum; var indices); ogl_dll
+glInterleavedArrays: procedure(format: GLenum; stride: LongInt; var pointer); ogl_dll
+
+// Texture Mapping
+glGenTextures: procedure(n: LongInt; var textures: LongWord); ogl_dll
+glDeleteTextures: procedure(n: LongInt; var textures: LongWord); ogl_dll
+glBindTexture: procedure(target: GLenum; texture: LongWord); ogl_dll
+glPrioritizeTextures: procedure(n: LongInt; var textures: LongWord; var priorities: GLclampf); ogl_dll
+glAreTexturesResident: function(n: LongInt; var textures: LongWord; var residences: Boolean): Boolean; ogl_dll
+glIsTexture: function(texture: LongWord): Boolean; ogl_dll
+glTexSubImage1D: procedure(target: GLenum; level, xoffset, width: LongInt; format, AType: GLenum; var pixels); ogl_dll
+glTexSubImage2D: procedure(target: GLenum; level, xoffset, yoffset, width, height: LongInt; format, AType: GLenum; var pixels); ogl_dll
+glCopyTexImage1D: procedure(target: GLenum; level: LongInt; format: GLenum; x, y, width, border: LongInt); ogl_dll
+glCopyTexImage2D: procedure(target: GLenum; level: LongInt; format: GLenum; x, y, width, height, border: LongInt); ogl_dll
+glCopyTexSubImage1D: procedure(target: GLenum; level, xoffset, x, y, width: LongInt); ogl_dll
+glCopyTexSubImage2D: procedure(target: GLenum; level, xoffset, yoffset, x, y, width, height: LongInt); ogl_dll
+
+{$ENDIF GL1_1}
+
+{$IFDEF GL1_2}
+var
+glDrawRangeElements: procedure(mode: GLenum; AStart, AEnd: LongWord; count: LongInt; AType: GLenum; var indices); ogl_dll
+glTexImage3D: procedure(target: GLenum; level: LongInt; internalFormat: GLenum; width, height, depth, border: LongInt; format, AType: GLEnum; var pixels); ogl_dll
+glTexSubImage3D: procedure(target: GLenum; level: LongInt; xoffset, yoffset, zoffset, width, height, depth: LongInt; format, AType: GLEnum; var pixels); ogl_dll
+glCopyTexSubImage3D: procedure(target: GLenum; level: LongInt; xoffset, yoffset, zoffset, x, y, width, height: LongInt); ogl_dll
+{$ENDIF GL1_2}
+
+
+// -------------------------------------------------------
+//   GL Extensions
+// -------------------------------------------------------
+
+{$IFDEF EXTENSIONS}
+var
+
+// === 1.0 Extensions ===
+
+// GL_EXT_blend_minmax
+glBlendEquationEXT: procedure(mode: GLenum); ogl_dll
+
+// GL_EXT_blend_color
+glBlendColorEXT: procedure(red, green, blue, alpha: GLclampf); ogl_dll
+
+// GL_EXT_polygon_offset
+glPolygonOffsetEXT: procedure(factor, bias: Single); ogl_dll
+
+// GL_EXT_vertex_array
+glVertexPointerEXT: procedure(size: LongInt; AType: GLenum; stride, count: LongInt; var ptr); ogl_dll
+glNormalPointerEXT: procedure(AType: GLenum; stride, count: LongInt; var ptr); ogl_dll
+glColorPointerEXT: procedure(size: LongInt; AType: GLenum; stride, count: LongInt; var ptr); ogl_dll
+glIndexPointerEXT: procedure(AType: GLenum; stride, count: LongInt; var ptr); ogl_dll
+glTexCoordPointerEXT: procedure(size: LongInt; AType: GLenum; stride, count: LongInt; var ptr); ogl_dll
+glEdgeFlagPointerEXT: procedure(stride, count: LongInt; var ptr: Boolean); ogl_dll
+glGetPointervEXT: procedure(pname: GLenum; var params: Pointer); ogl_dll
+glArrayElementEXT: procedure(i: LongInt); ogl_dll
+glDrawArraysEXT: procedure(mode: GLEnum; first, count: LongInt); ogl_dll
+
+// GL_EXT_texture_object
+glGenTexturesEXT: procedure(n: LongInt; var textures: LongWord); ogl_dll
+glDeleteTexturesEXT: procedure(n: LongInt; var textures: LongWord); ogl_dll
+glBindTextureEXT: procedure(target: GLenum; texture: LongWord); ogl_dll
+glPrioritizeTexturesEXT: procedure(n: LongInt; var textures: LongWord; var priorities: GLClampf); ogl_dll
+glAreTexturesResidentEXT: function(n: LongInt; var textures: LongWord; var residences: Boolean): Boolean; ogl_dll
+glIsTextureEXT: function(texture: LongWord): Boolean; ogl_dll
+
+// GL_EXT_texture3D
+glTexImage3DEXT: procedure(target: GLenum; level: LongInt; internalFormat: GLenum; width, height, depth, border: LongInt; format, AType: GLenum; var pixels); ogl_dll
+glTexSubImage3DEXT: procedure(target: GLenum; level, xoffset, yoffset, zoffset, width, height, depth: LongInt; format, AType: GLenum; var pixels); ogl_dll
+glCopyTexSubImage3DEXT: procedure(target: GLenum; level, xoffset, yoffset, zoffset, x, y, width, height: LongInt); ogl_dll
+
+// GL_EXT_color_table
+glColorTableEXT: procedure(target, internalformat: GLenum; width: LongInt; format, AType: GLenum; var table); ogl_dll
+glColorSubTableEXT: procedure(target: GLenum; start, count: LongInt; format, AType: GLEnum; var data); ogl_dll
+glGetColorTableEXT: procedure(target, format, AType: GLenum; var table); ogl_dll
+glGetColorTableParameterfvEXT: procedure(target, pname: GLenum; var params: Single); ogl_dll
+glGetColorTableParameterivEXT: procedure(target, pname: GLenum; var params: LongInt); ogl_dll
+
+{$ENDIF EXTENSIONS}
+
+// library dependent extensions
+
+{$IFDEF SGI_EXTENSIONS}
+var
+
+// GL_SGIS_multitexture
+glMultiTexCoord1dSGIS: procedure(target: GLenum; s: Double); ogl_dll
+glMultiTexCoord1dvSGIS: procedure(target: GLenum; var v: Double); ogl_dll
+glMultiTexCoord1fSGIS: procedure(target: GLenum; s: Single); ogl_dll
+glMultiTexCoord1fvSGIS: procedure(target: GLenum; var v: Single); ogl_dll
+glMultiTexCoord1iSGIS: procedure(target: GLenum; s: LongInt); ogl_dll
+glMultiTexCoord1ivSGIS: procedure(target: GLenum; var v: LongInt); ogl_dll
+glMultiTexCoord1sSGIS: procedure(target: GLenum; s: ShortInt); ogl_dll
+glMultiTexCoord1svSGIS: procedure(target: GLenum; var v: ShortInt); ogl_dll
+glMultiTexCoord2dSGIS: procedure(target: GLenum; s, t: Double); ogl_dll
+glMultiTexCoord2dvSGIS: procedure(target: GLenum; var v: Double); ogl_dll
+glMultiTexCoord2fSGIS: procedure(target: GLenum; s, t: Single); ogl_dll
+glMultiTexCoord2fvSGIS: procedure(target: GLenum; var v: Single); ogl_dll
+glMultiTexCoord2iSGIS: procedure(target: GLenum; s, t: LongInt); ogl_dll
+glMultiTexCoord2ivSGIS: procedure(target: GLenum; var v: LongInt); ogl_dll
+glMultiTexCoord2sSGIS: procedure(target: GLenum; s, t: ShortInt); ogl_dll
+glMultiTexCoord2svSGIS: procedure(target: GLenum; var v: ShortInt); ogl_dll
+glMultiTexCoord3dSGIS: procedure(target: GLenum; s, t, r: Double); ogl_dll
+glMultiTexCoord3dvSGIS: procedure(target: GLenum; var v: Double); ogl_dll
+glMultiTexCoord3fSGIS: procedure(target: GLenum; s, t, r: Single); ogl_dll
+glMultiTexCoord3fvSGIS: procedure(target: GLenum; var v: Single); ogl_dll
+glMultiTexCoord3iSGIS: procedure(target: GLenum; s, t, r: LongInt); ogl_dll
+glMultiTexCoord3ivSGIS: procedure(target: GLenum; var v: LongInt); ogl_dll
+glMultiTexCoord3sSGIS: procedure(target: GLenum; s, t, r: ShortInt); ogl_dll
+glMultiTexCoord3svSGIS: procedure(target: GLenum; var v: ShortInt); ogl_dll
+glMultiTexCoord4dSGIS: procedure(target: GLenum; s, t, r, q: Double); ogl_dll
+glMultiTexCoord4dvSGIS: procedure(target: GLenum; var v: Double); ogl_dll
+glMultiTexCoord4fSGIS: procedure(target: GLenum; s, t, r, q: Single); ogl_dll
+glMultiTexCoord4fvSGIS: procedure(target: GLenum; var v: Single); ogl_dll
+glMultiTexCoord4iSGIS: procedure(target: GLenum; s, t, r, q: LongInt); ogl_dll
+glMultiTexCoord4ivSGIS: procedure(target: GLenum; var v: LongInt); ogl_dll
+glMultiTexCoord4sSGIS: procedure(target: GLenum; s, t, r, q: ShortInt); ogl_dll
+glMultiTexCoord4svSGIS: procedure(target: GLenum; var v: ShortInt); ogl_dll
+glMultiTexCoordPointerSGIS: procedure(target: GLenum; size: LongInt; AType: GLEnum; stride: LongInt; var APointer); ogl_dll
+glSelectTextureSGIS: procedure(target: GLenum); ogl_dll
+glSelectTextureCoordSetSGIS: procedure(target: GLenum); ogl_dll
+
+// GL_EXT_multitexture
+glMultiTexCoord1dEXT: procedure(target: GLenum; s: Double); ogl_dll
+glMultiTexCoord1dvEXT: procedure(target: GLenum; var v: Double); ogl_dll
+glMultiTexCoord1fEXT: procedure(target: GLenum; s: Single); ogl_dll
+glMultiTexCoord1fvEXT: procedure(target: GLenum; var v: Single); ogl_dll
+glMultiTexCoord1iEXT: procedure(target: GLenum; s: LongInt); ogl_dll
+glMultiTexCoord1ivEXT: procedure(target: GLenum; var v: LongInt); ogl_dll
+glMultiTexCoord1sEXT: procedure(target: GLenum; s: ShortInt); ogl_dll
+glMultiTexCoord1svEXT: procedure(target: GLenum; var v: ShortInt); ogl_dll
+glMultiTexCoord2dEXT: procedure(target: GLenum; s, t: Double); ogl_dll
+glMultiTexCoord2dvEXT: procedure(target: GLenum; var v: Double); ogl_dll
+glMultiTexCoord2fEXT: procedure(target: GLenum; s, t: Single); ogl_dll
+glMultiTexCoord2fvEXT: procedure(target: GLenum; var v: Single); ogl_dll
+glMultiTexCoord2iEXT: procedure(target: GLenum; s, t: LongInt); ogl_dll
+glMultiTexCoord2ivEXT: procedure(target: GLenum; var v: LongInt); ogl_dll
+glMultiTexCoord2sEXT: procedure(target: GLenum; s, t: ShortInt); ogl_dll
+glMultiTexCoord2svEXT: procedure(target: GLenum; var v: ShortInt); ogl_dll
+glMultiTexCoord3dEXT: procedure(target: GLenum; s, t, r: Double); ogl_dll
+glMultiTexCoord3dvEXT: procedure(target: GLenum; var v: Double); ogl_dll
+glMultiTexCoord3fEXT: procedure(target: GLenum; s, t, r: Single); ogl_dll
+glMultiTexCoord3fvEXT: procedure(target: GLenum; var v: Single); ogl_dll
+glMultiTexCoord3iEXT: procedure(target: GLenum; s, t, r: LongInt); ogl_dll
+glMultiTexCoord3ivEXT: procedure(target: GLenum; var v: LongInt); ogl_dll
+glMultiTexCoord3sEXT: procedure(target: GLenum; s, t, r: ShortInt); ogl_dll
+glMultiTexCoord3svEXT: procedure(target: GLenum; var v: ShortInt); ogl_dll
+glMultiTexCoord4dEXT: procedure(target: GLenum; s, t, r, q: Double); ogl_dll
+glMultiTexCoord4dvEXT: procedure(target: GLenum; var v: Double); ogl_dll
+glMultiTexCoord4fEXT: procedure(target: GLenum; s, t, r, q: Single); ogl_dll
+glMultiTexCoord4fvEXT: procedure(target: GLenum; var v: Single); ogl_dll
+glMultiTexCoord4iEXT: procedure(target: GLenum; s, t, r, q: LongInt); ogl_dll
+glMultiTexCoord4ivEXT: procedure(target: GLenum; var v: LongInt); ogl_dll
+glMultiTexCoord4sEXT: procedure(target: GLenum; s, t, r, q: ShortInt); ogl_dll
+glMultiTexCoord4svEXT: procedure(target: GLenum; var v: ShortInt); ogl_dll
+glInterleavedTextureCoordSetsEXT: procedure(factor: LongInt); ogl_dll
+glSelectTextureEXT: procedure(target: GLenum); ogl_dll
+glSelectTextureCoordSetEXT: procedure(target: GLenum); ogl_dll
+glSelectTextureTransformEXT: procedure(target: GLenum); ogl_dll
+
+// GL_EXT_point_parameters
+glPointParameterfEXT: procedure(pname: GLenum; param: Single); ogl_dll
+glPointParameterfvEXT: procedure(pname: GLenum; var params: Single); ogl_dll
+
+{$ENDIF SGI_EXTENSIONS}
+
+{$ifdef MESA}
+var
+// GL_MESA_window_pos
+glWindowPos2iMESA: procedure(x, y: LongInt); ogl_dll
+glWindowPos2sMESA: procedure(x, y: ShortInt); ogl_dll
+glWindowPos2fMESA: procedure(x, y: Single); ogl_dll
+glWindowPos2dMESA: procedure(x, y: Double); ogl_dll
+glWindowPos2ivMESA: procedure(var p: LongInt); ogl_dll
+glWindowPos2svMESA: procedure(var p: ShortInt); ogl_dll
+glWindowPos2fvMESA: procedure(var p: Single); ogl_dll
+glWindowPos2dvMESA: procedure(var p: Double); ogl_dll
+glWindowPos3iMESA: procedure(x, y, z: LongInt); ogl_dll
+glWindowPos3sMESA: procedure(x, y, z: ShortInt); ogl_dll
+glWindowPos3fMESA: procedure(x, y, z: Single); ogl_dll
+glWindowPos3dMESA: procedure(x, y, z: Double); ogl_dll
+glWindowPos3ivMESA: procedure(var p: LongInt); ogl_dll
+glWindowPos3svMESA: procedure(var p: ShortInt); ogl_dll
+glWindowPos3fvMESA: procedure(var p: Single); ogl_dll
+glWindowPos3dvMESA: procedure(var p: Double); ogl_dll
+glWindowPos4iMESA: procedure(x, y, z, w: LongInt); ogl_dll
+glWindowPos4sMESA: procedure(x, y, z, w: ShortInt); ogl_dll
+glWindowPos4fMESA: procedure(x, y, z, w: Single); ogl_dll
+glWindowPos4dMESA: procedure(x, y, z, w: Double); ogl_dll
+glWindowPos4ivMESA: procedure(var p: LongInt); ogl_dll
+glWindowPos4svMESA: procedure(var p: ShortInt); ogl_dll
+glWindowPos4fvMESA: procedure(var p: Single); ogl_dll
+glWindowPos4dvMESA: procedure(var p: Double); ogl_dll
+
+// GL_MESA_resize_buffers
+glResizeBuffersMESA: procedure; ogl_dll
+{$endif MESA}
+
+
+// =======================================================
+// =======================================================
+
+implementation
+
+type
+  HInstance = LongWord;
+
+var
+  libGL : HInstance;
+
+function GetProc(handle: HInstance; name: PChar): Pointer;
+begin
+  Result := GetProcAddress(handle, name);
+  if (Result = nil) and GLUDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+function InitGLFromLibrary(libname: PChar): Boolean;
+begin
+  Result := False;
+  libGL := LoadLibrary(libname);
+  if libGL = 0 then exit;
+
+{$ifdef GL1_0}
+// Miscellaneous
+  glClearIndex := GetProc(libGL, 'glClearIndex');
+  glClearColor := GetProc(libGL, 'glClearColor');
+  glClear := GetProc(libGL, 'glClear');
+  glIndexMask := GetProc(libGL, 'glIndexMask');
+  glColorMask := GetProc(libGL, 'glColorMask');
+  glAlphaFunc := GetProc(libGL, 'glAlphaFunc');
+  glBlendFunc := GetProc(libGL, 'glBlendFunc');
+  glLogicOp := GetProc(libGL, 'glLogicOp');
+  glCullFace := GetProc(libGL, 'glCullFace');
+  glFrontFace := GetProc(libGL, 'glFrontFace');
+  glPointSize := GetProc(libGL, 'glPointSize');
+  glLineWidth := GetProc(libGL, 'glLineWidth');
+  glLineStipple := GetProc(libGL, 'glLineStipple');
+  glPolygonMode := GetProc(libGL, 'glPolygonMode');
+  glPolygonOffset := GetProc(libGL, 'glPolygonOffset');
+  glPolygonStipple := GetProc(libGL, 'glPolygonStipple');
+  glGetPolygonStipple := GetProc(libGL, 'glGetPolygonStipple');
+  glEdgeFlag := GetProc(libGL, 'glEdgeFlag');
+  glEdgeFlagv := GetProc(libGL, 'glEdgeFlagv');
+  glScissor := GetProc(libGL, 'glScissor');
+  glClipPlane := GetProc(libGL, 'glClipPlane');
+  glGetClipPlane := GetProc(libGL, 'glGetClipPlane');
+  glDrawBuffer := GetProc(libGL, 'glDrawBuffer');
+  glReadBuffer := GetProc(libGL, 'glReadBuffer');
+  glEnable := GetProc(libGL, 'glEnable');
+  glDisable := GetProc(libGL, 'glDisable');
+  glIsEnabled := GetProc(libGL, 'glIsEnabled');
+  glGetBooleanv := GetProc(libGL, 'glGetBooleanv');
+  glGetDoublev := GetProc(libGL, 'glGetDoublev');
+  glGetFloatv := GetProc(libGL, 'glGetFloatv');
+  glGetIntegerv := GetProc(libGL, 'glGetIntegerv');
+  glPushAttrib := GetProc(libGL, 'glPushAttrib');
+  glPopAttrib := GetProc(libGL, 'glPopAttrib');
+  glRenderMode := GetProc(libGL, 'glRenderMode');
+  glGetError := GetProc(libGL, 'glGetError');
+  glGetString := GetProc(libGL, 'glGetString');
+  glFinish := GetProc(libGL, 'glFinish');
+  glFlush := GetProc(libGL, 'glFlush');
+  glHint := GetProc(libGL, 'glHint');
+// Depth Buffer
+  glClearDepth := GetProc(libGL, 'glClearDepth');
+  glDepthFunc := GetProc(libGL, 'glDepthFunc');
+  glDepthMask := GetProc(libGL, 'glDepthMask');
+  glDepthRange := GetProc(libGL, 'glDepthRange');
+// Accumulation Buffer
+  glClearAccum := GetProc(libGL, 'glClearAccum');
+  glAccum := GetProc(libGL, 'glAccum');
+// Tranformation
+  glMatrixMode := GetProc(libGL, 'glMatrixMode');
+  glOrtho := GetProc(libGL, 'glOrtho');
+  glFrustum := GetProc(libGL, 'glFrustum');
+  glViewport := GetProc(libGL, 'glViewport');
+  glPushMatrix := GetProc(libGL, 'glPushMatrix');
+  glPopMatrix := GetProc(libGL, 'glPopMatrix');
+  glLoadIdentity := GetProc(libGL, 'glLoadIdentity');
+  glLoadMatrixd := GetProc(libGL, 'glLoadMatrixd');
+  glLoadMatrixf := GetProc(libGL, 'glLoadMatrixf');
+  glMultMatrixd := GetProc(libGL, 'glMultMatrixd');
+  glMultMatrixf := GetProc(libGL, 'glMultMatrixf');
+  glRotated := GetProc(libGL, 'glRotated');
+  glRotatef := GetProc(libGL, 'glRotatef');
+  glScaled := GetProc(libGL, 'glScaled');
+  glScalef := GetProc(libGL, 'glScalef');
+  glTranslated := GetProc(libGL, 'glTranslated');
+  glTranslatef := GetProc(libGL, 'glTranslatef');
+// Display Lists
+  glIsList := GetProc(libGL, 'glIsList');
+  glDeleteLists := GetProc(libGL, 'glDeleteLists');
+  glGenLists := GetProc(libGL, 'glGenLists');
+  glNewList := GetProc(libGL, 'glNewList');
+  glEndList := GetProc(libGL, 'glEndList');
+  glCallList := GetProc(libGL, 'glCallList');
+  glCallLists := GetProc(libGL, 'glCallLists');
+  glListBase := GetProc(libGL, 'glListBase');
+// Drawing Functions
+  glBegin := GetProc(libGL, 'glBegin');
+  glEnd := GetProc(libGL, 'glEnd');
+  glVertex2d := GetProc(libGL, 'glVertex2d');
+  glVertex2f := GetProc(libGL, 'glVertex2f');
+  glVertex2i := GetProc(libGL, 'glVertex2i');
+  glVertex2s := GetProc(libGL, 'glVertex2s');
+  glVertex3d := GetProc(libGL, 'glVertex3d');
+  glVertex3f := GetProc(libGL, 'glVertex3f');
+  glVertex3i := GetProc(libGL, 'glVertex3i');
+  glVertex3s := GetProc(libGL, 'glVertex3s');
+  glVertex4d := GetProc(libGL, 'glVertex4d');
+  glVertex4f := GetProc(libGL, 'glVertex4f');
+  glVertex4i := GetProc(libGL, 'glVertex4i');
+  glVertex4s := GetProc(libGL, 'glVertex4s');
+  glVertex2dv := GetProc(libGL, 'glVertex2dv');
+  glVertex2fv := GetProc(libGL, 'glVertex2fv');
+  glVertex2iv := GetProc(libGL, 'glVertex2iv');
+  glVertex2sv := GetProc(libGL, 'glVertex2sv');
+  glVertex3dv := GetProc(libGL, 'glVertex3dv');
+  glVertex3fv := GetProc(libGL, 'glVertex3fv');
+  glVertex3iv := GetProc(libGL, 'glVertex3iv');
+  glVertex3sv := GetProc(libGL, 'glVertex3sv');
+  glVertex4dv := GetProc(libGL, 'glVertex4dv');
+  glVertex4fv := GetProc(libGL, 'glVertex4fv');
+  glVertex4iv := GetProc(libGL, 'glVertex4iv');
+  glVertex4sv := GetProc(libGL, 'glVertex4sv');
+  glNormal3b := GetProc(libGL, 'glNormal3b');
+  glNormal3d := GetProc(libGL, 'glNormal3d');
+  glNormal3f := GetProc(libGL, 'glNormal3f');
+  glNormal3i := GetProc(libGL, 'glNormal3i');
+  glNormal3s := GetProc(libGL, 'glNormal3s');
+  glNormal3bv := GetProc(libGL, 'glNormal3bv');
+  glNormal3dv := GetProc(libGL, 'glNormal3dv');
+  glNormal3fv := GetProc(libGL, 'glNormal3fv');
+  glNormal3iv := GetProc(libGL, 'glNormal3iv');
+  glNormal3sv := GetProc(libGL, 'glNormal3sv');
+  glIndexd := GetProc(libGL, 'glIndexd');
+  glIndexf := GetProc(libGL, 'glIndexf');
+  glIndexi := GetProc(libGL, 'glIndexi');
+  glIndexs := GetProc(libGL, 'glIndexs');
+  glIndexdv := GetProc(libGL, 'glIndexdv');
+  glIndexfv := GetProc(libGL, 'glIndexfv');
+  glIndexiv := GetProc(libGL, 'glIndexiv');
+  glIndexsv := GetProc(libGL, 'glIndexsv');
+  glColor3b := GetProc(libGL, 'glColor3b');
+  glColor3d := GetProc(libGL, 'glColor3d');
+  glColor3f := GetProc(libGL, 'glColor3f');
+  glColor3i := GetProc(libGL, 'glColor3i');
+  glColor3s := GetProc(libGL, 'glColor3s');
+  glColor3ub := GetProc(libGL, 'glColor3ub');
+  glColor3ui := GetProc(libGL, 'glColor3ui');
+  glColor3us := GetProc(libGL, 'glColor3us');
+  glColor4b := GetProc(libGL, 'glColor4b');
+  glColor4d := GetProc(libGL, 'glColor4d');
+  glColor4f := GetProc(libGL, 'glColor4f');
+  glColor4i := GetProc(libGL, 'glColor4i');
+  glColor4s := GetProc(libGL, 'glColor4s');
+  glColor4ub := GetProc(libGL, 'glColor4ub');
+  glColor4ui := GetProc(libGL, 'glColor4ui');
+  glColor4us := GetProc(libGL, 'glColor4us');
+  glColor3bv := GetProc(libGL, 'glColor3bv');
+  glColor3dv := GetProc(libGL, 'glColor3dv');
+  glColor3fv := GetProc(libGL, 'glColor3fv');
+  glColor3iv := GetProc(libGL, 'glColor3iv');
+  glColor3sv := GetProc(libGL, 'glColor3sv');
+  glColor3ubv := GetProc(libGL, 'glColor3ubv');
+  glColor3uiv := GetProc(libGL, 'glColor3uiv');
+  glColor3usv := GetProc(libGL, 'glColor3usv');
+  glColor4bv := GetProc(libGL, 'glColor4bv');
+  glColor4dv := GetProc(libGL, 'glColor4dv');
+  glColor4fv := GetProc(libGL, 'glColor4fv');
+  glColor4iv := GetProc(libGL, 'glColor4iv');
+  glColor4sv := GetProc(libGL, 'glColor4sv');
+  glColor4ubv := GetProc(libGL, 'glColor4ubv');
+  glColor4uiv := GetProc(libGL, 'glColor4uiv');
+  glColor4usv := GetProc(libGL, 'glColor4usv');
+  glTexCoord1d := GetProc(libGL, 'glTexCoord1d');
+  glTexCoord1f := GetProc(libGL, 'glTexCoord1f');
+  glTexCoord1i := GetProc(libGL, 'glTexCoord1i');
+  glTexCoord1s := GetProc(libGL, 'glTexCoord1s');
+  glTexCoord2d := GetProc(libGL, 'glTexCoord2d');
+  glTexCoord2f := GetProc(libGL, 'glTexCoord2f');
+  glTexCoord2i := GetProc(libGL, 'glTexCoord2i');
+  glTexCoord2s := GetProc(libGL, 'glTexCoord2s');
+  glTexCoord3d := GetProc(libGL, 'glTexCoord3d');
+  glTexCoord3f := GetProc(libGL, 'glTexCoord3f');
+  glTexCoord3i := GetProc(libGL, 'glTexCoord3i');
+  glTexCoord3s := GetProc(libGL, 'glTexCoord3s');
+  glTexCoord4d := GetProc(libGL, 'glTexCoord4d');
+  glTexCoord4f := GetProc(libGL, 'glTexCoord4f');
+  glTexCoord4i := GetProc(libGL, 'glTexCoord4i');
+  glTexCoord4s := GetProc(libGL, 'glTexCoord4s');
+  glTexCoord1dv := GetProc(libGL, 'glTexCoord1dv');
+  glTexCoord1fv := GetProc(libGL, 'glTexCoord1fv');
+  glTexCoord1iv := GetProc(libGL, 'glTexCoord1iv');
+  glTexCoord1sv := GetProc(libGL, 'glTexCoord1sv');
+  glTexCoord2dv := GetProc(libGL, 'glTexCoord2dv');
+  glTexCoord2fv := GetProc(libGL, 'glTexCoord2fv');
+  glTexCoord2iv := GetProc(libGL, 'glTexCoord2iv');
+  glTexCoord2sv := GetProc(libGL, 'glTexCoord2sv');
+  glTexCoord3dv := GetProc(libGL, 'glTexCoord3dv');
+  glTexCoord3fv := GetProc(libGL, 'glTexCoord3fv');
+  glTexCoord3iv := GetProc(libGL, 'glTexCoord3iv');
+  glTexCoord3sv := GetProc(libGL, 'glTexCoord3sv');
+  glTexCoord4dv := GetProc(libGL, 'glTexCoord4dv');
+  glTexCoord4fv := GetProc(libGL, 'glTexCoord4fv');
+  glTexCoord4iv := GetProc(libGL, 'glTexCoord4iv');
+  glTexCoord4sv := GetProc(libGL, 'glTexCoord4sv');
+  glRasterPos2d := GetProc(libGL, 'glRasterPos2d');
+  glRasterPos2f := GetProc(libGL, 'glRasterPos2f');
+  glRasterPos2i := GetProc(libGL, 'glRasterPos2i');
+  glRasterPos2s := GetProc(libGL, 'glRasterPos2s');
+  glRasterPos3d := GetProc(libGL, 'glRasterPos3d');
+  glRasterPos3f := GetProc(libGL, 'glRasterPos3f');
+  glRasterPos3i := GetProc(libGL, 'glRasterPos3i');
+  glRasterPos3s := GetProc(libGL, 'glRasterPos3s');
+  glRasterPos4d := GetProc(libGL, 'glRasterPos4d');
+  glRasterPos4f := GetProc(libGL, 'glRasterPos4f');
+  glRasterPos4i := GetProc(libGL, 'glRasterPos4i');
+  glRasterPos4s := GetProc(libGL, 'glRasterPos4s');
+  glRasterPos2dv := GetProc(libGL, 'glRasterPos2dv');
+  glRasterPos2fv := GetProc(libGL, 'glRasterPos2fv');
+  glRasterPos2iv := GetProc(libGL, 'glRasterPos2iv');
+  glRasterPos2sv := GetProc(libGL, 'glRasterPos2sv');
+  glRasterPos3dv := GetProc(libGL, 'glRasterPos3dv');
+  glRasterPos3fv := GetProc(libGL, 'glRasterPos3fv');
+  glRasterPos3iv := GetProc(libGL, 'glRasterPos3iv');
+  glRasterPos3sv := GetProc(libGL, 'glRasterPos3sv');
+  glRasterPos4dv := GetProc(libGL, 'glRasterPos4dv');
+  glRasterPos4fv := GetProc(libGL, 'glRasterPos4fv');
+  glRasterPos4iv := GetProc(libGL, 'glRasterPos4iv');
+  glRasterPos4sv := GetProc(libGL, 'glRasterPos4sv');
+  glRectd := GetProc(libGL, 'glRectd');
+  glRectf := GetProc(libGL, 'glRectf');
+  glRecti := GetProc(libGL, 'glRecti');
+  glRects := GetProc(libGL, 'glRects');
+  glRectdv := GetProc(libGL, 'glRectdv');
+  glRectfv := GetProc(libGL, 'glRectfv');
+  glRectiv := GetProc(libGL, 'glRectiv');
+  glRectsv := GetProc(libGL, 'glRectsv');
+// Lighting
+  glShadeModel := GetProc(libGL, 'glShadeModel');
+  glLightf := GetProc(libGL, 'glLightf');
+  glLighti := GetProc(libGL, 'glLighti');
+  glLightfv := GetProc(libGL, 'glLightfv');
+  glLightiv := GetProc(libGL, 'glLightiv');
+  glGetLightfv := GetProc(libGL, 'glGetLightfv');
+  glGetLightiv := GetProc(libGL, 'glGetLightiv');
+  glLightModelf := GetProc(libGL, 'glLightModelf');
+  glLightModeli := GetProc(libGL, 'glLightModeli');
+  glLightModelfv := GetProc(libGL, 'glLightModelfv');
+  glLightModeliv := GetProc(libGL, 'glLightModeliv');
+  glMaterialf := GetProc(libGL, 'glMaterialf');
+  glMateriali := GetProc(libGL, 'glMateriali');
+  glMaterialfv := GetProc(libGL, 'glMaterialfv');
+  glMaterialiv := GetProc(libGL, 'glMaterialiv');
+  glGetMaterialfv := GetProc(libGL, 'glGetMaterialfv');
+  glGetMaterialiv := GetProc(libGL, 'glGetMaterialiv');
+  glColorMaterial := GetProc(libGL, 'glColorMaterial');
+// Raster Functions
+  glPixelZoom := GetProc(libGL, 'glPixelZoom');
+  glPixelStoref := GetProc(libGL, 'glPixelStoref');
+  glPixelStorei := GetProc(libGL, 'glPixelStorei');
+  glPixelTransferf := GetProc(libGL, 'glPixelTransferf');
+  glPixelTransferi := GetProc(libGL, 'glPixelTransferi');
+  glPixelMapfv := GetProc(libGL, 'glPixelMapfv');
+  glPixelMapuiv := GetProc(libGL, 'glPixelMapuiv');
+  glPixelMapusv := GetProc(libGL, 'glPixelMapusv');
+  glGetPixelMapfv := GetProc(libGL, 'glGetPixelMapfv');
+  glGetPixelMapuiv := GetProc(libGL, 'glGetPixelMapuiv');
+  glGetPixelMapusv := GetProc(libGL, 'glGetPixelMapusv');
+  glBitmap := GetProc(libGL, 'glBitmap');
+  glReadPixels := GetProc(libGL, 'glReadPixels');
+  glDrawPixels := GetProc(libGL, 'glDrawPixels');
+  glCopyPixels := GetProc(libGL, 'glCopyPixels');
+// Stenciling
+  glStencilFunc := GetProc(libGL, 'glStencilFunc');
+  glStencilMask := GetProc(libGL, 'glStencilMask');
+  glStencilOp := GetProc(libGL, 'glStencilOp');
+  glClearStencil := GetProc(libGL, 'glClearStencil');
+// Texture Mapping
+  glTexGend := GetProc(libGL, 'glTexGend');
+  glTexGenf := GetProc(libGL, 'glTexGenf');
+  glTexGeni := GetProc(libGL, 'glTexGeni');
+  glTexGendv := GetProc(libGL, 'glTexGendv');
+  glTexGenfv := GetProc(libGL, 'glTexGenfv');
+  glTexGeniv := GetProc(libGL, 'glTexGeniv');
+  glGetTexGendv := GetProc(libGL, 'glGetTexGendv');
+  glGetTexGenfv := GetProc(libGL, 'glGetTexGenfv');
+  glGetTexGeniv := GetProc(libGL, 'glGetTexGeniv');
+  glTexEnvf := GetProc(libGL, 'glTexEnvf');
+  glTexEnvi := GetProc(libGL, 'glTexEnvi');
+  glTexEnvfv := GetProc(libGL, 'glTexEnvfv');
+  glTexEnviv := GetProc(libGL, 'glTexEnviv');
+  glGetTexEnvfv := GetProc(libGL, 'glGetTexEnvfv');
+  glGetTexEnviv := GetProc(libGL, 'glGetTexEnviv');
+  glTexParameterf := GetProc(libGL, 'glTexParameterf');
+  glTexParameteri := GetProc(libGL, 'glTexParameteri');
+  glTexParameterfv := GetProc(libGL, 'glTexParameterfv');
+  glTexParameteriv := GetProc(libGL, 'glTexParameteriv');
+  glGetTexParameterfv := GetProc(libGL, 'glGetTexParameterfv');
+  glGetTexParameteriv := GetProc(libGL, 'glGetTexParameteriv');
+  glGetTexLevelParameterfv := GetProc(libGL, 'glGetTexLevelParameterfv');
+  glGetTexLevelParameteriv := GetProc(libGL, 'glGetTexLevelParameteriv');
+  glTexImage1D := GetProc(libGL, 'glTexImage1D');
+  glTexImage2D := GetProc(libGL, 'glTexImage2D');
+  glGetTexImage := GetProc(libGL, 'glGetTexImage');
+// Evaluators
+  glMap1d := GetProc(libGL, 'glMap1d');
+  glMap1f := GetProc(libGL, 'glMap1f');
+  glMap2d := GetProc(libGL, 'glMap2d');
+  glMap2f := GetProc(libGL, 'glMap2f');
+  glGetMapdv := GetProc(libGL, 'glGetMapdv');
+  glGetMapfv := GetProc(libGL, 'glGetMapfv');
+  glGetMapiv := GetProc(libGL, 'glGetMapiv');
+  glEvalCoord1d := GetProc(libGL, 'glEvalCoord1d');
+  glEvalCoord1f := GetProc(libGL, 'glEvalCoord1f');
+  glEvalCoord1dv := GetProc(libGL, 'glEvalCoord1dv');
+  glEvalCoord1fv := GetProc(libGL, 'glEvalCoord1fv');
+  glEvalCoord2d := GetProc(libGL, 'glEvalCoord2d');
+  glEvalCoord2f := GetProc(libGL, 'glEvalCoord2f');
+  glEvalCoord2dv := GetProc(libGL, 'glEvalCoord2dv');
+  glEvalCoord2fv := GetProc(libGL, 'glEvalCoord2fv');
+  glMapGrid1d := GetProc(libGL, 'glMapGrid1d');
+  glMapGrid1f := GetProc(libGL, 'glMapGrid1f');
+  glMapGrid2d := GetProc(libGL, 'glMapGrid2d');
+  glMapGrid2f := GetProc(libGL, 'glMapGrid2f');
+  glEvalPoint1 := GetProc(libGL, 'glEvalPoint1');
+  glEvalPoint2 := GetProc(libGL, 'glEvalPoint2');
+  glEvalMesh1 := GetProc(libGL, 'glEvalMesh1');
+  glEvalMesh2 := GetProc(libGL, 'glEvalMesh2');
+// Fog
+  glFogf := GetProc(libGL, 'glFogf');
+  glFogi := GetProc(libGL, 'glFogi');
+  glFogfv := GetProc(libGL, 'glFogfv');
+  glFogiv := GetProc(libGL, 'glFogiv');
+// Selection and Feedback
+  glFeedbackBuffer := GetProc(libGL, 'glFeedbackBuffer');
+  glPassThrough := GetProc(libGL, 'glPassThrough');
+  glSelectBuffer := GetProc(libGL, 'glSelectBuffer');
+  glInitNames := GetProc(libGL, 'glInitNames');
+  glLoadName := GetProc(libGL, 'glLoadName');
+  glPushName := GetProc(libGL, 'glPushName');
+  glPopName := GetProc(libGL, 'glPopName');
+{$endif GL1_0}
+
+{$ifdef GL1_1}
+// Miscellaneous
+  glEnableClientState := GetProc(libGL, 'glEnableClientState');
+  glDisableClientState := GetProc(libGL, 'glDisableClientState');
+  glPushClientAttrib := GetProc(libGL, 'glPushClientAttrib');
+  glPopClientAttrib := GetProc(libGL, 'glPopClientAttrib');
+// Drawing Functions
+  glIndexub := GetProc(libGL, 'glIndexub');
+  glIndexubv := GetProc(libGL, 'glIndexubv');
+// Vertex Arrays
+  glVertexPointer := GetProc(libGL, 'glVertexPointer');
+  glNormalPointer := GetProc(libGL, 'glNormalPointer');
+  glColorPointer := GetProc(libGL, 'glColorPointer');
+  glIndexPointer := GetProc(libGL, 'glIndexPointer');
+  glTexCoordPointer := GetProc(libGL, 'glTexCoordPointer');
+  glEdgeFlagPointer := GetProc(libGL, 'glEdgeFlagPointer');
+  glGetPointerv := GetProc(libGL, 'glGetPointerv');
+  glArrayElement := GetProc(libGL, 'glArrayElement');
+  glDrawArrays := GetProc(libGL, 'glDrawArrays');
+  glDrawElements := GetProc(libGL, 'glDrawElements');
+  glInterleavedArrays := GetProc(libGL, 'glInterleavedArrays');
+// Texture Mapping
+  glGenTextures := GetProc(libGL, 'glGenTextures');
+  glDeleteTextures := GetProc(libGL, 'glDeleteTextures');
+  glBindTexture := GetProc(libGL, 'glBindTexture');
+  glPrioritizeTextures := GetProc(libGL, 'glPrioritizeTextures');
+  glAreTexturesResident := GetProc(libGL, 'glAreTexturesResident');
+  glIsTexture := GetProc(libGL, 'glIsTexture');
+  glTexSubImage1D := GetProc(libGL, 'glTexSubImage1D');
+  glTexSubImage2D := GetProc(libGL, 'glTexSubImage2D');
+  glCopyTexImage1D := GetProc(libGL, 'glCopyTexImage1D');
+  glCopyTexImage2D := GetProc(libGL, 'glCopyTexImage2D');
+  glCopyTexSubImage1D := GetProc(libGL, 'glCopyTexSubImage1D');
+  glCopyTexSubImage2D := GetProc(libGL, 'glCopyTexSubImage2D');
+{$endif GL1_1}
+
+{$ifdef GL1_2}
+  glDrawRangeElements := GetProc(libGL, 'glDrawRangeElements');
+  glTexImage3D := GetProc(libGL, 'glTexImage3D');
+  glTexSubImage3D := GetProc(libGL, 'glTexSubImage3D');
+  glCopyTexSubImage3D := GetProc(libGL, 'glCopyTexSubImage3D');
+{$endif GL1_2}
+
+{$ifdef EXTENSIONS}
+// === 1.0 Extensions ===
+// GL_EXT_blend_minmax
+  glBlendEquationEXT := GetProc(libGL, 'glBlendEquationEXT');
+// GL_EXT_blend_color
+  glBlendColorEXT := GetProc(libGL, 'glBlendColorEXT');
+// GL_EXT_polygon_offset
+  glPolygonOffsetEXT := GetProc(libGL, 'glPolygonOffsetEXT');
+// GL_EXT_vertex_array
+  glVertexPointerEXT := GetProc(libGL, 'glVertexPointerEXT');
+  glNormalPointerEXT := GetProc(libGL, 'glNormalPointerEXT');
+  glColorPointerEXT := GetProc(libGL, 'glColorPointerEXT');
+  glIndexPointerEXT := GetProc(libGL, 'glIndexPointerEXT');
+  glTexCoordPointerEXT := GetProc(libGL, 'glTexCoordPointerEXT');
+  glEdgeFlagPointerEXT := GetProc(libGL, 'glEdgeFlagPointerEXT');
+  glGetPointervEXT := GetProc(libGL, 'glGetPointervEXT');
+  glArrayElementEXT := GetProc(libGL, 'glArrayElementEXT');
+  glDrawArraysEXT := GetProc(libGL, 'glDrawArraysEXT');
+// GL_EXT_texture_object
+  glGenTexturesEXT := GetProc(libGL, 'glGenTexturesEXT');
+  glDeleteTexturesEXT := GetProc(libGL, 'glDeleteTexturesEXT');
+  glBindTextureEXT := GetProc(libGL, 'glBindTextureEXT');
+  glPrioritizeTexturesEXT := GetProc(libGL, 'glPrioritizeTexturesEXT');
+  glAreTexturesResidentEXT := GetProc(libGL, 'glAreTexturesResidentEXT');
+  glIsTextureEXT := GetProc(libGL, 'glIsTextureEXT');
+// GL_EXT_texture3D
+  glTexImage3DEXT := GetProc(libGL, 'glTexImage3DEXT');
+  glTexSubImage3DEXT := GetProc(libGL, 'glTexSubImage3DEXT');
+  glCopyTexSubImage3DEXT := GetProc(libGL, 'glCopyTexSubImage3DEXT');
+// GL_EXT_color_table
+  glColorTableEXT := GetProc(libGL, 'glColorTableEXT');
+  glColorSubTableEXT := GetProc(libGL, 'glColorSubTableEXT');
+  glGetColorTableEXT := GetProc(libGL, 'glGetColorTableEXT');
+  glGetColorTableParameterfvEXT := GetProc(libGL, 'glGetColorTableParameterfvEXT');
+  glGetColorTableParameterivEXT := GetProc(libGL, 'glGetColorTableParameterivEXT');
+{$endif EXTENSIONS}
+
+{$ifdef SGI_EXTENSIONS}
+// GL_SGIS_multitexture
+  glMultiTexCoord1dSGIS := GetProc(libGL, 'glMultiTexCoord1dSGIS');
+  glMultiTexCoord1dvSGIS := GetProc(libGL, 'glMultiTexCoord1dvSGIS');
+  glMultiTexCoord1fSGIS := GetProc(libGL, 'glMultiTexCoord1fSGIS');
+  glMultiTexCoord1fvSGIS := GetProc(libGL, 'glMultiTexCoord1fvSGIS');
+  glMultiTexCoord1iSGIS := GetProc(libGL, 'glMultiTexCoord1iSGIS');
+  glMultiTexCoord1ivSGIS := GetProc(libGL, 'glMultiTexCoord1ivSGIS');
+  glMultiTexCoord1sSGIS := GetProc(libGL, 'glMultiTexCoord1sSGIS');
+  glMultiTexCoord1svSGIS := GetProc(libGL, 'glMultiTexCoord1svSGIS');
+  glMultiTexCoord2dSGIS := GetProc(libGL, 'glMultiTexCoord2dSGIS');
+  glMultiTexCoord2dvSGIS := GetProc(libGL, 'glMultiTexCoord2dvSGIS');
+  glMultiTexCoord2fSGIS := GetProc(libGL, 'glMultiTexCoord2fSGIS');
+  glMultiTexCoord2fvSGIS := GetProc(libGL, 'glMultiTexCoord2fvSGIS');
+  glMultiTexCoord2iSGIS := GetProc(libGL, 'glMultiTexCoord2iSGIS');
+  glMultiTexCoord2ivSGIS := GetProc(libGL, 'glMultiTexCoord2ivSGIS');
+  glMultiTexCoord2sSGIS := GetProc(libGL, 'glMultiTexCoord2sSGIS');
+  glMultiTexCoord2svSGIS := GetProc(libGL, 'glMultiTexCoord2svSGIS');
+  glMultiTexCoord3dSGIS := GetProc(libGL, 'glMultiTexCoord3dSGIS');
+  glMultiTexCoord3dvSGIS := GetProc(libGL, 'glMultiTexCoord3dvSGIS');
+  glMultiTexCoord3fSGIS := GetProc(libGL, 'glMultiTexCoord3fSGIS');
+  glMultiTexCoord3fvSGIS := GetProc(libGL, 'glMultiTexCoord3fvSGIS');
+  glMultiTexCoord3iSGIS := GetProc(libGL, 'glMultiTexCoord3iSGIS');
+  glMultiTexCoord3ivSGIS := GetProc(libGL, 'glMultiTexCoord3ivSGIS');
+  glMultiTexCoord3sSGIS := GetProc(libGL, 'glMultiTexCoord3sSGIS');
+  glMultiTexCoord3svSGIS := GetProc(libGL, 'glMultiTexCoord3svSGIS');
+  glMultiTexCoord4dSGIS := GetProc(libGL, 'glMultiTexCoord4dSGIS');
+  glMultiTexCoord4dvSGIS := GetProc(libGL, 'glMultiTexCoord4dvSGIS');
+  glMultiTexCoord4fSGIS := GetProc(libGL, 'glMultiTexCoord4fSGIS');
+  glMultiTexCoord4fvSGIS := GetProc(libGL, 'glMultiTexCoord4fvSGIS');
+  glMultiTexCoord4iSGIS := GetProc(libGL, 'glMultiTexCoord4iSGIS');
+  glMultiTexCoord4ivSGIS := GetProc(libGL, 'glMultiTexCoord4ivSGIS');
+  glMultiTexCoord4sSGIS := GetProc(libGL, 'glMultiTexCoord4sSGIS');
+  glMultiTexCoord4svSGIS := GetProc(libGL, 'glMultiTexCoord4svSGIS');
+  glMultiTexCoordPointerSGIS := GetProc(libGL, 'glMultiTexCoordPointerSGIS');
+  glSelectTextureSGIS := GetProc(libGL, 'glSelectTextureSGIS');
+  glSelectTextureCoordSetSGIS := GetProc(libGL, 'glSelectTextureCoordSetSGIS');
+// GL_EXT_multitexture
+  glMultiTexCoord1dEXT := GetProc(libGL, 'glMultiTexCoord1dEXT');
+  glMultiTexCoord1dvEXT := GetProc(libGL, 'glMultiTexCoord1dvEXT');
+  glMultiTexCoord1fEXT := GetProc(libGL, 'glMultiTexCoord1fEXT');
+  glMultiTexCoord1fvEXT := GetProc(libGL, 'glMultiTexCoord1fvEXT');
+  glMultiTexCoord1iEXT := GetProc(libGL, 'glMultiTexCoord1iEXT');
+  glMultiTexCoord1ivEXT := GetProc(libGL, 'glMultiTexCoord1ivEXT');
+  glMultiTexCoord1sEXT := GetProc(libGL, 'glMultiTexCoord1sEXT');
+  glMultiTexCoord1svEXT := GetProc(libGL, 'glMultiTexCoord1svEXT');
+  glMultiTexCoord2dEXT := GetProc(libGL, 'glMultiTexCoord2dEXT');
+  glMultiTexCoord2dvEXT := GetProc(libGL, 'glMultiTexCoord2dvEXT');
+  glMultiTexCoord2fEXT := GetProc(libGL, 'glMultiTexCoord2fEXT');
+  glMultiTexCoord2fvEXT := GetProc(libGL, 'glMultiTexCoord2fvEXT');
+  glMultiTexCoord2iEXT := GetProc(libGL, 'glMultiTexCoord2iEXT');
+  glMultiTexCoord2ivEXT := GetProc(libGL, 'glMultiTexCoord2ivEXT');
+  glMultiTexCoord2sEXT := GetProc(libGL, 'glMultiTexCoord2sEXT');
+  glMultiTexCoord2svEXT := GetProc(libGL, 'glMultiTexCoord2svEXT');
+  glMultiTexCoord3dEXT := GetProc(libGL, 'glMultiTexCoord3dEXT');
+  glMultiTexCoord3dvEXT := GetProc(libGL, 'glMultiTexCoord3dvEXT');
+  glMultiTexCoord3fEXT := GetProc(libGL, 'glMultiTexCoord3fEXT');
+  glMultiTexCoord3fvEXT := GetProc(libGL, 'glMultiTexCoord3fvEXT');
+  glMultiTexCoord3iEXT := GetProc(libGL, 'glMultiTexCoord3iEXT');
+  glMultiTexCoord3ivEXT := GetProc(libGL, 'glMultiTexCoord3ivEXT');
+  glMultiTexCoord3sEXT := GetProc(libGL, 'glMultiTexCoord3sEXT');
+  glMultiTexCoord3svEXT := GetProc(libGL, 'glMultiTexCoord3svEXT');
+  glMultiTexCoord4dEXT := GetProc(libGL, 'glMultiTexCoord4dEXT');
+  glMultiTexCoord4dvEXT := GetProc(libGL, 'glMultiTexCoord4dvEXT');
+  glMultiTexCoord4fEXT := GetProc(libGL, 'glMultiTexCoord4fEXT');
+  glMultiTexCoord4fvEXT := GetProc(libGL, 'glMultiTexCoord4fvEXT');
+  glMultiTexCoord4iEXT := GetProc(libGL, 'glMultiTexCoord4iEXT');
+  glMultiTexCoord4ivEXT := GetProc(libGL, 'glMultiTexCoord4ivEXT');
+  glMultiTexCoord4sEXT := GetProc(libGL, 'glMultiTexCoord4sEXT');
+  glMultiTexCoord4svEXT := GetProc(libGL, 'glMultiTexCoord4svEXT');
+  glInterleavedTextureCoordSetsEXT := GetProc(libGL, 'glInterleavedTextureCoordSetsEXT');
+  glSelectTextureEXT := GetProc(libGL, 'glSelectTextureEXT');
+  glSelectTextureCoordSetEXT := GetProc(libGL, 'glSelectTextureCoordSetEXT');
+  glSelectTextureTransformEXT := GetProc(libGL, 'glSelectTextureTransformEXT');
+// GL_EXT_point_parameters
+  glPointParameterfEXT := GetProc(libGL, 'glPointParameterfEXT');
+  glPointParameterfvEXT := GetProc(libGL, 'glPointParameterfvEXT');
+{$endif SGI_EXTENSIONS}
+
+{$ifdef MESA}
+// GL_MESA_window_pos
+  glWindowPos2iMESA := GetProc(libGL, 'glWindowPos2iMESA');
+  glWindowPos2sMESA := GetProc(libGL, 'glWindowPos2sMESA');
+  glWindowPos2fMESA := GetProc(libGL, 'glWindowPos2fMESA');
+  glWindowPos2dMESA := GetProc(libGL, 'glWindowPos2dMESA');
+  glWindowPos2ivMESA := GetProc(libGL, 'glWindowPos2ivMESA');
+  glWindowPos2svMESA := GetProc(libGL, 'glWindowPos2svMESA');
+  glWindowPos2fvMESA := GetProc(libGL, 'glWindowPos2fvMESA');
+  glWindowPos2dvMESA := GetProc(libGL, 'glWindowPos2dvMESA');
+  glWindowPos3iMESA := GetProc(libGL, 'glWindowPos3iMESA');
+  glWindowPos3sMESA := GetProc(libGL, 'glWindowPos3sMESA');
+  glWindowPos3fMESA := GetProc(libGL, 'glWindowPos3fMESA');
+  glWindowPos3dMESA := GetProc(libGL, 'glWindowPos3dMESA');
+  glWindowPos3ivMESA := GetProc(libGL, 'glWindowPos3ivMESA');
+  glWindowPos3svMESA := GetProc(libGL, 'glWindowPos3svMESA');
+  glWindowPos3fvMESA := GetProc(libGL, 'glWindowPos3fvMESA');
+  glWindowPos3dvMESA := GetProc(libGL, 'glWindowPos3dvMESA');
+  glWindowPos4iMESA := GetProc(libGL, 'glWindowPos4iMESA');
+  glWindowPos4sMESA := GetProc(libGL, 'glWindowPos4sMESA');
+  glWindowPos4fMESA := GetProc(libGL, 'glWindowPos4fMESA');
+  glWindowPos4dMESA := GetProc(libGL, 'glWindowPos4dMESA');
+  glWindowPos4ivMESA := GetProc(libGL, 'glWindowPos4ivMESA');
+  glWindowPos4svMESA := GetProc(libGL, 'glWindowPos4svMESA');
+  glWindowPos4fvMESA := GetProc(libGL, 'glWindowPos4fvMESA');
+  glWindowPos4dvMESA := GetProc(libGL, 'glWindowPos4dvMESA');
+// GL_MESA_resize_buffers
+  glResizeBuffersMESA := GetProc(libGL, 'glResizeBuffersMESA');
+{$endif MESA}
+
+  GLInitialized := True;
+  Result := True;
+end;
+
+
+function InitGL: Boolean;
+begin
+  Result := InitGLFromLibrary('opengl32.dll');
+end;
+
+
+initialization
+  InitGL;
+finalization
+  if libGL <> 0 then FreeLibrary(libGL);
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:46  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:17  michael
+  + Initial import
+
+  Revision 1.2  2000/05/31 00:34:28  alex
+  made templates work
+
+}
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:46  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}

+ 1494 - 0
packages/opengl/win32/gl_sl.pp

@@ -0,0 +1,1494 @@
+{
+  Translation of the Mesa GL headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+  Template for static linking in Win32 environment by Alexander Stohr.
+
+  Original copyright notice:
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{
+  You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+  This is necessary for supporting different platforms with different calling
+  conventions via a single unit.
+}
+
+unit GL_SL;
+
+
+interface
+
+{$DEFINE GL1_0}
+{x$DEFINE GL1_1}
+{x$DEFINE GL1_2}
+{x$DEFINE MESA}                 {enable if you want to use some special mesa extensions}
+{x$DEFINE EXTENSIONS}           {enable if you need one/all of extensions}
+{x$DEFINE SGI_EXTENSIONS}       {enable if you need one/all of extensions}
+
+{
+  *** Note: ***
+  There is currently one importants side effect when doing static linking.
+
+  If you include a function statically than its required to be present
+  in the supplied DLLs of your OS and Hardware.
+  This means if the DLL is not present your program will not run.
+  In Win95 it appears that you will be informined you about
+  the name of the first missing symbol while loading the executable.
+}
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE ogl_dll := external 'opengl32.dll'}
+  uses Windows;
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+// none - no special init required
+
+
+// =======================================================
+//   GL consts, types and functions
+// =======================================================
+
+
+// -------------------------------------------------------
+//   GL types
+// -------------------------------------------------------
+
+type
+  PSingle   = ^Single;
+  PDouble   = ^Double;
+
+  GLvoid    = Pointer;
+  GLboolean = Byte;
+
+  GLbyte    = ShortInt; // 1-byte signed
+  GLshort   = Integer;  // 2-byte signed
+  GLint     = LongInt;  // 4-byte signed
+
+  GLubyte   = Byte;     // 1-byte unsigned
+  GLushort  = Word;     // 2-byte unsigned
+  GLuint    = DWord;    // 4-byte signed
+
+  GLsizei   = LongInt;  // 4-byte signed
+
+  GLfloat   = Single;   // single precision float
+  GLclampf  = Single;   // single precision float in [0,1]
+  GLdouble  = Double;   // double precision float
+  GLclampd  = Double;   // double precision float in [0,1]
+
+  GLenum    = DWord;
+
+  PGLBoolean = ^GLBoolean;
+  PGLFloat   = ^GLfloat;
+  PGLDouble  = ^GLDouble;
+
+type
+  GLbitfield = DWord;  { was an enum - no corresponding thing in pascal }
+const
+  GL_CURRENT_BIT        = $00000001;
+  GL_POINT_BIT          = $00000002;
+  GL_LINE_BIT           = $00000004;
+  GL_POLYGON_BIT        = $00000008;
+  GL_POLYGON_STIPPLE_BIT= $00000010;
+  GL_PIXEL_MODE_BIT     = $00000020;
+  GL_LIGHTING_BIT       = $00000040;
+  GL_FOG_BIT            = $00000080;
+  GL_DEPTH_BUFFER_BIT   = $00000100;
+  GL_ACCUM_BUFFER_BIT   = $00000200;
+  GL_STENCIL_BUFFER_BIT = $00000400;
+  GL_VIEWPORT_BIT       = $00000800;
+  GL_TRANSFORM_BIT      = $00001000;
+  GL_ENABLE_BIT         = $00002000;
+  GL_COLOR_BUFFER_BIT   = $00004000;
+  GL_HINT_BIT           = $00008000;
+  GL_EVAL_BIT           = $00010000;
+  GL_LIST_BIT           = $00020000;
+  GL_TEXTURE_BIT        = $00040000;
+  GL_SCISSOR_BIT        = $00080000;
+  GL_ALL_ATTRIB_BITS    = $000fffff;
+
+
+// -------------------------------------------------------
+//   GL constants
+// -------------------------------------------------------
+
+{$IFDEF GL1_0}
+
+const
+  GL_NO_ERROR                           = 0;
+
+  // Boolean values
+  GL_FALSE                              = 0;
+  GL_TRUE                               = 1;
+
+  // Data types
+  GL_BYTE                               = $1400;
+  GL_UNSIGNED_BYTE                      = $1401;
+  GL_SHORT                              = $1402;
+  GL_UNSIGNED_SHORT                     = $1403;
+  GL_INT                                = $1404;
+  GL_UNSIGNED_INT                       = $1405;
+  GL_FLOAT                              = $1406;
+  GL_DOUBLE                             = $140A;
+  GL_2_BYTES                            = $1407;
+  GL_3_BYTES                            = $1408;
+  GL_4_BYTES                            = $1409;
+
+  // Primitives
+  GL_LINES                              = $0001;
+  GL_POINTS                             = $0000;
+  GL_LINE_STRIP                         = $0003;
+  GL_LINE_LOOP                          = $0002;
+  GL_TRIANGLES                          = $0004;
+  GL_TRIANGLE_STRIP                     = $0005;
+  GL_TRIANGLE_FAN                       = $0006;
+  GL_QUADS                              = $0007;
+  GL_QUAD_STRIP                         = $0008;
+  GL_POLYGON                            = $0009;
+  GL_EDGE_FLAG                          = $0B43;
+
+  // Vertex arrays
+  GL_VERTEX_ARRAY                       = $8074;
+  GL_NORMAL_ARRAY                       = $8075;
+  GL_COLOR_ARRAY                        = $8076;
+  GL_INDEX_ARRAY                        = $8077;
+  GL_TEXTURE_COORD_ARRAY                = $8078;
+  GL_EDGE_FLAG_ARRAY                    = $8079;
+  GL_VERTEX_ARRAY_SIZE                  = $807A;
+  GL_VERTEX_ARRAY_TYPE                  = $807B;
+  GL_VERTEX_ARRAY_STRIDE                = $807C;
+  GL_NORMAL_ARRAY_TYPE                  = $807E;
+  GL_NORMAL_ARRAY_STRIDE                = $807F;
+  GL_COLOR_ARRAY_SIZE                   = $8081;
+  GL_COLOR_ARRAY_TYPE                   = $8082;
+  GL_COLOR_ARRAY_STRIDE                 = $8083;
+  GL_INDEX_ARRAY_TYPE                   = $8085;
+  GL_INDEX_ARRAY_STRIDE                 = $8086;
+  GL_TEXTURE_COORD_ARRAY_SIZE           = $8088;
+  GL_TEXTURE_COORD_ARRAY_TYPE           = $8089;
+  GL_TEXTURE_COORD_ARRAY_STRIDE         = $808A;
+  GL_EDGE_FLAG_ARRAY_STRIDE             = $808C;
+  GL_VERTEX_ARRAY_POINTER               = $808E;
+  GL_NORMAL_ARRAY_POINTER               = $808F;
+  GL_COLOR_ARRAY_POINTER                = $8090;
+  GL_INDEX_ARRAY_POINTER                = $8091;
+  GL_TEXTURE_COORD_ARRAY_POINTER        = $8092;
+  GL_EDGE_FLAG_ARRAY_POINTER            = $8093;
+  GL_V2F                                = $2A20;
+  GL_V3F                                = $2A21;
+  GL_C4UB_V2F                           = $2A22;
+  GL_C4UB_V3F                           = $2A23;
+  GL_C3F_V3F                            = $2A24;
+  GL_N3F_V3F                            = $2A25;
+  GL_C4F_N3F_V3F                        = $2A26;
+  GL_T2F_V3F                            = $2A27;
+  GL_T4F_V4F                            = $2A28;
+  GL_T2F_C4UB_V3F                       = $2A29;
+  GL_T2F_C3F_V3F                        = $2A2A;
+  GL_T2F_N3F_V3F                        = $2A2B;
+  GL_T2F_C4F_N3F_V3F                    = $2A2C;
+  GL_T4F_C4F_N3F_V4F                    = $2A2D;
+
+  // Matrix Mode
+  GL_MATRIX_MODE                        = $0BA0;
+  GL_MODELVIEW                          = $1700;
+  GL_PROJECTION                         = $1701;
+  GL_TEXTURE                            = $1702;
+
+  // Points
+  GL_POINT_SMOOTH                       = $0B10;
+  GL_POINT_SIZE                         = $0B11;
+  GL_POINT_SIZE_GRANULARITY             = $0B13;
+  GL_POINT_SIZE_RANGE                   = $0B12;
+
+  // Lines
+  GL_LINE_SMOOTH                        = $0B20;
+  GL_LINE_STIPPLE                       = $0B24;
+  GL_LINE_STIPPLE_PATTERN               = $0B25;
+  GL_LINE_STIPPLE_REPEAT                = $0B26;
+  GL_LINE_WIDTH                         = $0B21;
+  GL_LINE_WIDTH_GRANULARITY             = $0B23;
+  GL_LINE_WIDTH_RANGE                   = $0B22;
+
+  // Polygons
+  GL_POINT                              = $1B00;
+  GL_LINE                               = $1B01;
+  GL_FILL                               = $1B02;
+  GL_CCW                                = $0901;
+  GL_CW                                 = $0900;
+  GL_FRONT                              = $0404;
+  GL_BACK                               = $0405;
+  GL_CULL_FACE                          = $0B44;
+  GL_CULL_FACE_MODE                     = $0B45;
+  GL_POLYGON_SMOOTH                     = $0B41;
+  GL_POLYGON_STIPPLE                    = $0B42;
+  GL_FRONT_FACE                         = $0B46;
+  GL_POLYGON_MODE                       = $0B40;
+  GL_POLYGON_OFFSET_FACTOR              = $8038;
+  GL_POLYGON_OFFSET_UNITS               = $2A00;
+  GL_POLYGON_OFFSET_POINT               = $2A01;
+  GL_POLYGON_OFFSET_LINE                = $2A02;
+  GL_POLYGON_OFFSET_FILL                = $8037;
+
+  // Display lists
+  GL_COMPILE                            = $1300;
+  GL_COMPILE_AND_EXECUTE                = $1301;
+  GL_LIST_BASE                          = $0B32;
+  GL_LIST_INDEX                         = $0B33;
+  GL_LIST_MODE                          = $0B30;
+
+  // Depth buffer
+  GL_NEVER                              = $0200;
+  GL_LESS                               = $0201;
+  GL_GEQUAL                             = $0206;
+  GL_LEQUAL                             = $0203;
+  GL_GREATER                            = $0204;
+  GL_NOTEQUAL                           = $0205;
+  GL_EQUAL                              = $0202;
+  GL_ALWAYS                             = $0207;
+  GL_DEPTH_TEST                         = $0B71;
+  GL_DEPTH_BITS                         = $0D56;
+  GL_DEPTH_CLEAR_VALUE                  = $0B73;
+  GL_DEPTH_FUNC                         = $0B74;
+  GL_DEPTH_RANGE                        = $0B70;
+  GL_DEPTH_WRITEMASK                    = $0B72;
+  GL_DEPTH_COMPONENT                    = $1902;
+
+  // Lighting
+  GL_LIGHTING                           = $0B50;
+  GL_LIGHT0                             = $4000;
+  GL_LIGHT1                             = $4001;
+  GL_LIGHT2                             = $4002;
+  GL_LIGHT3                             = $4003;
+  GL_LIGHT4                             = $4004;
+  GL_LIGHT5                             = $4005;
+  GL_LIGHT6                             = $4006;
+  GL_LIGHT7                             = $4007;
+  GL_SPOT_EXPONENT                      = $1205;
+  GL_SPOT_CUTOFF                        = $1206;
+  GL_CONSTANT_ATTENUATION               = $1207;
+  GL_LINEAR_ATTENUATION                 = $1208;
+  GL_QUADRATIC_ATTENUATION              = $1209;
+  GL_AMBIENT                            = $1200;
+  GL_DIFFUSE                            = $1201;
+  GL_SPECULAR                           = $1202;
+  GL_SHININESS                          = $1601;
+  GL_EMISSION                           = $1600;
+  GL_POSITION                           = $1203;
+  GL_SPOT_DIRECTION                     = $1204;
+  GL_AMBIENT_AND_DIFFUSE                = $1602;
+  GL_COLOR_INDEXES                      = $1603;
+  GL_LIGHT_MODEL_TWO_SIDE               = $0B52;
+  GL_LIGHT_MODEL_LOCAL_VIEWER           = $0B51;
+  GL_LIGHT_MODEL_AMBIENT                = $0B53;
+  GL_FRONT_AND_BACK                     = $0408;
+  GL_SHADE_MODEL                        = $0B54;
+  GL_FLAT                               = $1D00;
+  GL_SMOOTH                             = $1D01;
+  GL_COLOR_MATERIAL                     = $0B57;
+  GL_COLOR_MATERIAL_FACE                = $0B55;
+  GL_COLOR_MATERIAL_PARAMETER           = $0B56;
+  GL_NORMALIZE                          = $0BA1;
+
+  // User clipping planes
+  GL_CLIP_PLANE0                        = $3000;
+  GL_CLIP_PLANE1                        = $3001;
+  GL_CLIP_PLANE2                        = $3002;
+  GL_CLIP_PLANE3                        = $3003;
+  GL_CLIP_PLANE4                        = $3004;
+  GL_CLIP_PLANE5                        = $3005;
+
+  // Accumulation buffer
+  GL_ACCUM_RED_BITS                     = $0D58;
+  GL_ACCUM_GREEN_BITS                   = $0D59;
+  GL_ACCUM_BLUE_BITS                    = $0D5A;
+  GL_ACCUM_ALPHA_BITS                   = $0D5B;
+  GL_ACCUM_CLEAR_VALUE                  = $0B80;
+  GL_ACCUM                              = $0100;
+  GL_ADD                                = $0104;
+  GL_LOAD                               = $0101;
+  GL_MULT                               = $0103;
+  GL_RETURN                             = $0102;
+
+  // Alpha testing
+  GL_ALPHA_TEST                         = $0BC0;
+  GL_ALPHA_TEST_REF                     = $0BC2;
+  GL_ALPHA_TEST_FUNC                    = $0BC1;
+
+  // Blending
+  GL_BLEND                              = $0BE2;
+  GL_BLEND_SRC                          = $0BE1;
+  GL_BLEND_DST                          = $0BE0;
+  GL_ZERO                               = 0;
+  GL_ONE                                = 1;
+  GL_SRC_COLOR                          = $0300;
+  GL_ONE_MINUS_SRC_COLOR                = $0301;
+  GL_DST_COLOR                          = $0306;
+  GL_ONE_MINUS_DST_COLOR                = $0307;
+  GL_SRC_ALPHA                          = $0302;
+  GL_ONE_MINUS_SRC_ALPHA                = $0303;
+  GL_DST_ALPHA                          = $0304;
+  GL_ONE_MINUS_DST_ALPHA                = $0305;
+  GL_SRC_ALPHA_SATURATE                 = $0308;
+  GL_CONSTANT_COLOR                     = $8001;
+  GL_ONE_MINUS_CONSTANT_COLOR           = $8002;
+  GL_CONSTANT_ALPHA                     = $8003;
+  GL_ONE_MINUS_CONSTANT_ALPHA           = $8004;
+
+  // Render mode
+  GL_FEEDBACK                           = $1C01;
+  GL_RENDER                             = $1C00;
+  GL_SELECT                             = $1C02;
+
+  // Feedback
+  GL_2D                                 = $0600;
+  GL_3D                                 = $0601;
+  GL_3D_COLOR                           = $0602;
+  GL_3D_COLOR_TEXTURE                   = $0603;
+  GL_4D_COLOR_TEXTURE                   = $0604;
+  GL_POINT_TOKEN                        = $0701;
+  GL_LINE_TOKEN                         = $0702;
+  GL_LINE_RESET_TOKEN                   = $0707;
+  GL_POLYGON_TOKEN                      = $0703;
+  GL_BITMAP_TOKEN                       = $0704;
+  GL_DRAW_PIXEL_TOKEN                   = $0705;
+  GL_COPY_PIXEL_TOKEN                   = $0706;
+  GL_PASS_THROUGH_TOKEN                 = $0700;
+  GL_FEEDBACK_BUFFER_POINTER            = $0DF0;
+  GL_FEEDBACK_BUFFER_SIZE               = $0DF1;
+  GL_FEEDBACK_BUFFER_TYPE               = $0DF2;
+
+  // Selection
+  GL_SELECTION_BUFFER_POINTER           = $0DF3;
+  GL_SELECTION_BUFFER_SIZE              = $0DF4;
+
+  // Fog
+  GL_FOG                                = $0B60;
+  GL_FOG_MODE                           = $0B65;
+  GL_FOG_DENSITY                        = $0B62;
+  GL_FOG_COLOR                          = $0B66;
+  GL_FOG_INDEX                          = $0B61;
+  GL_FOG_START                          = $0B63;
+  GL_FOG_END                            = $0B64;
+  GL_LINEAR                             = $2601;
+  GL_EXP                                = $0800;
+  GL_EXP2                               = $0801;
+
+  // Logic ops
+  GL_LOGIC_OP                           = $0BF1;
+  GL_INDEX_LOGIC_OP                     = $0BF1;
+  GL_COLOR_LOGIC_OP                     = $0BF2;
+  GL_LOGIC_OP_MODE                      = $0BF0;
+  GL_CLEAR                              = $1500;
+  GL_SET                                = $150F;
+  GL_COPY                               = $1503;
+  GL_COPY_INVERTED                      = $150C;
+  GL_NOOP                               = $1505;
+  GL_INVERT                             = $150A;
+  GL_AND                                = $1501;
+  GL_NAND                               = $150E;
+  GL_OR                                 = $1507;
+  GL_NOR                                = $1508;
+  GL_XOR                                = $1506;
+  GL_EQUIV                              = $1509;
+  GL_AND_REVERSE                        = $1502;
+  GL_AND_INVERTED                       = $1504;
+  GL_OR_REVERSE                         = $150B;
+  GL_OR_INVERTED                        = $150D;
+
+  // Stencil
+  GL_STENCIL_TEST                       = $0B90;
+  GL_STENCIL_WRITEMASK                  = $0B98;
+  GL_STENCIL_BITS                       = $0D57;
+  GL_STENCIL_FUNC                       = $0B92;
+  GL_STENCIL_VALUE_MASK                 = $0B93;
+  GL_STENCIL_REF                        = $0B97;
+  GL_STENCIL_FAIL                       = $0B94;
+  GL_STENCIL_PASS_DEPTH_PASS            = $0B96;
+  GL_STENCIL_PASS_DEPTH_FAIL            = $0B95;
+  GL_STENCIL_CLEAR_VALUE                = $0B91;
+  GL_STENCIL_INDEX                      = $1901;
+  GL_KEEP                               = $1E00;
+  GL_REPLACE                            = $1E01;
+  GL_INCR                               = $1E02;
+  GL_DECR                               = $1E03;
+
+  // Buffers, Pixel Drawing/Reading
+  GL_NONE                               = 0;
+  GL_LEFT                               = $0406;
+  GL_RIGHT                              = $0407;
+  //GL_FRONT                            = $0404;
+  //GL_BACK                             = $0405;
+  //GL_FRONT_AND_BACK                   = $0408;
+  GL_FRONT_LEFT                         = $0400;
+  GL_FRONT_RIGHT                        = $0401;
+  GL_BACK_LEFT                          = $0402;
+  GL_BACK_RIGHT                         = $0403;
+  GL_AUX0                               = $0409;
+  GL_AUX1                               = $040A;
+  GL_AUX2                               = $040B;
+  GL_AUX3                               = $040C;
+  GL_COLOR_INDEX                        = $1900;
+  GL_RED                                = $1903;
+  GL_GREEN                              = $1904;
+  GL_BLUE                               = $1905;
+  GL_ALPHA                              = $1906;
+  GL_LUMINANCE                          = $1909;
+  GL_LUMINANCE_ALPHA                    = $190A;
+  GL_ALPHA_BITS                         = $0D55;
+  GL_RED_BITS                           = $0D52;
+  GL_GREEN_BITS                         = $0D53;
+  GL_BLUE_BITS                          = $0D54;
+  GL_INDEX_BITS                         = $0D51;
+  GL_SUBPIXEL_BITS                      = $0D50;
+  GL_AUX_BUFFERS                        = $0C00;
+  GL_READ_BUFFER                        = $0C02;
+  GL_DRAW_BUFFER                        = $0C01;
+  GL_DOUBLEBUFFER                       = $0C32;
+  GL_STEREO                             = $0C33;
+  GL_BITMAP                             = $1A00;
+  GL_COLOR                              = $1800;
+  GL_DEPTH                              = $1801;
+  GL_STENCIL                            = $1802;
+  GL_DITHER                             = $0BD0;
+  GL_RGB                                = $1907;
+  GL_RGBA                               = $1908;
+
+  // Implementation limits
+  GL_MAX_LIST_NESTING                   = $0B31;
+  GL_MAX_ATTRIB_STACK_DEPTH             = $0D35;
+  GL_MAX_MODELVIEW_STACK_DEPTH          = $0D36;
+  GL_MAX_NAME_STACK_DEPTH               = $0D37;
+  GL_MAX_PROJECTION_STACK_DEPTH         = $0D38;
+  GL_MAX_TEXTURE_STACK_DEPTH            = $0D39;
+  GL_MAX_EVAL_ORDER                     = $0D30;
+  GL_MAX_LIGHTS                         = $0D31;
+  GL_MAX_CLIP_PLANES                    = $0D32;
+  GL_MAX_TEXTURE_SIZE                   = $0D33;
+  GL_MAX_PIXEL_MAP_TABLE                = $0D34;
+  GL_MAX_VIEWPORT_DIMS                  = $0D3A;
+  GL_MAX_CLIENT_ATTRIB_STACK_DEPTH      = $0D3B;
+
+  // Gets
+  GL_ATTRIB_STACK_DEPTH                 = $0BB0;
+  GL_CLIENT_ATTRIB_STACK_DEPTH          = $0BB1;
+  GL_COLOR_CLEAR_VALUE                  = $0C22;
+  GL_COLOR_WRITEMASK                    = $0C23;
+  GL_CURRENT_INDEX                      = $0B01;
+  GL_CURRENT_COLOR                      = $0B00;
+  GL_CURRENT_NORMAL                     = $0B02;
+  GL_CURRENT_RASTER_COLOR               = $0B04;
+  GL_CURRENT_RASTER_DISTANCE            = $0B09;
+  GL_CURRENT_RASTER_INDEX               = $0B05;
+  GL_CURRENT_RASTER_POSITION            = $0B07;
+  GL_CURRENT_RASTER_TEXTURE_COORDS      = $0B06;
+  GL_CURRENT_RASTER_POSITION_VALID      = $0B08;
+  GL_CURRENT_TEXTURE_COORDS             = $0B03;
+  GL_INDEX_CLEAR_VALUE                  = $0C20;
+  GL_INDEX_MODE                         = $0C30;
+  GL_INDEX_WRITEMASK                    = $0C21;
+  GL_MODELVIEW_MATRIX                   = $0BA6;
+  GL_MODELVIEW_STACK_DEPTH              = $0BA3;
+  GL_NAME_STACK_DEPTH                   = $0D70;
+  GL_PROJECTION_MATRIX                  = $0BA7;
+  GL_PROJECTION_STACK_DEPTH             = $0BA4;
+  GL_RENDER_MODE                        = $0C40;
+  GL_RGBA_MODE                          = $0C31;
+  GL_TEXTURE_MATRIX                     = $0BA8;
+  GL_TEXTURE_STACK_DEPTH                = $0BA5;
+  GL_VIEWPORT                           = $0BA2;
+
+  // Evaluators
+  GL_AUTO_NORMAL                        = $0D80;
+  GL_MAP1_COLOR_4                       = $0D90;
+  GL_MAP1_GRID_DOMAIN                   = $0DD0;
+  GL_MAP1_GRID_SEGMENTS                 = $0DD1;
+  GL_MAP1_INDEX                         = $0D91;
+  GL_MAP1_NORMAL                        = $0D92;
+  GL_MAP1_TEXTURE_COORD_1               = $0D93;
+  GL_MAP1_TEXTURE_COORD_2               = $0D94;
+  GL_MAP1_TEXTURE_COORD_3               = $0D95;
+  GL_MAP1_TEXTURE_COORD_4               = $0D96;
+  GL_MAP1_VERTEX_3                      = $0D97;
+  GL_MAP1_VERTEX_4                      = $0D98;
+  GL_MAP2_COLOR_4                       = $0DB0;
+  GL_MAP2_GRID_DOMAIN                   = $0DD2;
+  GL_MAP2_GRID_SEGMENTS                 = $0DD3;
+  GL_MAP2_INDEX                         = $0DB1;
+  GL_MAP2_NORMAL                        = $0DB2;
+  GL_MAP2_TEXTURE_COORD_1               = $0DB3;
+  GL_MAP2_TEXTURE_COORD_2               = $0DB4;
+  GL_MAP2_TEXTURE_COORD_3               = $0DB5;
+  GL_MAP2_TEXTURE_COORD_4               = $0DB6;
+  GL_MAP2_VERTEX_3                      = $0DB7;
+  GL_MAP2_VERTEX_4                      = $0DB8;
+  GL_COEFF                              = $0A00;
+  GL_DOMAIN                             = $0A02;
+  GL_ORDER                              = $0A01;
+
+  // Hints
+  GL_FOG_HINT                           = $0C54;
+  GL_LINE_SMOOTH_HINT                   = $0C52;
+  GL_PERSPECTIVE_CORRECTION_HINT        = $0C50;
+  GL_POINT_SMOOTH_HINT                  = $0C51;
+  GL_POLYGON_SMOOTH_HINT                = $0C53;
+  GL_DONT_CARE                          = $1100;
+  GL_FASTEST                            = $1101;
+  GL_NICEST                             = $1102;
+
+  // Scissor box
+  GL_SCISSOR_TEST                       = $0C11;
+  GL_SCISSOR_BOX                        = $0C10;
+
+  // Pixel Mode / Transfer
+  GL_MAP_COLOR                          = $0D10;
+  GL_MAP_STENCIL                        = $0D11;
+  GL_INDEX_SHIFT                        = $0D12;
+  GL_INDEX_OFFSET                       = $0D13;
+  GL_RED_SCALE                          = $0D14;
+  GL_RED_BIAS                           = $0D15;
+  GL_GREEN_SCALE                        = $0D18;
+  GL_GREEN_BIAS                         = $0D19;
+  GL_BLUE_SCALE                         = $0D1A;
+  GL_BLUE_BIAS                          = $0D1B;
+  GL_ALPHA_SCALE                        = $0D1C;
+  GL_ALPHA_BIAS                         = $0D1D;
+  GL_DEPTH_SCALE                        = $0D1E;
+  GL_DEPTH_BIAS                         = $0D1F;
+  GL_PIXEL_MAP_S_TO_S_SIZE              = $0CB1;
+  GL_PIXEL_MAP_I_TO_I_SIZE              = $0CB0;
+  GL_PIXEL_MAP_I_TO_R_SIZE              = $0CB2;
+  GL_PIXEL_MAP_I_TO_G_SIZE              = $0CB3;
+  GL_PIXEL_MAP_I_TO_B_SIZE              = $0CB4;
+  GL_PIXEL_MAP_I_TO_A_SIZE              = $0CB5;
+  GL_PIXEL_MAP_R_TO_R_SIZE              = $0CB6;
+  GL_PIXEL_MAP_G_TO_G_SIZE              = $0CB7;
+  GL_PIXEL_MAP_B_TO_B_SIZE              = $0CB8;
+  GL_PIXEL_MAP_A_TO_A_SIZE              = $0CB9;
+  GL_PIXEL_MAP_S_TO_S                   = $0C71;
+  GL_PIXEL_MAP_I_TO_I                   = $0C70;
+  GL_PIXEL_MAP_I_TO_R                   = $0C72;
+  GL_PIXEL_MAP_I_TO_G                   = $0C73;
+  GL_PIXEL_MAP_I_TO_B                   = $0C74;
+  GL_PIXEL_MAP_I_TO_A                   = $0C75;
+  GL_PIXEL_MAP_R_TO_R                   = $0C76;
+  GL_PIXEL_MAP_G_TO_G                   = $0C77;
+  GL_PIXEL_MAP_B_TO_B                   = $0C78;
+  GL_PIXEL_MAP_A_TO_A                   = $0C79;
+  GL_PACK_ALIGNMENT                     = $0D05;
+  GL_PACK_LSB_FIRST                     = $0D01;
+  GL_PACK_ROW_LENGTH                    = $0D02;
+  GL_PACK_SKIP_PIXELS                   = $0D04;
+  GL_PACK_SKIP_ROWS                     = $0D03;
+  GL_PACK_SWAP_BYTES                    = $0D00;
+  GL_UNPACK_ALIGNMENT                   = $0CF5;
+  GL_UNPACK_LSB_FIRST                   = $0CF1;
+  GL_UNPACK_ROW_LENGTH                  = $0CF2;
+  GL_UNPACK_SKIP_PIXELS                 = $0CF4;
+  GL_UNPACK_SKIP_ROWS                   = $0CF3;
+  GL_UNPACK_SWAP_BYTES                  = $0CF0;
+  GL_ZOOM_X                             = $0D16;
+  GL_ZOOM_Y                             = $0D17;
+
+  // Texture mapping
+  GL_TEXTURE_ENV                        = $2300;
+  GL_TEXTURE_ENV_MODE                   = $2200;
+  GL_TEXTURE_1D                         = $0DE0;
+  GL_TEXTURE_2D                         = $0DE1;
+  GL_TEXTURE_WRAP_S                     = $2802;
+  GL_TEXTURE_WRAP_T                     = $2803;
+  GL_TEXTURE_MAG_FILTER                 = $2800;
+  GL_TEXTURE_MIN_FILTER                 = $2801;
+  GL_TEXTURE_ENV_COLOR                  = $2201;
+  GL_TEXTURE_GEN_S                      = $0C60;
+  GL_TEXTURE_GEN_T                      = $0C61;
+  GL_TEXTURE_GEN_MODE                   = $2500;
+  GL_TEXTURE_BORDER_COLOR               = $1004;
+  GL_TEXTURE_WIDTH                      = $1000;
+  GL_TEXTURE_HEIGHT                     = $1001;
+  GL_TEXTURE_BORDER                     = $1005;
+  GL_TEXTURE_COMPONENTS                 = $1003;
+  GL_TEXTURE_RED_SIZE                   = $805C;
+  GL_TEXTURE_GREEN_SIZE                 = $805D;
+  GL_TEXTURE_BLUE_SIZE                  = $805E;
+  GL_TEXTURE_ALPHA_SIZE                 = $805F;
+  GL_TEXTURE_LUMINANCE_SIZE             = $8060;
+  GL_TEXTURE_INTENSITY_SIZE             = $8061;
+  GL_NEAREST_MIPMAP_NEAREST             = $2700;
+  GL_NEAREST_MIPMAP_LINEAR              = $2702;
+  GL_LINEAR_MIPMAP_NEAREST              = $2701;
+  GL_LINEAR_MIPMAP_LINEAR               = $2703;
+  GL_OBJECT_LINEAR                      = $2401;
+  GL_OBJECT_PLANE                       = $2501;
+  GL_EYE_LINEAR                         = $2400;
+  GL_EYE_PLANE                          = $2502;
+  GL_SPHERE_MAP                         = $2402;
+  GL_DECAL                              = $2101;
+  GL_MODULATE                           = $2100;
+  GL_NEAREST                            = $2600;
+  GL_REPEAT                             = $2901;
+  GL_CLAMP                              = $2900;
+  GL_S                                  = $2000;
+  GL_T                                  = $2001;
+  GL_R                                  = $2002;
+  GL_Q                                  = $2003;
+  GL_TEXTURE_GEN_R                      = $0C62;
+  GL_TEXTURE_GEN_Q                      = $0C63;
+{$ENDIF GL1_0}
+
+{$IFDEF GL1_1}
+
+const
+  // GL 1.1 texturing
+  GL_PROXY_TEXTURE_1D                   = $8063;
+  GL_PROXY_TEXTURE_2D                   = $8064;
+  GL_TEXTURE_PRIORITY                   = $8066;
+  GL_TEXTURE_RESIDENT                   = $8067;
+  GL_TEXTURE_BINDING_1D                 = $8068;
+  GL_TEXTURE_BINDING_2D                 = $8069;
+  GL_TEXTURE_INTERNAL_FORMAT            = $1003;
+
+  // Internal texture formats (GL 1.1)
+  GL_ALPHA4                             = $803B;
+  GL_ALPHA8                             = $803C;
+  GL_ALPHA12                            = $803D;
+  GL_ALPHA16                            = $803E;
+  GL_LUMINANCE4                         = $803F;
+  GL_LUMINANCE8                         = $8040;
+  GL_LUMINANCE12                        = $8041;
+  GL_LUMINANCE16                        = $8042;
+  GL_LUMINANCE4_ALPHA4                  = $8043;
+  GL_LUMINANCE6_ALPHA2                  = $8044;
+  GL_LUMINANCE8_ALPHA8                  = $8045;
+  GL_LUMINANCE12_ALPHA4                 = $8046;
+  GL_LUMINANCE12_ALPHA12                = $8047;
+  GL_LUMINANCE16_ALPHA16                = $8048;
+  GL_INTENSITY                          = $8049;
+  GL_INTENSITY4                         = $804A;
+  GL_INTENSITY8                         = $804B;
+  GL_INTENSITY12                        = $804C;
+  GL_INTENSITY16                        = $804D;
+  GL_R3_G3_B2                           = $2A10;
+  GL_RGB4                               = $804F;
+  GL_RGB5                               = $8050;
+  GL_RGB8                               = $8051;
+  GL_RGB10                              = $8052;
+  GL_RGB12                              = $8053;
+  GL_RGB16                              = $8054;
+  GL_RGBA2                              = $8055;
+  GL_RGBA4                              = $8056;
+  GL_RGB5_A1                            = $8057;
+  GL_RGBA8                              = $8058;
+  GL_RGB10_A2                           = $8059;
+  GL_RGBA12                             = $805A;
+  GL_RGBA16                             = $805B;
+
+{$ENDIF GL1_1}
+
+{$IFDEF GL1_2}
+
+const
+  // GL 1.2 texturing
+  GL_PACK_SKIP_IMAGES                   = $806B;
+  GL_PACK_IMAGE_HEIGHT                  = $806C;
+  GL_UNPACK_SKIP_IMAGES                 = $806D;
+  GL_UNPACK_IMAGE_HEIGHT                = $806E;
+  GL_TEXTURE_3D                         = $806F;
+  GL_PROXY_TEXTURE_3D                   = $8070;
+  GL_TEXTURE_DEPTH                      = $8071;
+  GL_TEXTURE_WRAP_R                     = $8072;
+  GL_MAX_3D_TEXTURE_SIZE                = $8073;
+  GL_TEXTURE_BINDING_3D                 = $806A;
+
+const
+  GL_RESCALE_NORMAL                     = $803A;
+  GL_CLAMP_TO_EDGE                      = $812F;
+  GL_MAX_ELEMENTS_VERTICES              = $F0E8;
+  GL_MAX_ELEMENTS_INDICES               = $F0E9;
+  GL_BGR                                = $80E0;
+  GL_BGRA                               = $80E1;
+  GL_UNSIGNED_BYTE_3_3_2                = $8032;
+  GL_UNSIGNED_BYTE_2_3_3_REV            = $8362;
+  GL_UNSIGNED_SHORT_5_6_5               = $8363;
+  GL_UNSIGNED_SHORT_5_6_5_REV           = $8364;
+  GL_UNSIGNED_SHORT_4_4_4_4             = $8033;
+  GL_UNSIGNED_SHORT_4_4_4_4_REV         = $8365;
+  GL_UNSIGNED_SHORT_5_5_5_1             = $8034;
+  GL_UNSIGNED_SHORT_1_5_5_5_REV         = $8366;
+  GL_UNSIGNED_INT_8_8_8_8               = $8035;
+  GL_UNSIGNED_INT_8_8_8_8_REV           = $8367;
+  GL_UNSIGNED_INT_10_10_10_2            = $8036;
+  GL_UNSIGNED_INT_2_10_10_10_REV        = $8368;
+  GL_LIGHT_MODEL_COLOR_CONTROL          = $81F8;
+  GL_SINGLE_COLOR                       = $81F9;
+  GL_SEPARATE_SPECULAR_COLOR            = $81FA;
+  GL_TEXTURE_MIN_LOD                    = $813A;
+  GL_TEXTURE_MAX_LOD                    = $813B;
+  GL_TEXTURE_BASE_LEVEL                 = $813C;
+  GL_TEXTURE_MAX_LEVEL                  = $813D;
+
+{$ENDIF GL1_2}
+
+const
+  // Utility
+  GL_VENDOR                             = $1F00;
+  GL_RENDERER                           = $1F01;
+  GL_VERSION                            = $1F02;
+  GL_EXTENSIONS                         = $1F03;
+
+  // Errors
+  GL_INVALID_VALUE                      = $0501;
+  GL_INVALID_ENUM                       = $0500;
+  GL_INVALID_OPERATION                  = $0502;
+  GL_STACK_OVERFLOW                     = $0503;
+  GL_STACK_UNDERFLOW                    = $0504;
+  GL_OUT_OF_MEMORY                      = $0505;
+
+
+// -------------------------------------------------------
+//   GL extensions constants
+// -------------------------------------------------------
+
+{$IFDEF EXTENSIONS}
+
+const
+  // GL_EXT_blend_minmax and GL_EXT_blend_color
+  GL_CONSTANT_COLOR_EXT                 = $8001;
+  GL_ONE_MINUS_CONSTANT_COLOR_EXT       = $8002;
+  GL_CONSTANT_ALPHA_EXT                 = $8003;
+  GL_ONE_MINUS_CONSTANT_ALPHA_EXT       = $8004;
+  GL_BLEND_EQUATION_EXT                 = $8009;
+  GL_MIN_EXT                            = $8007;
+  GL_MAX_EXT                            = $8008;
+  GL_FUNC_ADD_EXT                       = $8006;
+  GL_FUNC_SUBTRACT_EXT                  = $800A;
+  GL_FUNC_REVERSE_SUBTRACT_EXT          = $800B;
+  GL_BLEND_COLOR_EXT                    = $8005;
+
+  // GL_EXT_polygon_offset
+  GL_POLYGON_OFFSET_EXT                 = $8037;
+  GL_POLYGON_OFFSET_FACTOR_EXT          = $8038;
+  GL_POLYGON_OFFSET_BIAS_EXT            = $8039;
+
+  // GL_EXT_vertex_array
+  GL_VERTEX_ARRAY_EXT                   = $8074;
+  GL_NORMAL_ARRAY_EXT                   = $8075;
+  GL_COLOR_ARRAY_EXT                    = $8076;
+  GL_INDEX_ARRAY_EXT                    = $8077;
+  GL_TEXTURE_COORD_ARRAY_EXT            = $8078;
+  GL_EDGE_FLAG_ARRAY_EXT                = $8079;
+  GL_VERTEX_ARRAY_SIZE_EXT              = $807A;
+  GL_VERTEX_ARRAY_TYPE_EXT              = $807B;
+  GL_VERTEX_ARRAY_STRIDE_EXT            = $807C;
+  GL_VERTEX_ARRAY_COUNT_EXT             = $807D;
+  GL_NORMAL_ARRAY_TYPE_EXT              = $807E;
+  GL_NORMAL_ARRAY_STRIDE_EXT            = $807F;
+  GL_NORMAL_ARRAY_COUNT_EXT             = $8080;
+  GL_COLOR_ARRAY_SIZE_EXT               = $8081;
+  GL_COLOR_ARRAY_TYPE_EXT               = $8082;
+  GL_COLOR_ARRAY_STRIDE_EXT             = $8083;
+  GL_COLOR_ARRAY_COUNT_EXT              = $8084;
+  GL_INDEX_ARRAY_TYPE_EXT               = $8085;
+  GL_INDEX_ARRAY_STRIDE_EXT             = $8086;
+  GL_INDEX_ARRAY_COUNT_EXT              = $8087;
+  GL_TEXTURE_COORD_ARRAY_SIZE_EXT       = $8088;
+  GL_TEXTURE_COORD_ARRAY_TYPE_EXT       = $8089;
+  GL_TEXTURE_COORD_ARRAY_STRIDE_EXT     = $808A;
+  GL_TEXTURE_COORD_ARRAY_COUNT_EXT      = $808B;
+  GL_EDGE_FLAG_ARRAY_STRIDE_EXT         = $808C;
+  GL_EDGE_FLAG_ARRAY_COUNT_EXT          = $808D;
+  GL_VERTEX_ARRAY_POINTER_EXT           = $808E;
+  GL_NORMAL_ARRAY_POINTER_EXT           = $808F;
+  GL_COLOR_ARRAY_POINTER_EXT            = $8090;
+  GL_INDEX_ARRAY_POINTER_EXT            = $8091;
+  GL_TEXTURE_COORD_ARRAY_POINTER_EXT    = $8092;
+  GL_EDGE_FLAG_ARRAY_POINTER_EXT        = $8093;
+
+  // GL_EXT_texture_object
+  GL_TEXTURE_PRIORITY_EXT               = $8066;
+  GL_TEXTURE_RESIDENT_EXT               = $8067;
+  GL_TEXTURE_1D_BINDING_EXT             = $8068;
+  GL_TEXTURE_2D_BINDING_EXT             = $8069;
+
+  // GL_EXT_texture3D
+  GL_PACK_SKIP_IMAGES_EXT               = $806B;
+  GL_PACK_IMAGE_HEIGHT_EXT              = $806C;
+  GL_UNPACK_SKIP_IMAGES_EXT             = $806D;
+  GL_UNPACK_IMAGE_HEIGHT_EXT            = $806E;
+  GL_TEXTURE_3D_EXT                     = $806F;
+  GL_PROXY_TEXTURE_3D_EXT               = $8070;
+  GL_TEXTURE_DEPTH_EXT                  = $8071;
+  GL_TEXTURE_WRAP_R_EXT                 = $8072;
+  GL_MAX_3D_TEXTURE_SIZE_EXT            = $8073;
+  GL_TEXTURE_3D_BINDING_EXT             = $806A;
+
+  // GL_EXT_paletted_texture
+  GL_TABLE_TOO_LARGE_EXT                = $8031;
+  GL_COLOR_TABLE_FORMAT_EXT             = $80D8;
+  GL_COLOR_TABLE_WIDTH_EXT              = $80D9;
+  GL_COLOR_TABLE_RED_SIZE_EXT           = $80DA;
+  GL_COLOR_TABLE_GREEN_SIZE_EXT         = $80DB;
+  GL_COLOR_TABLE_BLUE_SIZE_EXT          = $80DC;
+  GL_COLOR_TABLE_ALPHA_SIZE_EXT         = $80DD;
+  GL_COLOR_TABLE_LUMINANCE_SIZE_EXT     = $80DE;
+  GL_COLOR_TABLE_INTENSITY_SIZE_EXT     = $80DF;
+  GL_TEXTURE_INDEX_SIZE_EXT             = $80ED;
+  GL_COLOR_INDEX1_EXT                   = $80E2;
+  GL_COLOR_INDEX2_EXT                   = $80E3;
+  GL_COLOR_INDEX4_EXT                   = $80E4;
+  GL_COLOR_INDEX8_EXT                   = $80E5;
+  GL_COLOR_INDEX12_EXT                  = $80E6;
+  GL_COLOR_INDEX16_EXT                  = $80E7;
+
+  // GL_EXT_shared_texture_palette
+  GL_SHARED_TEXTURE_PALETTE_EXT         = $81FB;
+
+  // GL_EXT_point_parameters
+  GL_POINT_SIZE_MIN_EXT                 = $8126;
+  GL_POINT_SIZE_MAX_EXT                 = $8127;
+  GL_POINT_FADE_THRESHOLD_SIZE_EXT      = $8128;
+  GL_DISTANCE_ATTENUATION_EXT           = $8129;
+
+  // GL_EXT_rescale_normal
+  GL_RESCALE_NORMAL_EXT                 = $803A;
+
+  // GL_EXT_abgr
+  GL_ABGR_EXT                           = $8000;
+
+const
+  // GL_EXT_multitexture
+  GL_SELECTED_TEXTURE_EXT               = $83C0;
+  GL_SELECTED_TEXTURE_COORD_SET_EXT     = $83C1;
+  GL_SELECTED_TEXTURE_TRANSFORM_EXT     = $83C2;
+  GL_MAX_TEXTURES_EXT                   = $83C3;
+  GL_MAX_TEXTURE_COORD_SETS_EXT         = $83C4;
+  GL_TEXTURE_ENV_COORD_SET_EXT          = $83C5;
+  GL_TEXTURE0_EXT                       = $83C6;
+  GL_TEXTURE1_EXT                       = $83C7;
+  GL_TEXTURE2_EXT                       = $83C8;
+  GL_TEXTURE3_EXT                       = $83C9;
+
+{$ENDIF EXTENSIONS}
+
+{$IFDEF SGI_EXTENSIONS}
+
+const
+  // GL_SGIS_multitexture
+  GL_SELECTED_TEXTURE_SGIS              = $835C;
+  GL_SELECTED_TEXTURE_COORD_SET_SGIS    = $835D;
+  GL_MAX_TEXTURES_SGIS                  = $835E;
+  GL_TEXTURE0_SGIS                      = $835F;
+  GL_TEXTURE1_SGIS                      = $8360;
+  GL_TEXTURE2_SGIS                      = $8361;
+  GL_TEXTURE3_SGIS                      = $8362;
+  GL_TEXTURE_COORD_SET_SOURCE_SGIS      = $8363;
+
+const
+  // GL_SGIS_texture_edge_clamp
+  GL_CLAMP_TO_EDGE_SGIS                 = $812F;
+
+{$ENDIF SGI_EXTENSIONS}
+
+{$IFDEF MESA}
+{$ENDIF MESA}
+
+
+// -------------------------------------------------------
+//   GL procedures and functions
+// -------------------------------------------------------
+
+{$IFDEF GL1_0}
+// Miscellaneous
+procedure glClearIndex(c: Single); ogl_dll;
+procedure glClearColor(red, green, blue, alpha: GLclampf); ogl_dll;
+procedure glClear(mask: GLbitfield); ogl_dll;
+procedure glIndexMask(mask: LongWord); ogl_dll;
+procedure glColorMask(red, green, blue, alpha: GLboolean); ogl_dll;
+procedure glAlphaFunc(func: GLenum; ref: GLclampf); ogl_dll;
+procedure glBlendFunc(sfactor, dfactor: GLenum); ogl_dll;
+procedure glLogicOp(opcode: GLenum); ogl_dll;
+procedure glCullFace(mode: GLenum); ogl_dll;
+procedure glFrontFace(mode: GLenum); ogl_dll;
+procedure glPointSize(size: Single); ogl_dll;
+procedure glLineWidth(width: Single); ogl_dll;
+procedure glLineStipple(factor: LongInt; pattern: Word); ogl_dll;
+procedure glPolygonMode(face, mode: GLenum); ogl_dll;
+procedure glPolygonOffset(factor, units: Single); ogl_dll;
+procedure glPolygonStipple(var mask: Byte); ogl_dll;
+procedure glGetPolygonStipple(var mask: Byte); ogl_dll;
+procedure glEdgeFlag(flag: GLBoolean); ogl_dll;
+procedure glEdgeFlagv(var flag: GLBoolean); ogl_dll;
+procedure glScissor(x, y, width, height: LongInt); ogl_dll;
+procedure glClipPlane(plane: GLenum; var equation: Double); ogl_dll;
+procedure glGetClipPlane(plane: GLenum; var equation: Double); ogl_dll;
+procedure glDrawBuffer(mode: GLenum); ogl_dll;
+procedure glReadBuffer(mode: GLenum); ogl_dll;
+procedure glEnable(cap: LongInt); ogl_dll;
+procedure glDisable(cap: LongInt); ogl_dll;
+function glIsEnabled(cap: GLenum): GLBoolean; ogl_dll;
+procedure glGetBooleanv(pname: GLenum; params : PGLBoolean); ogl_dll;
+procedure glGetDoublev(pname: GLenum; params : PDouble); ogl_dll;
+procedure glGetFloatv(pname: GLenum; params : PSingle); ogl_dll;
+procedure glGetIntegerv(pname: GLenum; params : PLongInt); ogl_dll;
+procedure glPushAttrib(mask: GLbitfield); ogl_dll;
+procedure glPopAttrib; ogl_dll;
+function glRenderMode(mode: GLenum): LongInt; ogl_dll;
+function glGetError: GLenum; ogl_dll;
+function glGetString(name: GLenum): PChar; ogl_dll;
+procedure glFinish; ogl_dll;
+procedure glFlush; ogl_dll;
+procedure glHint(target, mode: GLenum); ogl_dll;
+
+// Depth Buffer
+procedure glClearDepth(depth: GLclampd); ogl_dll;
+procedure glDepthFunc(func: LongInt); ogl_dll;
+procedure glDepthMask(flag: GLBoolean); ogl_dll;
+procedure glDepthRange(near_val, far_val: GLclampd); ogl_dll;
+
+// Accumulation Buffer
+procedure glClearAccum(red, green, blue, alpha: Single); ogl_dll;
+procedure glAccum(op: GLenum; value: Single); ogl_dll;
+
+// Tranformation
+procedure glMatrixMode(mode: GLenum); ogl_dll;
+procedure glOrtho(left, right, bottom, top, near_val, far_val: Double); ogl_dll;
+procedure glFrustum(left, right, bottom, top, near_val, far_val: Double); ogl_dll;
+procedure glViewport(x, y, width, height: LongInt); ogl_dll;
+procedure glPushMatrix; ogl_dll;
+procedure glPopMatrix; ogl_dll;
+procedure glLoadIdentity; ogl_dll;
+procedure glLoadMatrixd(var m: Double); ogl_dll;
+procedure glLoadMatrixf(var m: PSingle); ogl_dll;
+procedure glMultMatrixd(var m: Double); ogl_dll;
+procedure glMultMatrixf(var m: Single); ogl_dll;
+procedure glRotated(angle, x, y, z: Double); ogl_dll;
+procedure glRotatef(angle, x, y, z: Single); ogl_dll;
+procedure glScaled(x, y, z: Double); ogl_dll;
+procedure glScalef(x, y, z: Single); ogl_dll;
+procedure glTranslated(x, y, z: Double); ogl_dll;
+procedure glTranslatef(x, y, z: Single); ogl_dll;
+
+// Display Lists
+function glIsList(list: LongWord): GLBoolean; ogl_dll;
+procedure glDeleteLists(list: LongWord; range: LongInt); ogl_dll;
+function glGenLists(range: LongInt): LongWord; ogl_dll;
+procedure glNewList(list: LongWord; mode: GLenum); ogl_dll;
+procedure glEndList; ogl_dll;
+procedure glCallList(list: LongWord); ogl_dll;
+procedure glCallLists(n: LongInt; AType: GLenum; var lists); ogl_dll;
+procedure glListBase(base: LongWord); ogl_dll;
+
+// Drawing Functions
+procedure glBegin(mode: GLenum); ogl_dll;
+procedure glEnd; ogl_dll;
+procedure glVertex2d(x, y: Double); ogl_dll;
+procedure glVertex2f(x, y: Single); ogl_dll;
+procedure glVertex2i(x, y: LongInt); ogl_dll;
+procedure glVertex2s(x, y: SmallInt); ogl_dll;
+procedure glVertex3d(x, y, z: Double); ogl_dll;
+procedure glVertex3f(x, y, z: Single); ogl_dll;
+procedure glVertex3i(x, y, z: LongInt); ogl_dll;
+procedure glVertex3s(x, y, z: SmallInt); ogl_dll;
+procedure glVertex4d(x, y, z, w: Double); ogl_dll;
+procedure glVertex4f(x, y, z, w: Single); ogl_dll;
+procedure glVertex4i(x, y, z, w: LongInt); ogl_dll;
+procedure glVertex4s(x, y, z, w: SmallInt); ogl_dll;
+procedure glVertex2dv(var v: Double); ogl_dll;
+procedure glVertex2fv(var v: Single); ogl_dll;
+procedure glVertex2iv(var v: LongInt); ogl_dll;
+procedure glVertex2sv(var v: SmallInt); ogl_dll;
+procedure glVertex3dv(var v: Double); ogl_dll;
+procedure glVertex3fv(var v: Single); ogl_dll;
+procedure glVertex3iv(var v: LongInt); ogl_dll;
+procedure glVertex3sv(var v: SmallInt); ogl_dll;
+procedure glVertex4dv(var v: Double); ogl_dll;
+procedure glVertex4fv(var v: Single); ogl_dll;
+procedure glVertex4iv(var v: LongInt); ogl_dll;
+procedure glVertex4sv(var v: SmallInt); ogl_dll;
+procedure glNormal3b(nx, ny, nz: Byte); ogl_dll;
+procedure glNormal3d(nx, ny, nz: Double); ogl_dll;
+procedure glNormal3f(nx, ny, nz: Single); ogl_dll;
+procedure glNormal3i(nx, ny, nz: LongInt); ogl_dll;
+procedure glNormal3s(nx, ny, nz: SmallInt); ogl_dll;
+procedure glNormal3bv(var v: ShortInt); ogl_dll;
+procedure glNormal3dv(var v: Double); ogl_dll;
+procedure glNormal3fv(var v: Single); ogl_dll;
+procedure glNormal3iv(var v: LongInt); ogl_dll;
+procedure glNormal3sv(var v: SmallInt); ogl_dll;
+procedure glIndexd(c: Double); ogl_dll;
+procedure glIndexf(c: Single); ogl_dll;
+procedure glIndexi(c: LongInt); ogl_dll;
+procedure glIndexs(c: SmallInt); ogl_dll;
+procedure glIndexdv(var c: Double); ogl_dll;
+procedure glIndexfv(var c: Single); ogl_dll;
+procedure glIndexiv(var c: LongInt); ogl_dll;
+procedure glIndexsv(var c: SmallInt); ogl_dll;
+procedure  glColor3b(red, green, blue: ShortInt); ogl_dll;
+procedure  glColor3d(red, green, blue: Double); ogl_dll;
+procedure  glColor3f(red, green, blue: Single); ogl_dll;
+procedure  glColor3i(red, green, blue: LongInt); ogl_dll;
+procedure  glColor3s(red, green, blue: SmallInt); ogl_dll;
+procedure glColor3ub(red, green, blue: Byte); ogl_dll;
+procedure glColor3ui(red, green, blue: LongWord); ogl_dll;
+procedure glColor3us(red, green, blue: Word); ogl_dll;
+procedure  glColor4b(red, green, blue, alpha: ShortInt); ogl_dll;
+procedure  glColor4d(red, green, blue, alpha: Double); ogl_dll;
+procedure  glColor4f(red, green, blue, alpha: Single); ogl_dll;
+procedure  glColor4i(red, green, blue, alpha: LongInt); ogl_dll;
+procedure  glColor4s(red, green, blue, alpha: SmallInt); ogl_dll;
+procedure glColor4ub(red, green, blue, alpha: Byte); ogl_dll;
+procedure glColor4ui(red, green, blue, alpha: LongWord); ogl_dll;
+procedure glColor4us(red, green, blue, alpha: Word); ogl_dll;
+procedure  glColor3bv(var v: ShortInt); ogl_dll;
+procedure  glColor3dv(var v: Double); ogl_dll;
+procedure  glColor3fv(var v: Single); ogl_dll;
+procedure  glColor3iv(var v: LongInt); ogl_dll;
+procedure  glColor3sv(var v: SmallInt); ogl_dll;
+procedure glColor3ubv(var v: Byte); ogl_dll;
+procedure glColor3uiv(var v: LongWord); ogl_dll;
+procedure glColor3usv(var v: Word); ogl_dll;
+procedure  glColor4bv(var v: ShortInt); ogl_dll;
+procedure  glColor4dv(var v: Double); ogl_dll;
+procedure  glColor4fv(var v: Single); ogl_dll;
+procedure  glColor4iv(var v: LongInt); ogl_dll;
+procedure  glColor4sv(var v: SmallInt); ogl_dll;
+procedure glColor4ubv(var v: Byte); ogl_dll;
+procedure glColor4uiv(var v: LongWord); ogl_dll;
+procedure glColor4usv(var v: Word); ogl_dll;
+procedure glTexCoord1d(s: Double); ogl_dll;
+procedure glTexCoord1f(s: Single); ogl_dll;
+procedure glTexCoord1i(s: LongInt); ogl_dll;
+procedure glTexCoord1s(s: SmallInt); ogl_dll;
+procedure glTexCoord2d(s, t: Double); ogl_dll;
+procedure glTexCoord2f(s, t: Single); ogl_dll;
+procedure glTexCoord2i(s, t: LongInt); ogl_dll;
+procedure glTexCoord2s(s, t: SmallInt); ogl_dll;
+procedure glTexCoord3d(s, t, r: Double); ogl_dll;
+procedure glTexCoord3f(s, t, r: Single); ogl_dll;
+procedure glTexCoord3i(s, t, r: LongInt); ogl_dll;
+procedure glTexCoord3s(s, t, r: SmallInt); ogl_dll;
+procedure glTexCoord4d(s, t, r, q: Double); ogl_dll;
+procedure glTexCoord4f(s, t, r, q: Single); ogl_dll;
+procedure glTexCoord4i(s, t, r, q: LongInt); ogl_dll;
+procedure glTexCoord4s(s, t, r, q: SmallInt); ogl_dll;
+procedure glTexCoord1dv(var v: Double); ogl_dll;
+procedure glTexCoord1fv(var v: Single); ogl_dll;
+procedure glTexCoord1iv(var v: LongInt); ogl_dll;
+procedure glTexCoord1sv(var v: SmallInt); ogl_dll;
+procedure glTexCoord2dv(var v: Double); ogl_dll;
+procedure glTexCoord2fv(var v: Single); ogl_dll;
+procedure glTexCoord2iv(var v: LongInt); ogl_dll;
+procedure glTexCoord2sv(var v: SmallInt); ogl_dll;
+procedure glTexCoord3dv(var v: Double); ogl_dll;
+procedure glTexCoord3fv(var v: Single); ogl_dll;
+procedure glTexCoord3iv(var v: LongInt); ogl_dll;
+procedure glTexCoord3sv(var v: SmallInt); ogl_dll;
+procedure glTexCoord4dv(var v: Double); ogl_dll;
+procedure glTexCoord4fv(var v: Single); ogl_dll;
+procedure glTexCoord4iv(var v: LongInt); ogl_dll;
+procedure glTexCoord4sv(var v: SmallInt); ogl_dll;
+procedure glRasterPos2d(x, y: Double); ogl_dll;
+procedure glRasterPos2f(x, y: Single); ogl_dll;
+procedure glRasterPos2i(x, y: LongInt); ogl_dll;
+procedure glRasterPos2s(x, y: SmallInt); ogl_dll;
+procedure glRasterPos3d(x, y, z: Double); ogl_dll;
+procedure glRasterPos3f(x, y, z: Single); ogl_dll;
+procedure glRasterPos3i(x, y, z: LongInt); ogl_dll;
+procedure glRasterPos3s(x, y, z: SmallInt); ogl_dll;
+procedure glRasterPos4d(x, y, z, w: Double); ogl_dll;
+procedure glRasterPos4f(x, y, z, w: Single); ogl_dll;
+procedure glRasterPos4i(x, y, z, w: LongInt); ogl_dll;
+procedure glRasterPos4s(x, y, z, w: SmallInt); ogl_dll;
+procedure glRasterPos2dv(var v: Double); ogl_dll;
+procedure glRasterPos2fv(var v: Single); ogl_dll;
+procedure glRasterPos2iv(var v: LongInt); ogl_dll;
+procedure glRasterPos2sv(var v: SmallInt); ogl_dll;
+procedure glRasterPos3dv(var v: Double); ogl_dll;
+procedure glRasterPos3fv(var v: Single); ogl_dll;
+procedure glRasterPos3iv(var v: LongInt); ogl_dll;
+procedure glRasterPos3sv(var v: SmallInt); ogl_dll;
+procedure glRasterPos4dv(var v: Double); ogl_dll;
+procedure glRasterPos4fv(var v: Single); ogl_dll;
+procedure glRasterPos4iv(var v: LongInt); ogl_dll;
+procedure glRasterPos4sv(var v: SmallInt); ogl_dll;
+procedure glRectd(x1, y1, x2, y2: Double); ogl_dll;
+procedure glRectf(x1, y1, x2, y2: Single); ogl_dll;
+procedure glRecti(x1, y1, x2, y2: LongInt); ogl_dll;
+procedure glRects(x1, y1, x2, y2: SmallInt); ogl_dll;
+procedure glRectdv(var v1, v2: Double); ogl_dll;
+procedure glRectfv(var v1, v2: Single); ogl_dll;
+procedure glRectiv(var v1, v2: LongInt); ogl_dll;
+procedure glRectsv(var v1, v2: SmallInt); ogl_dll;
+
+// Lighting
+procedure glShadeModel(mode: GLenum); ogl_dll;
+procedure glLightf(light, pname: GLenum; param: Single); ogl_dll;
+procedure glLighti(light, pname: GLenum; param: LongInt); ogl_dll;
+procedure glLightfv(light, pname: GLenum; params : PSingle); ogl_dll;
+procedure glLightiv(light, pname: GLenum; params : PLongInt); ogl_dll;
+procedure glGetLightfv(light, pname: GLenum; params : PSingle); ogl_dll;
+procedure glGetLightiv(light, pname: GLenum; params : PLongInt); ogl_dll;
+procedure glLightModelf(pname: GLenum; param: Single); ogl_dll;
+procedure glLightModeli(pname: GLenum; param: LongInt); ogl_dll;
+procedure glLightModelfv(pname: GLenum; params : PSingle); ogl_dll;
+procedure glLightModeliv(pname: GLenum; params : PLongInt); ogl_dll;
+procedure glMaterialf(face, pname: GLenum; param: Single); ogl_dll;
+procedure glMateriali(face, pname: GLenum; param: LongInt); ogl_dll;
+procedure glMaterialfv(face, pname: GLenum; params : PSingle); ogl_dll;
+procedure glMaterialiv(face, pname: GLenum; params : PLongInt); ogl_dll;
+procedure glGetMaterialfv(face, pname: GLenum; params : PSingle); ogl_dll;
+procedure glGetMaterialiv(face, pname: GLenum; params : PLongInt); ogl_dll;
+procedure glColorMaterial(face, mode: GLenum); ogl_dll;
+
+// Raster Functions
+procedure glPixelZoom(xfactor, yfactor: Single); ogl_dll;
+procedure glPixelStoref(pname: GLenum; param: Single); ogl_dll;
+procedure glPixelStorei(pname: GLenum; param: LongInt); ogl_dll;
+procedure glPixelTransferf(pname: GLenum; param: Single); ogl_dll;
+procedure glPixelTransferi(pname: GLenum; param: LongInt); ogl_dll;
+procedure glPixelMapfv(map: GLenum; mapsize: LongInt; var values: Single); ogl_dll;
+procedure glPixelMapuiv(map: GLenum; mapsize: LongInt; var values: LongWord); ogl_dll;
+procedure glPixelMapusv(map: GLenum; mapsize: LongInt; var values: Word); ogl_dll;
+procedure glGetPixelMapfv(map: GLenum; var values: Single); ogl_dll;
+procedure glGetPixelMapuiv(map: GLenum; var values: LongWord); ogl_dll;
+procedure glGetPixelMapusv(map: GLenum; var values: Word); ogl_dll;
+procedure glBitmap(width, height: LongInt; xorig, yorig, xmove, ymove: Single; var bitmap); ogl_dll;
+procedure glReadPixels(x, y, width, height: LongInt; format, AType: GLenum; var pixels); ogl_dll;
+procedure glDrawPixels(width, height: LongInt; format, AType: GLenum; var pixels); ogl_dll;
+procedure glCopyPixels(x, y, width, height: LongInt; AType: GLenum); ogl_dll;
+
+// Stenciling
+procedure glStencilFunc(func: GLenum; ref: LongInt; mask: LongWord); ogl_dll;
+procedure glStencilMask(mask: LongWord); ogl_dll;
+procedure glStencilOp(fail, zfail, zpass: GLenum); ogl_dll;
+procedure glClearStencil(s: LongInt); ogl_dll;
+
+// Texture Mapping
+procedure glTexGend(cord, pname: GLenum; param: Double); ogl_dll;
+procedure glTexGenf(cord, pname: GLenum; param: Single); ogl_dll;
+procedure glTexGeni(cord, pname: GLenum; param: LongInt); ogl_dll;
+procedure glTexGendv(cord, pname: GLenum; params : PDouble); ogl_dll;
+procedure glTexGenfv(cord, pname: GLenum; params : PSingle); ogl_dll;
+procedure glTexGeniv(cord, pname: GLenum; params : PLongInt); ogl_dll;
+procedure glGetTexGendv(cord, pname: GLenum; params : PDouble); ogl_dll;
+procedure glGetTexGenfv(cord, pname: GLenum; params : PSingle); ogl_dll;
+procedure glGetTexGeniv(cord, pname: GLenum; params : PLongInt); ogl_dll;
+procedure glTexEnvf(target, pname: GLenum; param: Single); ogl_dll;
+procedure glTexEnvi(target, pname: GLenum; param: LongInt); ogl_dll;
+procedure glTexEnvfv(target, pname: GLenum; params : PSingle); ogl_dll;
+procedure glTexEnviv(target, pname: GLenum; params : PLongInt); ogl_dll;
+procedure glGetTexEnvfv(target, pname: GLenum; params : PSingle); ogl_dll;
+procedure glGetTexEnviv(target, pname: GLenum; params : PLongInt); ogl_dll;
+procedure glTexParameterf(target, pname: GLenum; param: Single); ogl_dll;
+procedure glTexParameteri(target, pname: GLenum; param: LongInt); ogl_dll;
+procedure glTexParameterfv(target, pname: GLenum; params : PSingle); ogl_dll;
+procedure glTexParameteriv(target, pname: GLenum; params : PLongInt); ogl_dll;
+procedure glGetTexParameterfv(target, pname: GLenum; params : PSingle); ogl_dll;
+procedure glGetTexParameteriv(target, pname: GLenum; params : PLongInt); ogl_dll;
+procedure glGetTexLevelParameterfv(target: GLenum; level: LongInt; pname: GLenum; params : PSingle); ogl_dll;
+procedure glGetTexLevelParameteriv(target: GLenum; level: LongInt; pname: GLenum; params : PLongInt); ogl_dll;
+procedure glTexImage1D(target: GLenum; level, internalFormat, width, border: LongInt; format, AType: GLenum; var pixels); ogl_dll;
+procedure glTexImage2D(target: GLenum; level, internalFormat, width, height, border: LongInt; format, AType: GLenum; var pixels); ogl_dll;
+procedure glGetTexImage(target: GLenum; level: LongInt; format, AType: GLenum; var pixels); ogl_dll;
+
+// Evaluators
+procedure glMap1d(target: GLenum; u1, u2: Double; stride, order: LongInt; var points: Double); ogl_dll;
+procedure glMap1f(target: GLenum; u1, u2: Single; stride, order: LongInt; var points: Single); ogl_dll;
+procedure glMap2d(target: GLenum; u1, u2: Double; ustride, uorder: LongInt; v1, v2: Double; vstride, vorder: LongInt; var points: Double); ogl_dll;
+procedure glMap2f(target: GLenum; u1, u2: Single; ustride, uorder: LongInt; v1, v2: Single; vstride, vorder: LongInt; var points: Single); ogl_dll;
+procedure glGetMapdv(target, query: GLenum; var v: Double); ogl_dll;
+procedure glGetMapfv(target, query: GLenum; var v: Single); ogl_dll;
+procedure glGetMapiv(target, query: GLenum; var v: LongInt); ogl_dll;
+procedure glEvalCoord1d(u: Double); ogl_dll;
+procedure glEvalCoord1f(u: Single); ogl_dll;
+procedure glEvalCoord1dv(var u: Double); ogl_dll;
+procedure glEvalCoord1fv(var u: Single); ogl_dll;
+procedure glEvalCoord2d(u, v: Double); ogl_dll;
+procedure glEvalCoord2f(u, v: Single); ogl_dll;
+procedure glEvalCoord2dv(var u, v: Double); ogl_dll;
+procedure glEvalCoord2fv(var u, v: Single); ogl_dll;
+procedure glMapGrid1d(un: LongInt; u1, u2: Double); ogl_dll;
+procedure glMapGrid1f(un: LongInt; u1, u2: Single); ogl_dll;
+procedure glMapGrid2d(un: LongInt; u1, u2: Double; vn: LongInt; v1, v2: Double); ogl_dll;
+procedure glMapGrid2f(un: LongInt; u1, u2: Single; vn: LongInt; v1, v2: Single); ogl_dll;
+procedure glEvalPoint1(i: LongInt); ogl_dll;
+procedure glEvalPoint2(i, j: LongInt); ogl_dll;
+procedure glEvalMesh1(mode: GLenum; i1, i2: LongInt); ogl_dll;
+procedure glEvalMesh2(mode: GLenum; i1, i2, j1, j2: LongInt); ogl_dll;
+
+// Fog
+procedure glFogf(pname: GLenum; param: Single); ogl_dll;
+procedure glFogi(pname: GLenum; param: LongInt); ogl_dll;
+procedure glFogfv(pname: GLenum; params : PSingle); ogl_dll;
+procedure glFogiv(pname: GLenum; params : PLongInt); ogl_dll;
+
+// Selection and Feedback
+procedure glFeedbackBuffer(size: LongInt; AType: GLenum; var buffer: Single); ogl_dll;
+procedure glPassThrough(token: Single); ogl_dll;
+procedure glSelectBuffer(size: LongInt; var buffer: LongWord); ogl_dll;
+procedure glInitNames; ogl_dll;
+procedure glLoadName(name: LongWord); ogl_dll;
+procedure glPushName(name: LongWord); ogl_dll;
+procedure glPopName; ogl_dll;
+
+{$ENDIF GL1_0}
+
+{$IFDEF GL1_1}
+
+// Miscellaneous
+procedure glEnableClientState(cap: GLenum); ogl_dll;
+procedure glDisableClientState(cap: GLenum); ogl_dll;
+procedure glPushClientAttrib(mask: GLbitfield); ogl_dll;
+procedure glPopClientAttrib; ogl_dll;
+
+// Drawing Functions
+procedure glIndexub(c: Byte); ogl_dll;
+procedure glIndexubv(var c: Byte); ogl_dll;
+
+// Vertex Arrays
+procedure glVertexPointer(size: LongInt; AType: GLenum; stride: LongInt; var ptr); ogl_dll;
+procedure glNormalPointer(AType: GLenum; stride: LongInt; var ptr); ogl_dll;
+procedure glColorPointer(size: LongInt; AType: GLenum; stride: LongInt; var ptr); ogl_dll;
+procedure glIndexPointer(AType: GLenum; stride: LongInt; var ptr); ogl_dll;
+procedure glTexCoordPointer(size: LongInt; AType: GLenum; stride: LongInt; var ptr); ogl_dll;
+procedure glEdgeFlagPointer(stride: LongInt; var ptr); ogl_dll;
+procedure glGetPointerv(pname: GLenum; var params: Pointer); ogl_dll;
+procedure glArrayElement(i: LongInt); ogl_dll;
+procedure glDrawArrays(mode: GLenum; first, count: LongInt); ogl_dll;
+procedure glDrawElements(mode: GLenum; count: Integer; AType: GLenum; var indices); ogl_dll;
+procedure glInterleavedArrays(format: GLenum; stride: LongInt; var pointer); ogl_dll;
+
+// Texture Mapping
+procedure glGenTextures(n: LongInt; var textures: LongWord); ogl_dll;
+procedure glDeleteTextures(n: LongInt; var textures: LongWord); ogl_dll;
+procedure glBindTexture(target: GLenum; texture: LongWord); ogl_dll;
+procedure glPrioritizeTextures(n: LongInt; var textures: LongWord; var priorities: GLclampf); ogl_dll;
+function glAreTexturesResident(n: LongInt; var textures: LongWord; var residences: Boolean): Boolean; ogl_dll;
+function glIsTexture(texture: LongWord): Boolean; ogl_dll;
+procedure glTexSubImage1D(target: GLenum; level, xoffset, width: LongInt; format, AType: GLenum; var pixels); ogl_dll;
+procedure glTexSubImage2D(target: GLenum; level, xoffset, yoffset, width, height: LongInt; format, AType: GLenum; var pixels); ogl_dll;
+procedure glCopyTexImage1D(target: GLenum; level: LongInt; format: GLenum; x, y, width, border: LongInt); ogl_dll;
+procedure glCopyTexImage2D(target: GLenum; level: LongInt; format: GLenum; x, y, width, height, border: LongInt); ogl_dll;
+procedure glCopyTexSubImage1D(target: GLenum; level, xoffset, x, y, width: LongInt); ogl_dll;
+procedure glCopyTexSubImage2D(target: GLenum; level, xoffset, yoffset, x, y, width, height: LongInt); ogl_dll;
+
+{$ENDIF GL1_1}
+
+{$IFDEF GL1_2}
+procedure glDrawRangeElements(mode: GLenum; AStart, AEnd: LongWord; count: LongInt; AType: GLenum; var indices); ogl_dll;
+procedure glTexImage3D(target: GLenum; level: LongInt; internalFormat: GLenum; width, height, depth, border: LongInt; format, AType: GLEnum; var pixels); ogl_dll;
+procedure glTexSubImage3D(target: GLenum; level: LongInt; xoffset, yoffset, zoffset, width, height, depth: LongInt; format, AType: GLEnum; var pixels); ogl_dll;
+procedure glCopyTexSubImage3D(target: GLenum; level: LongInt; xoffset, yoffset, zoffset, x, y, width, height: LongInt); ogl_dll;
+{$ENDIF GL1_2}
+
+
+// -------------------------------------------------------
+//   GL Extensions
+// -------------------------------------------------------
+
+{$IFDEF EXTENSIONS}
+
+// === 1.0 Extensions ===
+
+// GL_EXT_blend_minmax
+procedure glBlendEquationEXT(mode: GLenum); ogl_dll;
+
+// GL_EXT_blend_color
+procedure glBlendColorEXT(red, green, blue, alpha: GLclampf); ogl_dll;
+
+// GL_EXT_polygon_offset
+procedure glPolygonOffsetEXT(factor, bias: Single); ogl_dll;
+
+// GL_EXT_vertex_array
+procedure glVertexPointerEXT(size: LongInt; AType: GLenum; stride, count: LongInt; var ptr); ogl_dll;
+procedure glNormalPointerEXT(AType: GLenum; stride, count: LongInt; var ptr); ogl_dll;
+procedure glColorPointerEXT(size: LongInt; AType: GLenum; stride, count: LongInt; var ptr); ogl_dll;
+procedure glIndexPointerEXT(AType: GLenum; stride, count: LongInt; var ptr); ogl_dll;
+procedure glTexCoordPointerEXT(size: LongInt; AType: GLenum; stride, count: LongInt; var ptr); ogl_dll;
+procedure glEdgeFlagPointerEXT(stride, count: LongInt; var ptr: Boolean); ogl_dll;
+procedure glGetPointervEXT(pname: GLenum; var params: Pointer); ogl_dll;
+procedure glArrayElementEXT(i: LongInt); ogl_dll;
+procedure glDrawArraysEXT(mode: GLEnum; first, count: LongInt); ogl_dll;
+
+// GL_EXT_texture_object
+procedure glGenTexturesEXT(n: LongInt; var textures: LongWord); ogl_dll;
+procedure glDeleteTexturesEXT(n: LongInt; var textures: LongWord); ogl_dll;
+procedure glBindTextureEXT(target: GLenum; texture: LongWord); ogl_dll;
+procedure glPrioritizeTexturesEXT(n: LongInt; var textures: LongWord; var priorities: GLClampf); ogl_dll;
+function glAreTexturesResidentEXT(n: LongInt; var textures: LongWord; var residences: Boolean): Boolean; ogl_dll;
+function glIsTextureEXT(texture: LongWord): Boolean; ogl_dll;
+
+// GL_EXT_texture3D
+procedure glTexImage3DEXT(target: GLenum; level: LongInt; internalFormat: GLenum; width, height, depth, border: LongInt; format, AType: GLenum; var pixels); ogl_dll;
+procedure glTexSubImage3DEXT(target: GLenum; level, xoffset, yoffset, zoffset, width, height, depth: LongInt; format, AType: GLenum; var pixels); ogl_dll;
+procedure glCopyTexSubImage3DEXT(target: GLenum; level, xoffset, yoffset, zoffset, x, y, width, height: LongInt); ogl_dll;
+
+// GL_EXT_color_table
+procedure glColorTableEXT(target, internalformat: GLenum; width: LongInt; format, AType: GLenum; var table); ogl_dll;
+procedure glColorSubTableEXT(target: GLenum; start, count: LongInt; format, AType: GLEnum; var data); ogl_dll;
+procedure glGetColorTableEXT(target, format, AType: GLenum; var table); ogl_dll;
+procedure glGetColorTableParameterfvEXT(target, pname: GLenum; var params: Single); ogl_dll;
+procedure glGetColorTableParameterivEXT(target, pname: GLenum; var params: LongInt); ogl_dll;
+
+{$ENDIF EXTENSIONS}
+
+// library dependent extensions
+
+{$IFDEF SGI_EXTENSIONS}
+
+// GL_SGIS_multitexture
+procedure glMultiTexCoord1dSGIS(target: GLenum; s: Double); ogl_dll;
+procedure glMultiTexCoord1dvSGIS(target: GLenum; var v: Double); ogl_dll;
+procedure glMultiTexCoord1fSGIS(target: GLenum; s: Single); ogl_dll;
+procedure glMultiTexCoord1fvSGIS(target: GLenum; var v: Single); ogl_dll;
+procedure glMultiTexCoord1iSGIS(target: GLenum; s: LongInt); ogl_dll;
+procedure glMultiTexCoord1ivSGIS(target: GLenum; var v: LongInt); ogl_dll;
+procedure glMultiTexCoord1sSGIS(target: GLenum; s: ShortInt); ogl_dll;
+procedure glMultiTexCoord1svSGIS(target: GLenum; var v: ShortInt); ogl_dll;
+procedure glMultiTexCoord2dSGIS(target: GLenum; s, t: Double); ogl_dll;
+procedure glMultiTexCoord2dvSGIS(target: GLenum; var v: Double); ogl_dll;
+procedure glMultiTexCoord2fSGIS(target: GLenum; s, t: Single); ogl_dll;
+procedure glMultiTexCoord2fvSGIS(target: GLenum; var v: Single); ogl_dll;
+procedure glMultiTexCoord2iSGIS(target: GLenum; s, t: LongInt); ogl_dll;
+procedure glMultiTexCoord2ivSGIS(target: GLenum; var v: LongInt); ogl_dll;
+procedure glMultiTexCoord2sSGIS(target: GLenum; s, t: ShortInt); ogl_dll;
+procedure glMultiTexCoord2svSGIS(target: GLenum; var v: ShortInt); ogl_dll;
+procedure glMultiTexCoord3dSGIS(target: GLenum; s, t, r: Double); ogl_dll;
+procedure glMultiTexCoord3dvSGIS(target: GLenum; var v: Double); ogl_dll;
+procedure glMultiTexCoord3fSGIS(target: GLenum; s, t, r: Single); ogl_dll;
+procedure glMultiTexCoord3fvSGIS(target: GLenum; var v: Single); ogl_dll;
+procedure glMultiTexCoord3iSGIS(target: GLenum; s, t, r: LongInt); ogl_dll;
+procedure glMultiTexCoord3ivSGIS(target: GLenum; var v: LongInt); ogl_dll;
+procedure glMultiTexCoord3sSGIS(target: GLenum; s, t, r: ShortInt); ogl_dll;
+procedure glMultiTexCoord3svSGIS(target: GLenum; var v: ShortInt); ogl_dll;
+procedure glMultiTexCoord4dSGIS(target: GLenum; s, t, r, q: Double); ogl_dll;
+procedure glMultiTexCoord4dvSGIS(target: GLenum; var v: Double); ogl_dll;
+procedure glMultiTexCoord4fSGIS(target: GLenum; s, t, r, q: Single); ogl_dll;
+procedure glMultiTexCoord4fvSGIS(target: GLenum; var v: Single); ogl_dll;
+procedure glMultiTexCoord4iSGIS(target: GLenum; s, t, r, q: LongInt); ogl_dll;
+procedure glMultiTexCoord4ivSGIS(target: GLenum; var v: LongInt); ogl_dll;
+procedure glMultiTexCoord4sSGIS(target: GLenum; s, t, r, q: ShortInt); ogl_dll;
+procedure glMultiTexCoord4svSGIS(target: GLenum; var v: ShortInt); ogl_dll;
+procedure glMultiTexCoordPointerSGIS(target: GLenum; size: LongInt; AType: GLEnum; stride: LongInt; var APointer); ogl_dll;
+procedure glSelectTextureSGIS(target: GLenum); ogl_dll;
+procedure glSelectTextureCoordSetSGIS(target: GLenum); ogl_dll;
+
+// GL_EXT_multitexture
+procedure glMultiTexCoord1dEXT(target: GLenum; s: Double); ogl_dll;
+procedure glMultiTexCoord1dvEXT(target: GLenum; var v: Double); ogl_dll;
+procedure glMultiTexCoord1fEXT(target: GLenum; s: Single); ogl_dll;
+procedure glMultiTexCoord1fvEXT(target: GLenum; var v: Single); ogl_dll;
+procedure glMultiTexCoord1iEXT(target: GLenum; s: LongInt); ogl_dll;
+procedure glMultiTexCoord1ivEXT(target: GLenum; var v: LongInt); ogl_dll;
+procedure glMultiTexCoord1sEXT(target: GLenum; s: ShortInt); ogl_dll;
+procedure glMultiTexCoord1svEXT(target: GLenum; var v: ShortInt); ogl_dll;
+procedure glMultiTexCoord2dEXT(target: GLenum; s, t: Double); ogl_dll;
+procedure glMultiTexCoord2dvEXT(target: GLenum; var v: Double); ogl_dll;
+procedure glMultiTexCoord2fEXT(target: GLenum; s, t: Single); ogl_dll;
+procedure glMultiTexCoord2fvEXT(target: GLenum; var v: Single); ogl_dll;
+procedure glMultiTexCoord2iEXT(target: GLenum; s, t: LongInt); ogl_dll;
+procedure glMultiTexCoord2ivEXT(target: GLenum; var v: LongInt); ogl_dll;
+procedure glMultiTexCoord2sEXT(target: GLenum; s, t: ShortInt); ogl_dll;
+procedure glMultiTexCoord2svEXT(target: GLenum; var v: ShortInt); ogl_dll;
+procedure glMultiTexCoord3dEXT(target: GLenum; s, t, r: Double); ogl_dll;
+procedure glMultiTexCoord3dvEXT(target: GLenum; var v: Double); ogl_dll;
+procedure glMultiTexCoord3fEXT(target: GLenum; s, t, r: Single); ogl_dll;
+procedure glMultiTexCoord3fvEXT(target: GLenum; var v: Single); ogl_dll;
+procedure glMultiTexCoord3iEXT(target: GLenum; s, t, r: LongInt); ogl_dll;
+procedure glMultiTexCoord3ivEXT(target: GLenum; var v: LongInt); ogl_dll;
+procedure glMultiTexCoord3sEXT(target: GLenum; s, t, r: ShortInt); ogl_dll;
+procedure glMultiTexCoord3svEXT(target: GLenum; var v: ShortInt); ogl_dll;
+procedure glMultiTexCoord4dEXT(target: GLenum; s, t, r, q: Double); ogl_dll;
+procedure glMultiTexCoord4dvEXT(target: GLenum; var v: Double); ogl_dll;
+procedure glMultiTexCoord4fEXT(target: GLenum; s, t, r, q: Single); ogl_dll;
+procedure glMultiTexCoord4fvEXT(target: GLenum; var v: Single); ogl_dll;
+procedure glMultiTexCoord4iEXT(target: GLenum; s, t, r, q: LongInt); ogl_dll;
+procedure glMultiTexCoord4ivEXT(target: GLenum; var v: LongInt); ogl_dll;
+procedure glMultiTexCoord4sEXT(target: GLenum; s, t, r, q: ShortInt); ogl_dll;
+procedure glMultiTexCoord4svEXT(target: GLenum; var v: ShortInt); ogl_dll;
+procedure glInterleavedTextureCoordSetsEXT(factor: LongInt); ogl_dll;
+procedure glSelectTextureEXT(target: GLenum); ogl_dll;
+procedure glSelectTextureCoordSetEXT(target: GLenum); ogl_dll;
+procedure glSelectTextureTransformEXT(target: GLenum); ogl_dll;
+
+// GL_EXT_point_parameters
+procedure glPointParameterfEXT(pname: GLenum; param: Single); ogl_dll;
+procedure glPointParameterfvEXT(pname: GLenum; var params: Single); ogl_dll;
+
+{$ENDIF SGI_EXTENSIONS}
+
+{$ifdef MESA}
+// GL_MESA_window_pos
+procedure glWindowPos2iMESA(x, y: LongInt); ogl_dll;
+procedure glWindowPos2sMESA(x, y: ShortInt); ogl_dll;
+procedure glWindowPos2fMESA(x, y: Single); ogl_dll;
+procedure glWindowPos2dMESA(x, y: Double); ogl_dll;
+procedure glWindowPos2ivMESA(var p: LongInt); ogl_dll;
+procedure glWindowPos2svMESA(var p: ShortInt); ogl_dll;
+procedure glWindowPos2fvMESA(var p: Single); ogl_dll;
+procedure glWindowPos2dvMESA(var p: Double); ogl_dll;
+procedure glWindowPos3iMESA(x, y, z: LongInt); ogl_dll;
+procedure glWindowPos3sMESA(x, y, z: ShortInt); ogl_dll;
+procedure glWindowPos3fMESA(x, y, z: Single); ogl_dll;
+procedure glWindowPos3dMESA(x, y, z: Double); ogl_dll;
+procedure glWindowPos3ivMESA(var p: LongInt); ogl_dll;
+procedure glWindowPos3svMESA(var p: ShortInt); ogl_dll;
+procedure glWindowPos3fvMESA(var p: Single); ogl_dll;
+procedure glWindowPos3dvMESA(var p: Double); ogl_dll;
+procedure glWindowPos4iMESA(x, y, z, w: LongInt); ogl_dll;
+procedure glWindowPos4sMESA(x, y, z, w: ShortInt); ogl_dll;
+procedure glWindowPos4fMESA(x, y, z, w: Single); ogl_dll;
+procedure glWindowPos4dMESA(x, y, z, w: Double); ogl_dll;
+procedure glWindowPos4ivMESA(var p: LongInt); ogl_dll;
+procedure glWindowPos4svMESA(var p: ShortInt); ogl_dll;
+procedure glWindowPos4fvMESA(var p: Single); ogl_dll;
+procedure glWindowPos4dvMESA(var p: Double); ogl_dll;
+
+// GL_MESA_resize_buffers
+procedure glResizeBuffersMESA; ogl_dll;
+{$endif MESA}
+
+
+// =======================================================
+// =======================================================
+
+implementation
+
+{BEGIN}{OF INIT}
+END.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:46  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}

+ 513 - 0
packages/opengl/win32/glaux.pp

@@ -0,0 +1,513 @@
+{
+  $Id$
+
+  Translation of the GLaux headers for FreePascal
+  Version for static linking in Win32 environment by Alexander Stohr.
+  Latest change: 1999-11-13
+
+  Further information:
+
+  GLaux is an outdated toolkit from SGI and later used by Microsoft.
+}
+{*++ BUILD Version: 0004    // Increment this if a change has global effects
+
+Copyright (c) 1985-95, Microsoft Corporation
+
+Module Name:
+
+    glaux.h
+
+Abstract:
+
+    Procedure declarations, constant definitions and macros for the OpenGL
+    Auxiliary Library.
+
+--*}
+{*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ *}
+
+{$MODE delphi}
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+{$define WINNT}
+{$define GLauximp}
+{x$define UNICODE}
+
+unit GLaux; { version which does statically linking }
+
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glaux_dll := external 'Glauximp.dll'}
+  {$DEFINE glaux_callback := cdecl}
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+USES
+  windows,
+  GL;
+{
+}
+
+TYPE
+  LPCSTR  = Pointer;   { pointer on a zero terminated string }
+  LPCWSTR = Pointer;   { pointer on a zero terminated unicode string }
+
+{*
+** ToolKit Window Types
+** In the future, AUX_RGBA may be a combination of both RGB and ALPHA
+*}
+
+const
+    AUX_RGB             = 0;
+    AUX_RGBA            = AUX_RGB;
+    AUX_INDEX           = 1;
+    AUX_SINGLE          = 0;
+    AUX_DOUBLE          = 2;
+    AUX_DIRECT          = 0;
+    AUX_INDIRECT        = 4;
+
+    AUX_ACCUM           = 8;
+    AUX_ALPHA           = 16;
+    AUX_DEPTH24         = 32;      {* 24-bit depth buffer *}
+    AUX_STENCIL         = 64;
+    AUX_AUX             = 128;
+    AUX_DEPTH16         = 256;     {* 16-bit depth buffer *}
+    AUX_FIXED_332_PAL   = 512;
+    AUX_DEPTH           = AUX_DEPTH16; {* default is 16-bit depth buffer *}
+
+{*
+** Window Masks
+*}
+
+{ These have been macros and were converted to boolean funtions }
+FUNCTION AUX_WIND_IS_RGB            (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_INDEX          (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_SINGLE         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_DOUBLE         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_INDIRECT       (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_DIRECT         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_ACCUM         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_ALPHA         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_DEPTH         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_STENCIL       (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_USES_FIXED_332_PAL(x : DWORD) : BOOLEAN;
+
+{*
+** ToolKit Event Structure
+*}
+type
+    AUX_EVENTREC = RECORD
+    {BEGIN}
+        event : GLint;
+        data  : ARRAY[0..3] OF GLint;
+    END;
+
+{*
+** ToolKit Event Types
+*}
+CONST
+    AUX_EXPOSE      = 1;
+    AUX_CONFIG      = 2;
+    AUX_DRAW        = 4;
+    AUX_KEYEVENT    = 8;
+    AUX_MOUSEDOWN   = 16;
+    AUX_MOUSEUP     = 32;
+    AUX_MOUSELOC    = 64;
+
+{*
+** Toolkit Event Data Indices
+*}
+    AUX_WINDOWX             = 0;
+    AUX_WINDOWY             = 1;
+    AUX_MOUSEX              = 0;
+    AUX_MOUSEY              = 1;
+    AUX_MOUSESTATUS         = 3;
+    AUX_KEY                 = 0;
+    AUX_KEYSTATUS           = 1;
+
+{*
+** ToolKit Event Status Messages
+*}
+    AUX_LEFTBUTTON          = 1;
+    AUX_RIGHTBUTTON         = 2;
+    AUX_MIDDLEBUTTON        = 4;
+    AUX_SHIFT               = 1;
+    AUX_CONTROL             = 2;
+
+{*
+** ToolKit Key Codes
+*}
+    AUX_RETURN              = #$0D;
+    AUX_ESCAPE              = #$1B;
+    AUX_SPACE               = #$20;
+    AUX_LEFT                = #$25;
+    AUX_UP                  = #$26;
+    AUX_RIGHT               = #$27;
+    AUX_DOWN                = #$28;
+    AUX_A                   = 'A';
+    AUX_B                   = 'B';
+    AUX_C                   = 'C';
+    AUX_D                   = 'D';
+    AUX_E                   = 'E';
+    AUX_F                   = 'F';
+    AUX_G                   = 'G';
+    AUX_H                   = 'H';
+    AUX_I                   = 'I';
+    AUX_J                   = 'J';
+    AUX_K                   = 'K';
+    AUX_L                   = 'L';
+    AUX_M                   = 'M';
+    AUX_N                   = 'N';
+    AUX_O                   = 'O';
+    AUX_P                   = 'P';
+    AUX_Q                   = 'Q';
+    AUX_R                   = 'R';
+    AUX_S                   = 'S';
+    AUX_T                   = 'T';
+    AUX_U                   = 'U';
+    AUX_V                   = 'V';
+    AUX_W                   = 'W';
+    AUX_X                   = 'X';
+    AUX_Y                   = 'Y';
+    AUX_Z                   = 'Z';
+    AUX_a_                  = 'a';
+    AUX_b_                  = 'b';
+    AUX_c_                  = 'c';
+    AUX_d_                  = 'd';
+    AUX_e_                  = 'e';
+    AUX_f_                  = 'f';
+    AUX_g_                  = 'g';
+    AUX_h_                  = 'h';
+    AUX_i_                  = 'i';
+    AUX_j_                  = 'j';
+    AUX_k_                  = 'k';
+    AUX_l_                  = 'l';
+    AUX_m_                  = 'm';
+    AUX_n_                  = 'n';
+    AUX_o_                  = 'o';
+    AUX_p_                  = 'p';
+    AUX_q_                  = 'q';
+    AUX_r_                  = 'r';
+    AUX_s_                  = 's';
+    AUX_t_                  = 't';
+    AUX_u_                  = 'u';
+    AUX_v_                  = 'v';
+    AUX_w_                  = 'w';
+    AUX_x_                  = 'x';
+    AUX_y_                  = 'y';
+    AUX_z_                  = 'z';
+    AUX_0                   = '0';
+    AUX_1                   = '1';
+    AUX_2                   = '2';
+    AUX_3                   = '3';
+    AUX_4                   = '4';
+    AUX_5                   = '5';
+    AUX_6                   = '6';
+    AUX_7                   = '7';
+    AUX_8                   = '8';
+    AUX_9                   = '9';
+
+{*
+** ToolKit Gets and Sets
+*}
+    AUX_FD                  = 1;  {* return fd (long) *}
+    AUX_COLORMAP            = 3;  {* pass buf of r, g and b (unsigned char) *}
+    AUX_GREYSCALEMAP        = 4;
+    AUX_FOGMAP              = 5;  {* pass fog and color bits (long) *}
+    AUX_ONECOLOR            = 6;  {* pass index, r, g, and b (long) *}
+
+{*
+** Color Macros
+*}
+
+    AUX_BLACK               = 0;
+    AUX_RED                 = 13;
+    AUX_GREEN               = 14;
+    AUX_YELLOW              = 15;
+    AUX_BLUE                = 16;
+    AUX_MAGENTA             = 17;
+    AUX_CYAN                = 18;
+    AUX_WHITE               = 19;
+
+{ this was a macro and is now a procedure }
+{ PROCEDURE AUX_SETCOLOR(x, y); - TODO }
+
+{*
+** RGB Image Structure
+*}
+
+type
+    AUX_RGBImageRec = RECORD
+    {BEGIN}
+        sizeX, sizeY : GLint;
+        data : ^BYTE;
+    END;
+    pAUX_RGBImageRec = ^AUX_RGBImageRec;
+
+{*
+** Prototypes
+*}
+
+Procedure auxInitDisplayMode(mode:GLenum); glaux_dll;
+Procedure auxInitPosition(x,y,w,h:Integer); glaux_dll;
+
+{$ifndef WINNT}
+FUNCTION  auxInitWindow(name:LPCSTR)  : GLenum; glaux_dll;
+{$else}
+{$ifdef UNICODE }
+FUNCTION  auxInitWindow (name:LPCWSTR) : GLenum; glaux_dll name 'auxInitWindowW';
+{$else}
+FUNCTION  auxInitWindow (name:LPCSTR)  : GLenum; glaux_dll name 'auxInitWindowA';
+{$endif}
+FUNCTION  auxInitWindowA(name:LPCSTR)  : GLenum; glaux_dll;
+FUNCTION  auxInitWindowW(name:LPCWSTR) : GLenum; glaux_dll;
+{$endif}
+
+PROCEDURE auxCloseWindow; glaux_dll;
+PROCEDURE auxQuit;        glaux_dll;
+PROCEDURE auxSwapBuffers; glaux_dll;
+
+{ callbacks }
+type
+  TAUXMAINPROC    = PROCEDURE;                           glaux_callback;
+  TAUXEXPOSEPROC  = PROCEDURE(w, h : integer);           glaux_callback;
+  TAUXRESHAPEPROC = PROCEDURE(w, h : GLsizei);           glaux_callback;
+  TAUXIDLEPROC    = PROCEDURE;                           glaux_callback;
+  TAUXKEYPROC     = PROCEDURE;                           glaux_callback;
+  TAUXMOUSEPROC   = PROCEDURE(VAR event : AUX_EVENTREC); glaux_callback;
+
+{ callback setup routines }
+PROCEDURE auxMainLoop   (func : TAUXMAINPROC); glaux_dll;
+PROCEDURE auxExposeFunc (func : TAUXEXPOSEPROC); glaux_dll;
+PROCEDURE auxReshapeFunc(func : TAUXRESHAPEPROC); glaux_dll;
+PROCEDURE auxIdleFunc   (func : TAUXIDLEPROC); glaux_dll;
+PROCEDURE auxKeyFunc    (val : integer; func : TAUXKEYPROC); glaux_dll;
+PROCEDURE auxMouseFunc  (v1, v2 :integer; func : TAUXMOUSEPROC); glaux_dll;
+
+FUNCTION  auxGetColorMapSize : integer; glaux_dll;
+PROCEDURE auxGetMouseLoc(var x, y : integer); glaux_dll;
+PROCEDURE auxSetOneColor(id : integer; r, g, b : GLfloat); glaux_dll;
+PROCEDURE auxSetFogRamp(v1, v2 : integer); glaux_dll;
+PROCEDURE auxSetGreyRamp; glaux_dll;
+PROCEDURE auxSetRGBMap(id : integer; var map : GLfloat); glaux_dll;
+
+{$ifndef WINNT}
+FUNCTION auxRGBImageLoad(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+{$else}
+{$ifndef GLAUXIMP}{ not present in GLauximp.dll }
+{$ifdef UNICODE}
+FUNCTION auxRGBImageLoad (name : LPCWSTR): pAUX_RGBImageRec; glaux_dll name 'auxRGBImageLoadW';
+{$else}
+FUNCTION auxRGBImageLoad (name : LPCSTR) : pAUX_RGBImageRec; glaux_dll name 'auxRGBImageLoadA';
+{$endif}
+FUNCTION auxRGBImageLoadA(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+FUNCTION auxRGBImageLoadW(name : LPCWSTR): pAUX_RGBImageRec; glaux_dll;
+{$endif}
+{$endif}
+
+{$ifndef WINNT}
+{ this function is Windows specific! }
+FUNCTION auxDIBImageLoad(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+{$else}
+{$ifndef GLAUXIMP}{ not present in GLauximp.dll }
+{$ifdef UNICODE }
+FUNCTION auxDIBImageLoad (name : LPCWSTR): pAUX_RGBImageRec; glaux_dll name 'auxDIBImageLoadW';
+{$else}
+FUNCTION auxDIBImageLoad (name : LPCSTR) : pAUX_RGBImageRec; glaux_dll name 'auxDIBImageLoadA';
+{$endif}
+FUNCTION auxDIBImageLoadA(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+FUNCTION auxDIBImageLoadW(name : LPCWSTR): pAUX_RGBImageRec; glaux_dll;
+{$endif}
+{$endif}
+
+PROCEDURE auxCreateFont; glaux_dll;
+
+{$ifndef WINNT}
+PROCEDURE auxDrawStr (name : LPCSTR);  glaux_dll;
+{$else}
+{$ifndef GLAUXIMP}{ not present in GLauximp.dll }
+{$ifdef UNICODE }
+PROCEDURE auxDrawStr (name : LPCWSTR); glaux_dll name 'auxDrawStrW';
+{$else}
+PROCEDURE auxDrawStr (name : LPCSTR);  glaux_dll name 'auxDrawStrA';
+{$endif}
+PROCEDURE auxDrawStrA(name : LPCSTR);  glaux_dll;
+PROCEDURE auxDrawStrW(name : LPCWSTR); glaux_dll;
+{$endif}
+{$endif}
+
+PROCEDURE auxWireSphere(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidSphere(v : GLdouble); glaux_dll;
+PROCEDURE auxWireCube(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidCube(v : GLdouble); glaux_dll;
+PROCEDURE auxWireBox(v1, v2, v3 : GLdouble); glaux_dll;
+PROCEDURE auxSolidBox(v1, v2, v3 : GLdouble); glaux_dll;
+PROCEDURE auxWireTorus(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxSolidTorus(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxWireCylinder(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxSolidCylinder(v1, v2 :  GLdouble); glaux_dll;
+PROCEDURE auxWireIcosahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidIcosahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireOctahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidOctahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireTetrahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidTetrahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireDodecahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidDodecahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireCone(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxSolidCone(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxWireTeapot(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidTeapot(v: GLdouble); glaux_dll;
+
+{*
+** Window specific functions
+** hwnd, hdc, and hglrc valid after auxInitWindow()
+*}
+FUNCTION  auxGetHWND : HWND; glaux_dll;
+FUNCTION  auxGetHDC : HDC; glaux_dll;
+FUNCTION  auxGetHGLRC : HGLRC; glaux_dll;
+
+{*
+** Viewperf support functions and constants
+*}
+{* Display Mode Selection Criteria *}
+
+CONST { was an unnamed enum }
+    AUX_USE_ID                  = 1;
+    AUX_EXACT_MATCH             = 2;
+    AUX_MINIMUM_CRITERIA        = 3;
+
+PROCEDURE auxInitDisplayModePolicy(val : GLenum); glaux_dll;
+FUNCTION  auxInitDisplayModeID(val : GLint) : GLenum; glaux_dll;
+FUNCTION  auxGetDisplayModePolicy : GLenum; glaux_dll;
+FUNCTION  auxGetDisplayModeID : GLint; glaux_dll;
+FUNCTION  auxGetDisplayMode : GLenum; glaux_dll;
+
+
+implementation
+
+{ these functions are resolved macros -
+  they should be "inline" if compile can do this }
+
+FUNCTION AUX_WIND_IS_RGB(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_RGB := ((x AND AUX_INDEX) = 0);
+END;
+
+FUNCTION AUX_WIND_IS_INDEX(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_INDEX := ((x AND AUX_INDEX) <> 0);
+END;
+
+FUNCTION AUX_WIND_IS_SINGLE(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_SINGLE := ((x AND AUX_DOUBLE) = 0);
+END;
+
+FUNCTION AUX_WIND_IS_DOUBLE(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_DOUBLE := ((x AND AUX_DOUBLE) <> 0);
+END;
+
+FUNCTION AUX_WIND_IS_INDIRECT(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_INDIRECT := ((x AND AUX_INDIRECT) <> 0);
+END;
+
+FUNCTION AUX_WIND_IS_DIRECT(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_DIRECT := ((x AND AUX_INDIRECT) = 0);
+END;
+
+FUNCTION AUX_WIND_HAS_ACCUM(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_ACCUM := ((x AND AUX_ACCUM) <> 0);
+END;
+
+FUNCTION AUX_WIND_HAS_ALPHA(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_ALPHA := ((x AND AUX_ALPHA) <> 0);
+END;
+
+FUNCTION AUX_WIND_HAS_DEPTH(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_DEPTH := ((x AND (AUX_DEPTH24 OR AUX_DEPTH16)) <> 0);
+END;
+
+FUNCTION AUX_WIND_HAS_STENCIL(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_STENCIL := ((x AND AUX_STENCIL) <> 0);
+END;
+
+FUNCTION AUX_WIND_USES_FIXED_332_PAL(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_USES_FIXED_332_PAL := ((x AND AUX_FIXED_332_PAL) <> 0);
+END;
+
+{extern float auxRGBMap[20][3];
+
+PROCEDURE AUX_SETCOLOR(x, y);
+BEGIN
+  IF (AUX_WIND_IS_RGB((x))
+  THEN glColor3fv(auxRGBMap[y])
+  ELSE glIndexf(y));
+END;
+ - TODO}
+
+
+{begin{of init}
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:46  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}

+ 513 - 0
packages/opengl/win32/glaux_sl.pp

@@ -0,0 +1,513 @@
+{
+  $Id$
+
+  Translation of the GLaux headers for FreePascal
+  Version for static linking in Win32 environment by Alexander Stohr.
+  Latest change: 1999-11-13
+
+  Further information:
+
+  GLaux is an outdated toolkit from SGI and later used by Microsoft.
+}
+{*++ BUILD Version: 0004    // Increment this if a change has global effects
+
+Copyright (c) 1985-95, Microsoft Corporation
+
+Module Name:
+
+    glaux.h
+
+Abstract:
+
+    Procedure declarations, constant definitions and macros for the OpenGL
+    Auxiliary Library.
+
+--*}
+{*
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ *}
+
+{$MODE delphi}
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+{$define WINNT}
+{$define GLauximp}
+{x$define UNICODE}
+
+unit GLaux_SL; { version which does statically linking }
+
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glaux_dll := external 'Glauximp.dll'}
+  {$DEFINE glaux_callback := cdecl}
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+USES
+  windows,
+  GL;
+{
+}
+
+TYPE
+  LPCSTR  = Pointer;   { pointer on a zero terminated string }
+  LPCWSTR = Pointer;   { pointer on a zero terminated unicode string }
+
+{*
+** ToolKit Window Types
+** In the future, AUX_RGBA may be a combination of both RGB and ALPHA
+*}
+
+const
+    AUX_RGB             = 0;
+    AUX_RGBA            = AUX_RGB;
+    AUX_INDEX           = 1;
+    AUX_SINGLE          = 0;
+    AUX_DOUBLE          = 2;
+    AUX_DIRECT          = 0;
+    AUX_INDIRECT        = 4;
+
+    AUX_ACCUM           = 8;
+    AUX_ALPHA           = 16;
+    AUX_DEPTH24         = 32;      {* 24-bit depth buffer *}
+    AUX_STENCIL         = 64;
+    AUX_AUX             = 128;
+    AUX_DEPTH16         = 256;     {* 16-bit depth buffer *}
+    AUX_FIXED_332_PAL   = 512;
+    AUX_DEPTH           = AUX_DEPTH16; {* default is 16-bit depth buffer *}
+
+{*
+** Window Masks
+*}
+
+{ These have been macros and were converted to boolean funtions }
+FUNCTION AUX_WIND_IS_RGB            (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_INDEX          (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_SINGLE         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_DOUBLE         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_INDIRECT       (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_IS_DIRECT         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_ACCUM         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_ALPHA         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_DEPTH         (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_HAS_STENCIL       (x : DWORD) : BOOLEAN;
+FUNCTION AUX_WIND_USES_FIXED_332_PAL(x : DWORD) : BOOLEAN;
+
+{*
+** ToolKit Event Structure
+*}
+type
+    AUX_EVENTREC = RECORD
+    {BEGIN}
+        event : GLint;
+        data  : ARRAY[0..3] OF GLint;
+    END;
+
+{*
+** ToolKit Event Types
+*}
+CONST
+    AUX_EXPOSE      = 1;
+    AUX_CONFIG      = 2;
+    AUX_DRAW        = 4;
+    AUX_KEYEVENT    = 8;
+    AUX_MOUSEDOWN   = 16;
+    AUX_MOUSEUP     = 32;
+    AUX_MOUSELOC    = 64;
+
+{*
+** Toolkit Event Data Indices
+*}
+    AUX_WINDOWX             = 0;
+    AUX_WINDOWY             = 1;
+    AUX_MOUSEX              = 0;
+    AUX_MOUSEY              = 1;
+    AUX_MOUSESTATUS         = 3;
+    AUX_KEY                 = 0;
+    AUX_KEYSTATUS           = 1;
+
+{*
+** ToolKit Event Status Messages
+*}
+    AUX_LEFTBUTTON          = 1;
+    AUX_RIGHTBUTTON         = 2;
+    AUX_MIDDLEBUTTON        = 4;
+    AUX_SHIFT               = 1;
+    AUX_CONTROL             = 2;
+
+{*
+** ToolKit Key Codes
+*}
+    AUX_RETURN              = #$0D;
+    AUX_ESCAPE              = #$1B;
+    AUX_SPACE               = #$20;
+    AUX_LEFT                = #$25;
+    AUX_UP                  = #$26;
+    AUX_RIGHT               = #$27;
+    AUX_DOWN                = #$28;
+    AUX_A                   = 'A';
+    AUX_B                   = 'B';
+    AUX_C                   = 'C';
+    AUX_D                   = 'D';
+    AUX_E                   = 'E';
+    AUX_F                   = 'F';
+    AUX_G                   = 'G';
+    AUX_H                   = 'H';
+    AUX_I                   = 'I';
+    AUX_J                   = 'J';
+    AUX_K                   = 'K';
+    AUX_L                   = 'L';
+    AUX_M                   = 'M';
+    AUX_N                   = 'N';
+    AUX_O                   = 'O';
+    AUX_P                   = 'P';
+    AUX_Q                   = 'Q';
+    AUX_R                   = 'R';
+    AUX_S                   = 'S';
+    AUX_T                   = 'T';
+    AUX_U                   = 'U';
+    AUX_V                   = 'V';
+    AUX_W                   = 'W';
+    AUX_X                   = 'X';
+    AUX_Y                   = 'Y';
+    AUX_Z                   = 'Z';
+    AUX_a_                  = 'a';
+    AUX_b_                  = 'b';
+    AUX_c_                  = 'c';
+    AUX_d_                  = 'd';
+    AUX_e_                  = 'e';
+    AUX_f_                  = 'f';
+    AUX_g_                  = 'g';
+    AUX_h_                  = 'h';
+    AUX_i_                  = 'i';
+    AUX_j_                  = 'j';
+    AUX_k_                  = 'k';
+    AUX_l_                  = 'l';
+    AUX_m_                  = 'm';
+    AUX_n_                  = 'n';
+    AUX_o_                  = 'o';
+    AUX_p_                  = 'p';
+    AUX_q_                  = 'q';
+    AUX_r_                  = 'r';
+    AUX_s_                  = 's';
+    AUX_t_                  = 't';
+    AUX_u_                  = 'u';
+    AUX_v_                  = 'v';
+    AUX_w_                  = 'w';
+    AUX_x_                  = 'x';
+    AUX_y_                  = 'y';
+    AUX_z_                  = 'z';
+    AUX_0                   = '0';
+    AUX_1                   = '1';
+    AUX_2                   = '2';
+    AUX_3                   = '3';
+    AUX_4                   = '4';
+    AUX_5                   = '5';
+    AUX_6                   = '6';
+    AUX_7                   = '7';
+    AUX_8                   = '8';
+    AUX_9                   = '9';
+
+{*
+** ToolKit Gets and Sets
+*}
+    AUX_FD                  = 1;  {* return fd (long) *}
+    AUX_COLORMAP            = 3;  {* pass buf of r, g and b (unsigned char) *}
+    AUX_GREYSCALEMAP        = 4;
+    AUX_FOGMAP              = 5;  {* pass fog and color bits (long) *}
+    AUX_ONECOLOR            = 6;  {* pass index, r, g, and b (long) *}
+
+{*
+** Color Macros
+*}
+
+    AUX_BLACK               = 0;
+    AUX_RED                 = 13;
+    AUX_GREEN               = 14;
+    AUX_YELLOW              = 15;
+    AUX_BLUE                = 16;
+    AUX_MAGENTA             = 17;
+    AUX_CYAN                = 18;
+    AUX_WHITE               = 19;
+
+{ this was a macro and is now a procedure }
+{ PROCEDURE AUX_SETCOLOR(x, y); - TODO }
+
+{*
+** RGB Image Structure
+*}
+
+type
+    AUX_RGBImageRec = RECORD
+    {BEGIN}
+        sizeX, sizeY : GLint;
+        data : ^BYTE;
+    END;
+    pAUX_RGBImageRec = ^AUX_RGBImageRec;
+
+{*
+** Prototypes
+*}
+
+Procedure auxInitDisplayMode(mode:GLenum); glaux_dll;
+Procedure auxInitPosition(x,y,w,h:Integer); glaux_dll;
+
+{$ifndef WINNT}
+FUNCTION  auxInitWindow(name:LPCSTR)  : GLenum; glaux_dll;
+{$else}
+{$ifdef UNICODE }
+FUNCTION  auxInitWindow (name:LPCWSTR) : GLenum; glaux_dll name 'auxInitWindowW';
+{$else}
+FUNCTION  auxInitWindow (name:LPCSTR)  : GLenum; glaux_dll name 'auxInitWindowA';
+{$endif}
+FUNCTION  auxInitWindowA(name:LPCSTR)  : GLenum; glaux_dll;
+FUNCTION  auxInitWindowW(name:LPCWSTR) : GLenum; glaux_dll;
+{$endif}
+
+PROCEDURE auxCloseWindow; glaux_dll;
+PROCEDURE auxQuit;        glaux_dll;
+PROCEDURE auxSwapBuffers; glaux_dll;
+
+{ callbacks }
+type
+  TAUXMAINPROC    = PROCEDURE;                           glaux_callback;
+  TAUXEXPOSEPROC  = PROCEDURE(w, h : integer);           glaux_callback;
+  TAUXRESHAPEPROC = PROCEDURE(w, h : GLsizei);           glaux_callback;
+  TAUXIDLEPROC    = PROCEDURE;                           glaux_callback;
+  TAUXKEYPROC     = PROCEDURE;                           glaux_callback;
+  TAUXMOUSEPROC   = PROCEDURE(VAR event : AUX_EVENTREC); glaux_callback;
+
+{ callback setup routines }
+PROCEDURE auxMainLoop   (func : TAUXMAINPROC); glaux_dll;
+PROCEDURE auxExposeFunc (func : TAUXEXPOSEPROC); glaux_dll;
+PROCEDURE auxReshapeFunc(func : TAUXRESHAPEPROC); glaux_dll;
+PROCEDURE auxIdleFunc   (func : TAUXIDLEPROC); glaux_dll;
+PROCEDURE auxKeyFunc    (val : integer; func : TAUXKEYPROC); glaux_dll;
+PROCEDURE auxMouseFunc  (v1, v2 :integer; func : TAUXMOUSEPROC); glaux_dll;
+
+FUNCTION  auxGetColorMapSize : integer; glaux_dll;
+PROCEDURE auxGetMouseLoc(var x, y : integer); glaux_dll;
+PROCEDURE auxSetOneColor(id : integer; r, g, b : GLfloat); glaux_dll;
+PROCEDURE auxSetFogRamp(v1, v2 : integer); glaux_dll;
+PROCEDURE auxSetGreyRamp; glaux_dll;
+PROCEDURE auxSetRGBMap(id : integer; var map : GLfloat); glaux_dll;
+
+{$ifndef WINNT}
+FUNCTION auxRGBImageLoad(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+{$else}
+{$ifndef GLAUXIMP}{ not present in GLauximp.dll }
+{$ifdef UNICODE}
+FUNCTION auxRGBImageLoad (name : LPCWSTR): pAUX_RGBImageRec; glaux_dll name 'auxRGBImageLoadW';
+{$else}
+FUNCTION auxRGBImageLoad (name : LPCSTR) : pAUX_RGBImageRec; glaux_dll name 'auxRGBImageLoadA';
+{$endif}
+FUNCTION auxRGBImageLoadA(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+FUNCTION auxRGBImageLoadW(name : LPCWSTR): pAUX_RGBImageRec; glaux_dll;
+{$endif}
+{$endif}
+
+{$ifndef WINNT}
+{ this function is Windows specific! }
+FUNCTION auxDIBImageLoad(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+{$else}
+{$ifndef GLAUXIMP}{ not present in GLauximp.dll }
+{$ifdef UNICODE }
+FUNCTION auxDIBImageLoad (name : LPCWSTR): pAUX_RGBImageRec; glaux_dll name 'auxDIBImageLoadW';
+{$else}
+FUNCTION auxDIBImageLoad (name : LPCSTR) : pAUX_RGBImageRec; glaux_dll name 'auxDIBImageLoadA';
+{$endif}
+FUNCTION auxDIBImageLoadA(name : LPCSTR) : pAUX_RGBImageRec; glaux_dll;
+FUNCTION auxDIBImageLoadW(name : LPCWSTR): pAUX_RGBImageRec; glaux_dll;
+{$endif}
+{$endif}
+
+PROCEDURE auxCreateFont; glaux_dll;
+
+{$ifndef WINNT}
+PROCEDURE auxDrawStr (name : LPCSTR);  glaux_dll;
+{$else}
+{$ifndef GLAUXIMP}{ not present in GLauximp.dll }
+{$ifdef UNICODE }
+PROCEDURE auxDrawStr (name : LPCWSTR); glaux_dll name 'auxDrawStrW';
+{$else}
+PROCEDURE auxDrawStr (name : LPCSTR);  glaux_dll name 'auxDrawStrA';
+{$endif}
+PROCEDURE auxDrawStrA(name : LPCSTR);  glaux_dll;
+PROCEDURE auxDrawStrW(name : LPCWSTR); glaux_dll;
+{$endif}
+{$endif}
+
+PROCEDURE auxWireSphere(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidSphere(v : GLdouble); glaux_dll;
+PROCEDURE auxWireCube(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidCube(v : GLdouble); glaux_dll;
+PROCEDURE auxWireBox(v1, v2, v3 : GLdouble); glaux_dll;
+PROCEDURE auxSolidBox(v1, v2, v3 : GLdouble); glaux_dll;
+PROCEDURE auxWireTorus(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxSolidTorus(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxWireCylinder(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxSolidCylinder(v1, v2 :  GLdouble); glaux_dll;
+PROCEDURE auxWireIcosahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidIcosahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireOctahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidOctahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireTetrahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidTetrahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireDodecahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidDodecahedron(v : GLdouble); glaux_dll;
+PROCEDURE auxWireCone(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxSolidCone(v1, v2 : GLdouble); glaux_dll;
+PROCEDURE auxWireTeapot(v : GLdouble); glaux_dll;
+PROCEDURE auxSolidTeapot(v: GLdouble); glaux_dll;
+
+{*
+** Window specific functions
+** hwnd, hdc, and hglrc valid after auxInitWindow()
+*}
+FUNCTION  auxGetHWND : HWND; glaux_dll;
+FUNCTION  auxGetHDC : HDC; glaux_dll;
+FUNCTION  auxGetHGLRC : HGLRC; glaux_dll;
+
+{*
+** Viewperf support functions and constants
+*}
+{* Display Mode Selection Criteria *}
+
+CONST { was an unnamed enum }
+    AUX_USE_ID                  = 1;
+    AUX_EXACT_MATCH             = 2;
+    AUX_MINIMUM_CRITERIA        = 3;
+
+PROCEDURE auxInitDisplayModePolicy(val : GLenum); glaux_dll;
+FUNCTION  auxInitDisplayModeID(val : GLint) : GLenum; glaux_dll;
+FUNCTION  auxGetDisplayModePolicy : GLenum; glaux_dll;
+FUNCTION  auxGetDisplayModeID : GLint; glaux_dll;
+FUNCTION  auxGetDisplayMode : GLenum; glaux_dll;
+
+
+implementation
+
+{ these functions are resolved macros -
+  they should be "inline" if compile can do this }
+
+FUNCTION AUX_WIND_IS_RGB(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_RGB := ((x AND AUX_INDEX) = 0);
+END;
+
+FUNCTION AUX_WIND_IS_INDEX(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_INDEX := ((x AND AUX_INDEX) <> 0);
+END;
+
+FUNCTION AUX_WIND_IS_SINGLE(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_SINGLE := ((x AND AUX_DOUBLE) = 0);
+END;
+
+FUNCTION AUX_WIND_IS_DOUBLE(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_DOUBLE := ((x AND AUX_DOUBLE) <> 0);
+END;
+
+FUNCTION AUX_WIND_IS_INDIRECT(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_INDIRECT := ((x AND AUX_INDIRECT) <> 0);
+END;
+
+FUNCTION AUX_WIND_IS_DIRECT(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_IS_DIRECT := ((x AND AUX_INDIRECT) = 0);
+END;
+
+FUNCTION AUX_WIND_HAS_ACCUM(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_ACCUM := ((x AND AUX_ACCUM) <> 0);
+END;
+
+FUNCTION AUX_WIND_HAS_ALPHA(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_ALPHA := ((x AND AUX_ALPHA) <> 0);
+END;
+
+FUNCTION AUX_WIND_HAS_DEPTH(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_DEPTH := ((x AND (AUX_DEPTH24 OR AUX_DEPTH16)) <> 0);
+END;
+
+FUNCTION AUX_WIND_HAS_STENCIL(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_HAS_STENCIL := ((x AND AUX_STENCIL) <> 0);
+END;
+
+FUNCTION AUX_WIND_USES_FIXED_332_PAL(x : DWORD) : BOOLEAN;
+BEGIN
+  AUX_WIND_USES_FIXED_332_PAL := ((x AND AUX_FIXED_332_PAL) <> 0);
+END;
+
+{extern float auxRGBMap[20][3];
+
+PROCEDURE AUX_SETCOLOR(x, y);
+BEGIN
+  IF (AUX_WIND_IS_RGB((x))
+  THEN glColor3fv(auxRGBMap[y])
+  ELSE glIndexf(y));
+END;
+ - TODO}
+
+
+{begin{of init}
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:46  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}

+ 375 - 0
packages/opengl/win32/glu.pp

@@ -0,0 +1,375 @@
+{
+  $Id$
+
+  Translation of the Mesa GLU headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GLU;
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glu_dll := }
+  uses Windows, GL;
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+function InitGLUFromLibrary(libname: PChar): Boolean;
+
+
+// determines automatically which libraries to use:
+function InitGLU: Boolean;
+
+
+var
+  GLUDumpUnresolvedFunctions,
+  GLUInitialized: Boolean;
+
+
+// =======================================================
+//   GLU consts, types and functions
+// =======================================================
+
+const
+  GLU_TRUE                              = GL_TRUE;
+  GLU_FALSE                             = GL_FALSE;
+
+  // Normal vectors
+  GLU_SMOOTH                            = 100000;
+  GLU_FLAT                              = 100001;
+  GLU_NONE                              = 100002;
+
+  // Quadric draw styles
+  GLU_POINT                             = 100010;
+  GLU_LINE                              = 100011;
+  GLU_FILL                              = 100012;
+  GLU_SILHOUETTE                        = 100013;
+
+  // Quadric orientation
+  GLU_OUTSIDE                           = 100020;
+  GLU_INSIDE                            = 100021;
+
+  // Tesselator
+  GLU_BEGIN                             = 100100;
+  GLU_VERTEX                            = 100101;
+  GLU_END                               = 100102;
+  GLU_ERROR                             = 100103;
+  GLU_EDGE_FLAG                         = 100104;
+
+  // Contour types
+  GLU_CW                                = 100120;
+  GLU_CCW                               = 100121;
+  GLU_INTERIOR                          = 100122;
+  GLU_EXTERIOR                          = 100123;
+  GLU_UNKNOWN                           = 100124;
+
+  // Tesselation errors
+  GLU_TESS_ERROR1                       = 100151;  // missing gluEndPolygon
+  GLU_TESS_ERROR2                       = 100152;  // missing gluBeginPolygon
+  GLU_TESS_ERROR3                       = 100153;  // misoriented contour
+  GLU_TESS_ERROR4                       = 100154;  // vertex/edge intersection
+  GLU_TESS_ERROR5                       = 100155;  // misoriented or self-intersecting loops
+  GLU_TESS_ERROR6                       = 100156;  // coincident vertices
+  GLU_TESS_ERROR7                       = 100157;  // all vertices collinear
+  GLU_TESS_ERROR8                       = 100158;  // intersecting edges
+  GLU_TESS_ERROR9                       = 100159;  // not coplanar contours
+
+  // NURBS
+  GLU_AUTO_LOAD_MATRIX                  = 100200;
+  GLU_CULLING                           = 100201;
+  GLU_PARAMETRIC_TOLERANCE              = 100202;
+  GLU_SAMPLING_TOLERANCE                = 100203;
+  GLU_DISPLAY_MODE                      = 100204;
+  GLU_SAMPLING_METHOD                   = 100205;
+  GLU_U_STEP                            = 100206;
+  GLU_V_STEP                            = 100207;
+
+  GLU_PATH_LENGTH                       = 100215;
+  GLU_PARAMETRIC_ERROR                  = 100216;
+  GLU_DOMAIN_DISTANCE                   = 100217;
+
+  GLU_MAP1_TRIM_2                       = 100210;
+  GLU_MAP1_TRIM_3                       = 100211;
+
+  GLU_OUTLINE_POLYGON                   = 100240;
+  GLU_OUTLINE_PATCH                     = 100241;
+
+  GLU_NURBS_ERROR1                      = 100251;   // spline order un-supported
+  GLU_NURBS_ERROR2                      = 100252;   // too few knots
+  GLU_NURBS_ERROR3                      = 100253;   // valid knot range is empty
+  GLU_NURBS_ERROR4                      = 100254;   // decreasing knot sequence
+  GLU_NURBS_ERROR5                      = 100255;   // knot multiplicity > spline order
+  GLU_NURBS_ERROR6                      = 100256;   // endcurve() must follow bgncurve()
+  GLU_NURBS_ERROR7                      = 100257;   // bgncurve() must precede endcurve()
+  GLU_NURBS_ERROR8                      = 100258;   // ctrlarray or knot vector is NULL
+  GLU_NURBS_ERROR9                      = 100259;   // cannot draw pwlcurves
+  GLU_NURBS_ERROR10                     = 100260;   // missing gluNurbsCurve()
+  GLU_NURBS_ERROR11                     = 100261;   // missing gluNurbsSurface()
+  GLU_NURBS_ERROR12                     = 100262;   // endtrim() must precede endsurface()
+  GLU_NURBS_ERROR13                     = 100263;   // bgnsurface() must precede endsurface()
+  GLU_NURBS_ERROR14                     = 100264;   // curve of improper type passed as trim curve
+  GLU_NURBS_ERROR15                     = 100265;   // bgnsurface() must precede bgntrim()
+  GLU_NURBS_ERROR16                     = 100266;   // endtrim() must follow bgntrim()
+  GLU_NURBS_ERROR17                     = 100267;   // bgntrim() must precede endtrim()*/
+  GLU_NURBS_ERROR18                     = 100268;   // invalid or missing trim curve*/
+  GLU_NURBS_ERROR19                     = 100269;   // bgntrim() must precede pwlcurve()
+  GLU_NURBS_ERROR20                     = 100270;   // pwlcurve referenced twice*/
+  GLU_NURBS_ERROR21                     = 100271;   // pwlcurve and nurbscurve mixed
+  GLU_NURBS_ERROR22                     = 100272;   // improper usage of trim data type
+  GLU_NURBS_ERROR23                     = 100273;   // nurbscurve referenced twice
+  GLU_NURBS_ERROR24                     = 100274;   // nurbscurve and pwlcurve mixed
+  GLU_NURBS_ERROR25                     = 100275;   // nurbssurface referenced twice
+  GLU_NURBS_ERROR26                     = 100276;   // invalid property
+  GLU_NURBS_ERROR27                     = 100277;   // endsurface() must follow bgnsurface()
+  GLU_NURBS_ERROR28                     = 100278;   // intersecting or misoriented trim curves
+  GLU_NURBS_ERROR29                     = 100279;   // intersecting trim curves
+  GLU_NURBS_ERROR30                     = 100280;   // UNUSED
+  GLU_NURBS_ERROR31                     = 100281;   // unconnected trim curves
+  GLU_NURBS_ERROR32                     = 100282;   // unknown knot error
+  GLU_NURBS_ERROR33                     = 100283;   // negative vertex count encountered
+  GLU_NURBS_ERROR34                     = 100284;   // negative byte-stride
+  GLU_NURBS_ERROR35                     = 100285;   // unknown type descriptor
+  GLU_NURBS_ERROR36                     = 100286;   // null control point reference
+  GLU_NURBS_ERROR37                     = 100287;   // duplicate point on pwlcurve
+
+  // Errors
+  GLU_INVALID_ENUM                      = 100900;
+  GLU_INVALID_VALUE                     = 100901;
+  GLU_OUT_OF_MEMORY                     = 100902;
+  GLU_INCOMPATIBLE_GL_VERSION           = 100903;
+
+  // New in GLU 1.1
+  GLU_VERSION                           = 100800;
+  GLU_EXTENSIONS                        = 100801;
+
+type
+  PGLUquadricObj = ^TGLUquadricObj;
+  TGLUquadricObj = record end;
+  PGLUtriangulatorObj = ^TGLUtriangulatorObj;
+  TGLUtriangulatorObj = record end;
+  PGLUnurbsObj = ^TGLUnurbsObj;
+  TGLUnurbsObj = record end;
+
+  TGLUQuadricCallback = procedure; cdecl;
+  TGLUNurbsCallback = procedure; cdecl;
+  TGLUTessCallback = procedure; cdecl;
+
+  TGLUViewport = array[0..3] of LongInt;
+  TGLUMatrixd = array[0..15] of Double;
+  TGLUMatrixf = array[0..15] of Single;
+  TGLUVectord = array[0..2] of Double;
+
+
+var
+  // Miscellaneous functions
+  gluLookAt: procedure(eye, eyey, eyez, centerx, centery, centerz, upx, upy, upz: Double); glu_dll
+  gluOrtho2D: procedure(left, right, bottom, top: Double); glu_dll
+  gluPerspective: procedure(fovy, aspect, zNear, zFar: Double); glu_dll
+  gluPickMatrix: procedure(x, y, width, height: Double; const viewport: TGLUViewport); glu_dll
+  gluProject: procedure(objx, objy, objz: Double; const modelMatrix, projMatrix: TGLUMatrixd; const viewport: TGLUViewport; winx, winy, winz: Double); glu_dll
+  gluUnProject: procedure(winx, winy, winz: Double; const modelMatrix, projMatrix: TGLUMatrixd; const viewport: TGLUViewport; objx, objy, objz: Double); glu_dll
+  gluErrorString: procedure(errorCode: GLenum); glu_dll
+
+  // Mipmapping and image scaling
+  gluScaleImage: procedure(format: GLenum; within, heightin: LongInt; typein: GLenum; var datain; widthout, heightout: LongInt; typeout: GLenum; var dataout); glu_dll
+  gluBuild1DMipmaps: procedure(target: GLenum; components, width: LongInt; format, AType: GLEnum; var data); glu_dll
+  gluBuild2DMipmaps: procedure(target: GLenum; components, width, height: LongInt; format, AType: GLEnum; var data); glu_dll
+
+  // Quadrics
+  gluNewQuadric: function: PGLUquadricObj; glu_dll
+  gluDeleteQuadric: procedure(state: PGLUquadricObj); glu_dll
+  gluQuadricDrawStyle: procedure(quadObject: PGLUquadricObj; drawStyle: GLenum); glu_dll
+  gluQuadricOrientation: procedure(quadObject: PGLUquadricObj; orientation: GLenum); glu_dll
+  gluQuadricNormals: procedure(quadObject: PGLUquadricObj; normals: GLenum); glu_dll
+  gluQuadricTexture: procedure(quadObject: PGLUquadricObj; textureCoords: Boolean); glu_dll
+  gluQuadricCallback: procedure(quadObject: PGLUquadricObj; which: GLenum; fn: TGLUQuadricCallback); glu_dll
+  gluCylinder: procedure(qobj: PGLUquadricObj; baseRadius, topRadius, height: Double; slices, stacks: LongInt); glu_dll
+  gluSphere: procedure(qobj: PGLUquadricObj; radius: Double; slices, stacks: LongInt); glu_dll
+  gluDisk: procedure(qobj: PGLUquadricObj; innerRadius, outerRadius: Double; slices, loops: LongInt); glu_dll
+  gluPartialDisk: procedure(qobj: PGLUquadricObj; innerRadius, outerRadius: Double; slices, loops: LongInt; startAngle, sweepAngle: Double); glu_dll
+
+  // Nurbs
+  gluNewNurbsRenderer: function: PGLUnurbsObj; glu_dll
+  gluDeleteNurbsRenderer: procedure(nobj: PGLUnurbsObj); glu_dll
+  gluLoadSamplingMatrices: procedure(nobj: PGLUnurbsObj; const modelMatrix, projMatrix: TGLUMatrixf; const viewport: TGLUViewport); glu_dll
+  gluNurbsProperty: procedure(nobj: PGLUnurbsObj; AProperty: GLenum; value: Single); glu_dll
+  gluGetNurbsProperty: procedure(nobj: PGLUnurbsObj; AProperty: GLEnum; var value: Single); glu_dll
+  gluBeginCurve: procedure(nobj: PGLUnurbsObj); glu_dll
+  gluEndCurve: procedure(nobj: PGLUnurbsObj); glu_dll
+  gluNurbsCurve: procedure(nobj: PGLUnurbsObj; nknots: LongInt; var know: Single; stride: LongInt; var ctlarray: Single; order: LongInt; AType: GLenum); glu_dll
+  gluBeginSurface: procedure(nobj: PGLUnurbsObj); glu_dll
+  gluEndSurface: procedure(nobj: PGLUnurbsObj); glu_dll
+  gluNurbsSurface: procedure(nobj: PGLUnurbsObj; sknot_count: LongInt; var sknot: Single; tknot_count: LongInt; var tknot: Single; s_stride, t_stride: LongInt; var ctlarray: Single; sorder, torder: LongInt; AType: GLenum); glu_dll
+  gluBeginTrim: procedure(nobj: PGLUnurbsObj); glu_dll
+  gluEndTrim: procedure(nobj: PGLUnurbsObj); glu_dll
+  gluPwlCurve: procedure(nobj: PGLUnurbsObj; count: LongInt; var AArray: Single; stride: LongInt; AType: GLenum); glu_dll
+  gluNurbsCallback: procedure(nobj: PGLUnurbsObj; which: GLenum; fn: TGLUNurbsCallback); glu_dll
+
+  // Polygon tesselation
+  gluNewTess: function: PGLUtriangulatorObj; glu_dll
+  gluTessCallback: procedure(tobj: PGLUtriangulatorObj; which: GLenum; fn: TGLUTessCallback); glu_dll
+
+  gluDeleteTess: procedure(tobj: PGLUtriangulatorObj); glu_dll
+  gluBeginPolygon: procedure(tobj: PGLUtriangulatorObj); glu_dll
+  gluEndPolygon: procedure(tobj: PGLUtriangulatorObj); glu_dll
+  gluNextContour: procedure(tobj: PGLUtriangulatorObj; AType: GLenum); glu_dll
+  gluTessVertex: procedure(tobj: PGLUtriangulatorObj; v: TGLUVectord; var data); glu_dll
+
+  // New functions in GLU 1.1
+  gluGetString: function(name: GLenum): PChar; glu_dll
+
+
+// =======================================================
+//
+// =======================================================
+
+implementation
+
+type
+  HInstance = LongWord;
+
+var
+  libGLU : HInstance;
+
+function GetProc(handle: HInstance; name: PChar): Pointer;
+begin
+  Result := GetProcAddress(handle, name);
+  if (Result = nil) and GLUDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+function InitGLUFromLibrary(libname: PChar): Boolean;
+begin
+  Result := False;
+  libGLU := LoadLibrary(libname);
+  if libGLU = 0 then exit;
+
+  // Miscellaneous functions
+  gluLookAt := GetProc(libGLU, 'gluLookAt');
+  gluOrtho2D := GetProc(libGLU, 'gluOrtho2D');
+  gluPerspective := GetProc(libGLU, 'gluPerspective');
+  gluPickMatrix := GetProc(libGLU, 'gluPickMatrix');
+  gluProject := GetProc(libGLU, 'gluProject');
+  gluUnProject := GetProc(libGLU, 'gluUnProject');
+  gluErrorString := GetProc(libGLU, 'gluErrorString');
+  // Mipmapping and image scaling
+  gluScaleImage := GetProc(libGLU, 'gluScaleImage');
+  gluBuild1DMipmaps := GetProc(libGLU, 'gluBuild1DMipmaps');
+  gluBuild2DMipmaps := GetProc(libGLU, 'gluBuild2DMipmaps');
+  // Quadrics
+  gluNewQuadric := GetProc(libGLU, 'gluNewQuadric');
+  gluDeleteQuadric := GetProc(libGLU, 'gluDeleteQuadric');
+  gluQuadricDrawStyle := GetProc(libGLU, 'gluQuadricDrawStyle');
+  gluQuadricOrientation := GetProc(libGLU, 'gluQuadricOrientation');
+  gluQuadricNormals := GetProc(libGLU, 'gluQuadricNormals');
+  gluQuadricTexture := GetProc(libGLU, 'gluQuadricTexture');
+  gluQuadricCallback := GetProc(libGLU, 'gluQuadricCallback');
+  gluCylinder := GetProc(libGLU, 'gluCylinder');
+  gluSphere := GetProc(libGLU, 'gluSphere');
+  gluDisk := GetProc(libGLU, 'gluDisk');
+  gluPartialDisk := GetProc(libGLU, 'gluPartialDisk');
+  // Nurbs
+  gluNewNurbsRenderer := GetProc(libGLU, 'gluNewNurbsRenderer');
+  gluDeleteNurbsRenderer := GetProc(libGLU, 'gluDeleteNurbsRenderer');
+  gluLoadSamplingMatrices := GetProc(libGLU, 'gluLoadSamplingMatrices');
+  gluNurbsProperty := GetProc(libGLU, 'gluNurbsProperty');
+  gluGetNurbsProperty := GetProc(libGLU, 'gluGetNurbsProperty');
+  gluBeginCurve := GetProc(libGLU, 'gluBeginCurve');
+  gluEndCurve := GetProc(libGLU, 'gluEndCurve');
+  gluNurbsCurve := GetProc(libGLU, 'gluNurbsCurve');
+  gluBeginSurface := GetProc(libGLU, 'gluBeginSurface');
+  gluEndSurface := GetProc(libGLU, 'gluEndSurface');
+  gluNurbsSurface := GetProc(libGLU, 'gluNurbsSurface');
+  gluBeginTrim := GetProc(libGLU, 'gluBeginTrim');
+  gluEndTrim := GetProc(libGLU, 'gluEndTrim');
+  gluPwlCurve := GetProc(libGLU, 'gluPwlCurve');
+  gluNurbsCallback := GetProc(libGLU, 'gluNurbsCallback');
+  // Polygon tesselation
+  gluNewTess := GetProc(libGLU, 'gluNewTess');
+  gluTessCallback := GetProc(libGLU, 'gluTessCallback');
+  gluDeleteTess := GetProc(libGLU, 'gluDeleteTess');
+  gluBeginPolygon := GetProc(libGLU, 'gluBeginPolygon');
+  gluEndPolygon := GetProc(libGLU, 'gluEndPolygon');
+  gluNextContour := GetProc(libGLU, 'gluNextContour');
+  gluTessVertex := GetProc(libGLU, 'gluTessVertex');
+  // New functions in GLU 1.1
+  gluGetString := GetProc(libGLU, 'gluGetString');
+
+  GLUInitialized := True;
+  Result := True;
+end;
+
+
+function InitGLU: Boolean;
+begin
+  Result := InitGLUFromLibrary('glu32.dll');
+end;
+
+
+initialization
+  InitGl;
+finalization
+  if libGLU <> 0 then FreeLibrary(libGLU);
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:46  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:18  michael
+  + Initial import
+
+  Revision 1.1  2000/05/31 00:35:14  alex
+  added working templates
+
+}
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:46  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}

+ 286 - 0
packages/opengl/win32/glu_sl.pp

@@ -0,0 +1,286 @@
+{
+  $Id$
+
+  Translation of the Mesa GLU headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+  Version for static linking in Win32 environment.
+  Latest change: 1999-11-11
+
+  Original copyright notice:
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GLU; // version with static linking
+
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glu_dll := external 'glu32.dll'}
+  uses
+    Windows,
+    GL;        { for definition of GL_TRUE/FALS }
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+// none - no special init required
+
+
+// =======================================================
+//   GLU consts, types and functions
+// =======================================================
+
+const
+  GLU_TRUE                              = GL_TRUE;
+  GLU_FALSE                             = GL_FALSE;
+
+  // Normal vectors
+  GLU_SMOOTH                            = 100000;
+  GLU_FLAT                              = 100001;
+  GLU_NONE                              = 100002;
+
+  // Quadric draw styles
+  GLU_POINT                             = 100010;
+  GLU_LINE                              = 100011;
+  GLU_FILL                              = 100012;
+  GLU_SILHOUETTE                        = 100013;
+
+  // Quadric orientation
+  GLU_OUTSIDE                           = 100020;
+  GLU_INSIDE                            = 100021;
+
+  // Tesselator
+  GLU_BEGIN                             = 100100;
+  GLU_VERTEX                            = 100101;
+  GLU_END                               = 100102;
+  GLU_ERROR                             = 100103;
+  GLU_EDGE_FLAG                         = 100104;
+
+  // Contour types
+  GLU_CW                                = 100120;
+  GLU_CCW                               = 100121;
+  GLU_INTERIOR                          = 100122;
+  GLU_EXTERIOR                          = 100123;
+  GLU_UNKNOWN                           = 100124;
+
+  // Tesselation errors
+  GLU_TESS_ERROR1                       = 100151;  // missing gluEndPolygon
+  GLU_TESS_ERROR2                       = 100152;  // missing gluBeginPolygon
+  GLU_TESS_ERROR3                       = 100153;  // misoriented contour
+  GLU_TESS_ERROR4                       = 100154;  // vertex/edge intersection
+  GLU_TESS_ERROR5                       = 100155;  // misoriented or self-intersecting loops
+  GLU_TESS_ERROR6                       = 100156;  // coincident vertices
+  GLU_TESS_ERROR7                       = 100157;  // all vertices collinear
+  GLU_TESS_ERROR8                       = 100158;  // intersecting edges
+  GLU_TESS_ERROR9                       = 100159;  // not coplanar contours
+
+  // NURBS
+  GLU_AUTO_LOAD_MATRIX                  = 100200;
+  GLU_CULLING                           = 100201;
+  GLU_PARAMETRIC_TOLERANCE              = 100202;
+  GLU_SAMPLING_TOLERANCE                = 100203;
+  GLU_DISPLAY_MODE                      = 100204;
+  GLU_SAMPLING_METHOD                   = 100205;
+  GLU_U_STEP                            = 100206;
+  GLU_V_STEP                            = 100207;
+
+  GLU_PATH_LENGTH                       = 100215;
+  GLU_PARAMETRIC_ERROR                  = 100216;
+  GLU_DOMAIN_DISTANCE                   = 100217;
+
+  GLU_MAP1_TRIM_2                       = 100210;
+  GLU_MAP1_TRIM_3                       = 100211;
+
+  GLU_OUTLINE_POLYGON                   = 100240;
+  GLU_OUTLINE_PATCH                     = 100241;
+
+  GLU_NURBS_ERROR1                      = 100251;   // spline order un-supported
+  GLU_NURBS_ERROR2                      = 100252;   // too few knots
+  GLU_NURBS_ERROR3                      = 100253;   // valid knot range is empty
+  GLU_NURBS_ERROR4                      = 100254;   // decreasing knot sequence
+  GLU_NURBS_ERROR5                      = 100255;   // knot multiplicity > spline order
+  GLU_NURBS_ERROR6                      = 100256;   // endcurve() must follow bgncurve()
+  GLU_NURBS_ERROR7                      = 100257;   // bgncurve() must precede endcurve()
+  GLU_NURBS_ERROR8                      = 100258;   // ctrlarray or knot vector is NULL
+  GLU_NURBS_ERROR9                      = 100259;   // cannot draw pwlcurves
+  GLU_NURBS_ERROR10                     = 100260;   // missing gluNurbsCurve()
+  GLU_NURBS_ERROR11                     = 100261;   // missing gluNurbsSurface()
+  GLU_NURBS_ERROR12                     = 100262;   // endtrim() must precede endsurface()
+  GLU_NURBS_ERROR13                     = 100263;   // bgnsurface() must precede endsurface()
+  GLU_NURBS_ERROR14                     = 100264;   // curve of improper type passed as trim curve
+  GLU_NURBS_ERROR15                     = 100265;   // bgnsurface() must precede bgntrim()
+  GLU_NURBS_ERROR16                     = 100266;   // endtrim() must follow bgntrim()
+  GLU_NURBS_ERROR17                     = 100267;   // bgntrim() must precede endtrim()*/
+  GLU_NURBS_ERROR18                     = 100268;   // invalid or missing trim curve*/
+  GLU_NURBS_ERROR19                     = 100269;   // bgntrim() must precede pwlcurve()
+  GLU_NURBS_ERROR20                     = 100270;   // pwlcurve referenced twice*/
+  GLU_NURBS_ERROR21                     = 100271;   // pwlcurve and nurbscurve mixed
+  GLU_NURBS_ERROR22                     = 100272;   // improper usage of trim data type
+  GLU_NURBS_ERROR23                     = 100273;   // nurbscurve referenced twice
+  GLU_NURBS_ERROR24                     = 100274;   // nurbscurve and pwlcurve mixed
+  GLU_NURBS_ERROR25                     = 100275;   // nurbssurface referenced twice
+  GLU_NURBS_ERROR26                     = 100276;   // invalid property
+  GLU_NURBS_ERROR27                     = 100277;   // endsurface() must follow bgnsurface()
+  GLU_NURBS_ERROR28                     = 100278;   // intersecting or misoriented trim curves
+  GLU_NURBS_ERROR29                     = 100279;   // intersecting trim curves
+  GLU_NURBS_ERROR30                     = 100280;   // UNUSED
+  GLU_NURBS_ERROR31                     = 100281;   // unconnected trim curves
+  GLU_NURBS_ERROR32                     = 100282;   // unknown knot error
+  GLU_NURBS_ERROR33                     = 100283;   // negative vertex count encountered
+  GLU_NURBS_ERROR34                     = 100284;   // negative byte-stride
+  GLU_NURBS_ERROR35                     = 100285;   // unknown type descriptor
+  GLU_NURBS_ERROR36                     = 100286;   // null control point reference
+  GLU_NURBS_ERROR37                     = 100287;   // duplicate point on pwlcurve
+
+  // Errors
+  GLU_INVALID_ENUM                      = 100900;
+  GLU_INVALID_VALUE                     = 100901;
+  GLU_OUT_OF_MEMORY                     = 100902;
+  GLU_INCOMPATIBLE_GL_VERSION           = 100903;
+
+  // New in GLU 1.1
+  GLU_VERSION                           = 100800;
+  GLU_EXTENSIONS                        = 100801;
+
+type
+  PGLUquadricObj = ^TGLUquadricObj;
+  TGLUquadricObj = record end;
+  PGLUtriangulatorObj = ^TGLUtriangulatorObj;
+  TGLUtriangulatorObj = record end;
+  PGLUnurbsObj = ^TGLUnurbsObj;
+  TGLUnurbsObj = record end;
+
+  TGLUQuadricCallback = procedure; cdecl;
+  TGLUNurbsCallback = procedure; cdecl;
+  TGLUTessCallback = procedure; cdecl;
+
+  TGLUViewport = array[0..3] of LongInt;
+  TGLUMatrixd = array[0..15] of Double;
+  TGLUMatrixf = array[0..15] of Single;
+  TGLUVectord = array[0..2] of Double;
+
+
+  // Miscellaneous functions
+procedure gluLookAt(eye, eyey, eyez, centerx, centery, centerz, upx, upy, upz: Double); glu_dll;
+procedure gluOrtho2D(left, right, bottom, top: Double); glu_dll;
+procedure gluPerspective(fovy, aspect, zNear, zFar: Double); glu_dll;
+procedure gluPickMatrix(x, y, width, height: Double; const viewport: TGLUViewport); glu_dll;
+procedure gluProject(objx, objy, objz: Double; const modelMatrix, projMatrix: TGLUMatrixd; const viewport: TGLUViewport; winx, winy, winz: Double); glu_dll;
+procedure gluUnProject(winx, winy, winz: Double; const modelMatrix, projMatrix: TGLUMatrixd; const viewport: TGLUViewport; objx, objy, objz: Double); glu_dll;
+procedure gluErrorString(errorCode: GLenum); glu_dll;
+
+  // Mipmapping and image scaling
+procedure gluScaleImage(format: GLenum; within, heightin: LongInt; typein: GLenum; var datain; widthout, heightout: LongInt; typeout: GLenum; var dataout); glu_dll;
+procedure gluBuild1DMipmaps(target: GLenum; components, width: LongInt; format, AType: GLEnum; var data); glu_dll;
+procedure gluBuild2DMipmaps(target: GLenum; components, width, height: LongInt; format, AType: GLEnum; var data); glu_dll;
+
+  // Quadrics
+function gluNewQuadric: PGLUquadricObj; glu_dll;
+procedure gluDeleteQuadric(state: PGLUquadricObj); glu_dll;
+procedure gluQuadricDrawStyle(quadObject: PGLUquadricObj; drawStyle: GLenum); glu_dll;
+procedure gluQuadricOrientation(quadObject: PGLUquadricObj; orientation: GLenum); glu_dll;
+procedure gluQuadricNormals(quadObject: PGLUquadricObj; normals: GLenum); glu_dll;
+procedure gluQuadricTexture(quadObject: PGLUquadricObj; textureCoords: Boolean); glu_dll;
+procedure gluQuadricCallback(quadObject: PGLUquadricObj; which: GLenum; fn: TGLUQuadricCallback); glu_dll;
+procedure gluCylinder(qobj: PGLUquadricObj; baseRadius, topRadius, height: Double; slices, stacks: LongInt); glu_dll;
+procedure gluSphere(qobj: PGLUquadricObj; radius: Double; slices, stacks: LongInt); glu_dll;
+procedure gluDisk(qobj: PGLUquadricObj; innerRadius, outerRadius: Double; slices, loops: LongInt); glu_dll;
+procedure gluPartialDisk(qobj: PGLUquadricObj; innerRadius, outerRadius: Double; slices, loops: LongInt; startAngle, sweepAngle: Double); glu_dll;
+
+  // Nurbs
+function gluNewNurbsRenderer: PGLUnurbsObj; glu_dll;
+procedure gluDeleteNurbsRenderer(nobj: PGLUnurbsObj); glu_dll;
+procedure gluLoadSamplingMatrices(nobj: PGLUnurbsObj; const modelMatrix, projMatrix: TGLUMatrixf; const viewport: TGLUViewport); glu_dll;
+procedure gluNurbsProperty(nobj: PGLUnurbsObj; AProperty: GLenum; value: Single); glu_dll;
+procedure gluGetNurbsProperty(nobj: PGLUnurbsObj; AProperty: GLEnum; var value: Single); glu_dll;
+procedure gluBeginCurve(nobj: PGLUnurbsObj); glu_dll;
+procedure gluEndCurve(nobj: PGLUnurbsObj); glu_dll;
+procedure gluNurbsCurve(nobj: PGLUnurbsObj; nknots: LongInt; var know: Single; stride: LongInt; var ctlarray: Single; order: LongInt; AType: GLenum); glu_dll;
+procedure gluBeginSurface(nobj: PGLUnurbsObj); glu_dll;
+procedure gluEndSurface(nobj: PGLUnurbsObj); glu_dll;
+procedure gluNurbsSurface(nobj: PGLUnurbsObj; sknot_count: LongInt; var sknot: Single; tknot_count: LongInt; var tknot: Single; s_stride, t_stride: LongInt; var ctlarray: Single; sorder, torder: LongInt; AType: GLenum); glu_dll;
+procedure gluBeginTrim(nobj: PGLUnurbsObj); glu_dll;
+procedure gluEndTrim(nobj: PGLUnurbsObj); glu_dll;
+procedure gluPwlCurve(nobj: PGLUnurbsObj; count: LongInt; var AArray: Single; stride: LongInt; AType: GLenum); glu_dll;
+procedure gluNurbsCallback(nobj: PGLUnurbsObj; which: GLenum; fn: TGLUNurbsCallback); glu_dll;
+
+  // Polygon tesselation
+function gluNewTess: PGLUtriangulatorObj; glu_dll;
+procedure gluTessCallback(tobj: PGLUtriangulatorObj; which: GLenum; fn: TGLUTessCallback); glu_dll;
+
+procedure gluDeleteTess(tobj: PGLUtriangulatorObj); glu_dll;
+procedure gluBeginPolygon(tobj: PGLUtriangulatorObj); glu_dll;
+procedure gluEndPolygon(tobj: PGLUtriangulatorObj); glu_dll;
+procedure gluNextContour(tobj: PGLUtriangulatorObj; AType: GLenum); glu_dll;
+procedure gluTessVertex(tobj: PGLUtriangulatorObj; v: TGLUVectord; var data); glu_dll;
+
+  // New functions in GLU 1.1
+function gluGetString(name: GLenum): PChar; glu_dll;
+
+// =======================================================
+//
+// =======================================================
+
+implementation
+
+
+{BEGIN{OF INIT}
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:46  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:18  michael
+  + Initial import
+
+  Revision 1.1  2000/05/31 00:35:14  alex
+  added working templates
+
+}
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:46  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}

+ 425 - 0
packages/opengl/win32/glut.pp

@@ -0,0 +1,425 @@
+{$MODE delphi}
+
+unit GLUT;
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glut_dll := }
+  {$DEFINE gldecl := stdcall;}
+  {$DEFINE extdecl := stdcall;}
+  uses windows, GL;
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+function InitGLUTFromLibrary(libname: PChar): Boolean;
+
+// determines automatically which library to use:
+function InitGLUT: Boolean;
+
+
+var
+  GLUTDumpUnresolvedFunctions,
+  GLUTInitialized: Boolean;
+
+
+const
+  // Display mode bit masks
+  GLUT_RGB                      = 0;
+  GLUT_RGBA                     = GLUT_RGB;
+  GLUT_INDEX                    = 1;
+  GLUT_SINGLE                   = 0;
+  GLUT_DOUBLE                   = 2;
+  GLUT_ACCUM                    = 4;
+  GLUT_ALPHA                    = 8;
+  GLUT_DEPTH                    = 16;
+  GLUT_STENCIL                  = 32;
+  GLUT_MULTISAMPLE              = 128;
+  GLUT_STEREO                   = 256;
+  GLUT_LUMINANCE                = 512;
+
+  // Mouse buttons
+  GLUT_LEFT_BUTTON              = 0;
+  GLUT_MIDDLE_BUTTON            = 1;
+  GLUT_RIGHT_BUTTON             = 2;
+
+  // Mouse button state
+  GLUT_DOWN                     = 0;
+  GLUT_UP                       = 1;
+
+  // Keys ###
+
+  // Enter / exit state
+  GLUT_LEFT                     = 0;
+  GLUT_ENTERED                  = 1;
+
+  // Menu usage state
+  GLUT_MENU_NOT_IN_USE          = 0;
+  GLUT_MENU_IN_USE              = 1;
+
+  // Visibility state
+  GLUT_NOT_VISIBLE              = 0;
+  GLUT_VISIBLE                  = 1;
+
+  // Window status state
+  GLUT_HIDDEN                   = 0;
+  GLUT_FULLY_RETAINED           = 1;
+  GLUT_PARTIALLY_RETAINED       = 2;
+  GLUT_FULLY_COVERED            = 3;
+
+  // Color index component selection values
+  GLUT_RED                      = 0;
+  GLUT_GREEN                    = 1;
+  GLUT_BLUE                     = 2;
+
+  // Layers for use
+  GLUT_NORMAL                   = 0;
+  GLUT_OVERLAY                  = 1;
+
+  // Bitmap stuff###
+
+
+  // glutGet parameters
+  GLUT_WINDOW_X                 = 100;
+  GLUT_WINDOW_Y                 = 101;
+  GLUT_WINDOW_WIDTH             = 102;
+  GLUT_WINDOW_HEIGHT            = 103;
+  GLUT_WINDOW_BUFFER_SIZE       = 104;
+  GLUT_WINDOW_STENCIL_SIZE      = 105;
+  GLUT_WINDOW_DEPTH_SIZE        = 106;
+  GLUT_WINDOW_RED_SIZE          = 107;
+  GLUT_WINDOW_GREEN_SIZE        = 108;
+  GLUT_WINDOW_BLUE_SIZE         = 109;
+  GLUT_WINDOW_ALPHA_SIZE        = 110;
+  GLUT_WINDOW_ACCUM_RED_SIZE    = 111;
+  GLUT_WINDOW_ACCUM_GREEN_SIZE  = 112;
+  GLUT_WINDOW_ACCUM_BLUE_SIZE   = 113;
+  GLUT_WINDOW_ACCUM_ALPHA_SIZE  = 114;
+  GLUT_WINDOW_DOUBLEBUFFER      = 115;
+  GLUT_WINDOW_RGBA              = 116;
+  GLUT_WINDOW_PARENT            = 117;
+  GLUT_WINDOW_NUM_CHILDREN      = 118;
+  GLUT_WINDOW_COLORMAP_SIZE     = 119;
+  GLUT_WINDOW_NUM_SAMPLES       = 120;
+  GLUT_WINDOW_STEREO            = 121;
+  GLUT_WINDOW_CURSOR            = 122;
+  GLUT_SCREEN_WIDTH             = 200;
+  GLUT_SCREEN_HEIGHT            = 201;
+  GLUT_SCREEN_WIDTH_MM          = 202;
+  GLUT_SCREEN_HEIGHT_MM         = 203;
+  GLUT_MENU_NUM_ITEMS           = 300;
+  GLUT_DISPLAY_MODE_POSSIBLE    = 400;
+  GLUT_INIT_WINDOW_X            = 500;
+  GLUT_INIT_WINDOW_Y            = 501;
+  GLUT_INIT_WINDOW_WIDTH        = 502;
+  GLUT_INIT_WINDOW_HEIGHT       = 503;
+  GLUT_INIT_DISPLAY_MODE        = 504;
+  GLUT_ELAPSED_TIME             = 700;
+  GLUT_WINDOW_FORMAT_ID         = 123;
+
+  // glutDeviceGet parameters
+  GLUT_HAS_KEYBOARD             = 600;
+  GLUT_HAS_MOUSE                = 601;
+  GLUT_HAS_SPACEBALL            = 602;
+  GLUT_HAS_DIAL_AND_BUTTON_BOX  = 603;
+  GLUT_HAS_TABLET               = 604;
+  GLUT_NUM_MOUSE_BUTTONS        = 605;
+  GLUT_NUM_SPACEBALL_BUTTONS    = 606;
+  GLUT_NUM_BUTTON_BOX_BUTTONS   = 607;
+  GLUT_NUM_DIALS                = 608;
+  GLUT_NUM_TABLET_BUTTONS       = 609;
+  GLUT_DEVICE_IGNORE_KEY_REPEAT = 610;
+  GLUT_DEVICE_KEY_REPEAT        = 611;
+  GLUT_HAS_JOYSTICK             = 612;
+  GLUT_OWNS_JOYSTICK            = 613;
+  GLUT_JOYSTICK_BUTTONS         = 614;
+  GLUT_JOYSTICK_AXES            = 615;
+  GLUT_JOYSTICK_POLL_RATE       = 616;
+
+  // glutLayerGet parameters
+  GLUT_OVERLAY_POSSIBLE         = 800;
+  GLUT_LAYER_IN_USE             = 801;
+  GLUT_HAS_OVERLAY              = 802;
+  GLUT_TRANSPARENT_INDEX        = 803;
+  GLUT_NORMAL_DAMAGED           = 804;
+  GLUT_OVERLAY_DAMAGED          = 805;
+
+  // glutVideoResizeGet parameters
+  GLUT_VIDEO_RESIZE_POSSIBLE    = 900;
+  GLUT_VIDEO_RESIZE_IN_USE      = 901;
+  GLUT_VIDEO_RESIZE_X_DELTA     = 902;
+  GLUT_VIDEO_RESIZE_Y_DELTA     = 903;
+  GLUT_VIDEO_RESIZE_WIDTH_DELTA = 904;
+  GLUT_VIDEO_RESIZE_HEIGHT_DELTA= 905;
+  GLUT_VIDEO_RESIZE_X           = 906;
+  GLUT_VIDEO_RESIZE_Y           = 907;
+  GLUT_VIDEO_RESIZE_WIDTH       = 908;
+  GLUT_VIDEO_RESIZE_HEIGHT      = 909;
+
+  // glutGetModifiers return mask
+  GLUT_ACTIVE_SHIFT             = 1;
+  GLUT_ACTIVE_CTRL              = 2;
+  GLUT_ACTIVE_ALT               = 4;
+
+  // Cursor stuff ###
+
+// GLUT window callback sub-API
+type
+  TGlutDisplayFunc = procedure; extdecl
+  TGlutReshapeFunc = procedure(width, height: Integer); extdecl
+  TGlutTimerFunc = procedure(value: Integer); extdecl
+  TGlutKeyboardFunc = procedure(key: char;x,y:Integer); extdecl
+  TGlutIdleFunc = procedure; extdecl
+
+// GLUT game mode sub-API
+{$ifdef GLUT_GAME}
+// glutGameModeGet
+const
+  GLUT_GAME_MODE_ACTIVE         = 0;
+  GLUT_GAME_MODE_POSSIBLE       = 1;
+  GLUT_GAME_MODE_WIDTH          = 2;
+  GLUT_GAME_MODE_HEIGHT         = 3;
+  GLUT_GAME_MODE_PIXEL_DEPTH    = 4;
+  GLUT_GAME_MODE_REFRESH_RATE   = 5;
+  GLUT_GAME_MODE_DISPLAY_CHANGED= 6;
+{$endif GLUT_GAME}
+
+var
+// GLUT initialization sub-API
+  glutInit: procedure(var argcp: Integer; var argv: PChar); glut_dll
+  glutInitDisplayMode: procedure(mode: LongWord); glut_dll
+  glutInitDisplayString: procedure(AString: PChar); glut_dll
+  glutInitWindowPosition: procedure(x, y: Integer); glut_dll
+  glutInitWindowSize: procedure(width, height: Integer); glut_dll
+  glutMainLoop: procedure; glut_dll
+
+// GLUT window sub-API
+  glutCreateWindow: function(title: PChar): Integer; glut_dll
+  glutCreateSubWindow: function(win, x, y, width, height: Integer): Integer; glut_dll
+  glutDestroyWindow: procedure(win: Integer); glut_dll
+  glutPostRedisplay: procedure; glut_dll
+  glutPostWindowRedisplay: procedure(win: Integer); glut_dll
+  glutSwapBuffers: procedure; glut_dll
+  glutGetWindow: function: Integer; glut_dll
+  glutSetWindow: procedure(win: Integer); glut_dll
+  glutSetWindowTitle: procedure(title: PChar); glut_dll
+  glutSetIconTitle: procedure(title: PChar); glut_dll
+  glutPositionWindow: procedure(x, y: Integer); glut_dll
+  glutReshapeWindow: procedure(width, height: Integer); glut_dll
+  glutPopWindow: procedure; glut_dll
+  glutPushWindow: procedure; glut_dll
+  glutIconifyWindow: procedure; glut_dll
+  glutShowWindow: procedure; glut_dll
+  glutHideWindow: procedure; glut_dll
+  glutFullScreen: procedure; glut_dll
+  glutSetCursor: procedure(cursor: Integer); glut_dll
+  glutWarpPointer: procedure(x, y: Integer); glut_dll
+
+//overlays ###
+
+//menus ###
+
+// GLUT window callback sub-API
+  glutDisplayFunc: procedure(func: TGlutDisplayFunc); glut_dll
+  glutReshapeFunc: procedure(func: TGlutReshapeFunc); glut_dll
+
+  glutTimerFunc: procedure(millis: LongWord; func: TGlutTimerFunc; value: longint); glut_dll
+  glutKeyboardFunc : procedure(func: TGlutKeyboardFunc); glut_dll
+  glutIdleFunc : procedure(func: TGlutIdleFunc); glut_dll
+
+
+// GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK * func)(int width, int height));
+// GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK * func)(unsigned char key, int x, int y));
+// GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK * func)(int button, int state, int x, int y));
+// GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK * func)(int value), int value);
+// GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutSpecialFunc(void (GLUTCALLBACK * func)(int key, int x, int y));
+// GLUTAPI void APIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK * func)(int x, int y, int z));
+// GLUTAPI void APIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK * func)(int x, int y, int z));
+// GLUTAPI void APIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK * func)(int button, int state));
+// GLUTAPI void APIENTRY glutButtonBoxFunc(void (GLUTCALLBACK * func)(int button, int state));
+// GLUTAPI void APIENTRY glutDialsFunc(void (GLUTCALLBACK * func)(int dial, int value));
+// GLUTAPI void APIENTRY glutTabletMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutTabletButtonFunc(void (GLUTCALLBACK * func)(int button, int state, int x, int y));
+// GLUTAPI void APIENTRY glutMenuStatusFunc(void (GLUTCALLBACK * func)(int status, int x, int y));
+// GLUTAPI void APIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutWindowStatusFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK * func)(unsigned char key, int x, int y));
+// GLUTAPI void APIENTRY glutSpecialUpFunc(void (GLUTCALLBACK * func)(int key, int x, int y));
+// GLUTAPI void APIENTRY glutJoystickFunc(void (GLUTCALLBACK * func)(unsigned int buttonMask, int x, int y, int z), int pollInterval)
+
+// GLUT color index sub-API
+  glutSetColor: procedure(index: Integer; red, green, blue: Single); glut_dll
+  glutGetColor: function(ndx, component: Integer): Single; glut_dll
+  glutCopyColormap: procedure(win: Integer); glut_dll
+
+// GLUT state retrieval sub-API
+  glutGet: function(AType: GLEnum): Integer; glut_dll
+  glutDeviceGet: function(AType: GLEnum): Integer; glut_dll
+  glutExtensionSupported: function(name: PChar): Integer; glut_dll
+  glutGetModifiers: function: Integer; glut_dll
+  glutLayerGet: function(AType: GLEnum): Integer; glut_dll
+
+// fonts ###
+
+// pre-built models ###
+
+// video resize ###
+
+// debugging ###
+
+// device control ###
+
+
+// GLUT game mode sub-API
+{$ifdef GLUT_GAME}
+  glutGameModeString: procedure(AString: PChar); glut_dll
+  glutEnterGameMode: function: Integer; glut_dll
+  glutLeaveGameMode: procedure; glut_dll
+  glutGameModeGet: function(mode: GLEnum): Integer; glut_dll
+{$endif GLUT_GAME}
+
+
+implementation
+
+
+type
+  HInstance = LongWord;
+
+var
+  libGLUT: HInstance;
+
+function GetProc(handle: HInstance; name: PChar): Pointer;
+begin
+  Result := GetProcAddress(handle, name);
+  if (Result = nil) and GLUDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+function InitGLUTFromLibrary(libname: PChar): Boolean;
+begin
+  Result := False;
+  libGLUT := LoadLibrary(libname);
+  if libGLUT = 0 then exit;
+
+// GLUT initialization sub-API
+  glutInit := GetProc(libGLUT, 'glutInit');
+  glutInitDisplayMode := GetProc(libGLUT, 'glutInitDisplayMode');
+  glutInitDisplayString := GetProc(libGLUT, 'glutInitDisplayString');
+  glutInitWindowPosition := GetProc(libGLUT, 'glutInitWindowPosition');
+  glutInitWindowSize := GetProc(libGLUT, 'glutInitWindowSize');
+  glutMainLoop := GetProc(libGLUT, 'glutMainLoop');
+// GLUT window sub-API
+  glutCreateWindow := GetProc(libGLUT, 'glutCreateWindow');
+  glutCreateSubWindow := GetProc(libGLUT, 'glutCreateSubWindow');
+  glutDestroyWindow := GetProc(libGLUT, 'glutDestroyWindow');
+  glutPostRedisplay := GetProc(libGLUT, 'glutPostRedisplay');
+  glutPostWindowRedisplay := GetProc(libGLUT, 'glutPostWindowRedisplay');
+  glutSwapBuffers := GetProc(libGLUT, 'glutSwapBuffers');
+  glutGetWindow := GetProc(libGLUT, 'glutGetWindow');
+  glutSetWindow := GetProc(libGLUT, 'glutSetWindow');
+  glutSetWindowTitle := GetProc(libGLUT, 'glutSetWindowTitle');
+  glutSetIconTitle := GetProc(libGLUT, 'glutSetIconTitle');
+  glutPositionWindow := GetProc(libGLUT, 'glutPositionWindow');
+  glutReshapeWindow := GetProc(libGLUT, 'glutReshapeWindow');
+  glutPopWindow := GetProc(libGLUT, 'glutPopWindow');
+  glutPushWindow := GetProc(libGLUT, 'glutPushWindow');
+  glutIconifyWindow := GetProc(libGLUT, 'glutIconifyWindow');
+  glutShowWindow := GetProc(libGLUT, 'glutShowWindow');
+  glutHideWindow := GetProc(libGLUT, 'glutHideWindow');
+  glutFullScreen := GetProc(libGLUT, 'glutFullScreen');
+  glutSetCursor := GetProc(libGLUT, 'glutSetCursor');
+  glutWarpPointer := GetProc(libGLUT, 'glutWarpPointer');
+//overlays ###
+//menus ###
+// GLUT window callback sub-API
+  glutDisplayFunc := GetProc(libGLUT, 'glutDisplayFunc');
+  glutReshapeFunc := GetProc(libGLUT, 'glutReshapeFunc');
+  glutTimerFunc := GetProc(libGLUT, 'glutTimerFunc');
+  glutKeyboardFunc := GetProc(libGLUT, 'glutKeyboardFunc');
+  glutIdleFunc := GetProc(libGLUT, 'glutIdleFunc');
+// GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK * func)(int width, int height));
+// GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK * func)(unsigned char key, int x, int y));
+// GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK * func)(int button, int state, int x, int y));
+// GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK * func)(int value), int value);
+// GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutSpecialFunc(void (GLUTCALLBACK * func)(int key, int x, int y));
+// GLUTAPI void APIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK * func)(int x, int y, int z));
+// GLUTAPI void APIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK * func)(int x, int y, int z));
+// GLUTAPI void APIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK * func)(int button, int state));
+// GLUTAPI void APIENTRY glutButtonBoxFunc(void (GLUTCALLBACK * func)(int button, int state));
+// GLUTAPI void APIENTRY glutDialsFunc(void (GLUTCALLBACK * func)(int dial, int value));
+// GLUTAPI void APIENTRY glutTabletMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutTabletButtonFunc(void (GLUTCALLBACK * func)(int button, int state, int x, int y));
+// GLUTAPI void APIENTRY glutMenuStatusFunc(void (GLUTCALLBACK * func)(int status, int x, int y));
+// GLUTAPI void APIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutWindowStatusFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK * func)(unsigned char key, int x, int y));
+// GLUTAPI void APIENTRY glutSpecialUpFunc(void (GLUTCALLBACK * func)(int key, int x, int y));
+// GLUTAPI void APIENTRY glutJoystickFunc(void (GLUTCALLBACK * func)(unsigned int buttonMask, int x, int y, int z), int pollInterval)
+// GLUT color index sub-API
+  glutSetColor := GetProc(libGLUT, 'glutSetColor');
+  glutGetColor := GetProc(libGLUT, 'glutGetColor');
+  glutCopyColormap := GetProc(libGLUT, 'glutCopyColormap');
+// GLUT state retrieval sub-API
+  glutGet := GetProc(libGLUT, 'glutGet');
+  glutDeviceGet := GetProc(libGLUT, 'glutDeviceGet');
+  glutExtensionSupported := GetProc(libGLUT, 'glutExtensionSupported');
+  glutGetModifiers := GetProc(libGLUT, 'glutGetModifiers');
+  glutLayerGet := GetProc(libGLUT, 'glutLayerGet');
+// fonts ###
+// pre-built models ###
+// video resize ###
+// debugging ###
+// device control ###
+// GLUT game mode sub-API
+{$ifdef GLUT_GAME}
+  glutGameModeString := GetProc(libGLUT, 'glutGameModeString');
+  glutEnterGameMode := GetProc(libGLUT, 'glutEnterGameMode');
+  glutLeaveGameMode := GetProc(libGLUT, 'glutLeaveGameMode');
+  glutGameModeGet := GetProc(libGLUT, 'glutGameModeGet');
+{$endif GLUT_GAME}
+
+  GLUTInitialized := True;
+  Result := True;
+end;
+
+
+function InitGLUT: Boolean;
+begin
+  Result := InitGLUTFromLibrary('glut32.dll');
+end;
+
+
+initialization
+  InitGLUT;
+finalization
+  if libGLUT <> 0 then FreeLibrary(libGLUT);
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:46  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}

+ 321 - 0
packages/opengl/win32/glut_sl.pp

@@ -0,0 +1,321 @@
+{
+  $Id$
+
+  Translation of the GLUT headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+  Version for static linking in Win32 environment by Alexander Stohr.
+  Latest change: 1999-11-13
+
+  Further information:
+
+  GLUT is a powerful toolkit for programming multiplatform OpenGL
+  applications. It was designed by Mark J. Kilgard while working for SGI,
+  he is now working for nVidia.
+}
+{ this translation of the c header files is done by Sebastian Guenther 1999 }
+{ version for static linking for Win32 platforms done by Alexander Stohr 1999 }
+
+{$MODE delphi}
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GLUT_SL; { version which does statically linking }
+
+
+interface
+
+uses GL_SL;
+
+{x$DEFINE GLUT_GAME} {enable if you need game mode sub api}
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glut_dll := external 'glut32.dll'}
+  {$DEFINE glut_callback := cdecl}
+  {$DEFINE extdecl := }
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+
+const
+  // Display mode bit masks
+  GLUT_RGB                      = 0;
+  GLUT_RGBA                     = GLUT_RGB;
+  GLUT_INDEX                    = 1;
+  GLUT_SINGLE                   = 0;
+  GLUT_DOUBLE                   = 2;
+  GLUT_ACCUM                    = 4;
+  GLUT_ALPHA                    = 8;
+  GLUT_DEPTH                    = 16;
+  GLUT_STENCIL                  = 32;
+  GLUT_MULTISAMPLE              = 128;
+  GLUT_STEREO                   = 256;
+  GLUT_LUMINANCE                = 512;
+
+  // Mouse buttons
+  GLUT_LEFT_BUTTON              = 0;
+  GLUT_MIDDLE_BUTTON            = 1;
+  GLUT_RIGHT_BUTTON             = 2;
+
+  // Mouse button state
+  GLUT_DOWN                     = 0;
+  GLUT_UP                       = 1;
+
+  // Keys ###
+
+  // Enter / exit state
+  GLUT_LEFT                     = 0;
+  GLUT_ENTERED                  = 1;
+
+  // Menu usage state
+  GLUT_MENU_NOT_IN_USE          = 0;
+  GLUT_MENU_IN_USE              = 1;
+
+  // Visibility state
+  GLUT_NOT_VISIBLE              = 0;
+  GLUT_VISIBLE                  = 1;
+
+  // Window status state
+  GLUT_HIDDEN                   = 0;
+  GLUT_FULLY_RETAINED           = 1;
+  GLUT_PARTIALLY_RETAINED       = 2;
+  GLUT_FULLY_COVERED            = 3;
+
+  // Color index component selection values
+  GLUT_RED                      = 0;
+  GLUT_GREEN                    = 1;
+  GLUT_BLUE                     = 2;
+
+  // Layers for use
+  GLUT_NORMAL                   = 0;
+  GLUT_OVERLAY                  = 1;
+
+  // Bitmap stuff###
+
+
+  // glutGet parameters
+  GLUT_WINDOW_X                 = 100;
+  GLUT_WINDOW_Y                 = 101;
+  GLUT_WINDOW_WIDTH             = 102;
+  GLUT_WINDOW_HEIGHT            = 103;
+  GLUT_WINDOW_BUFFER_SIZE       = 104;
+  GLUT_WINDOW_STENCIL_SIZE      = 105;
+  GLUT_WINDOW_DEPTH_SIZE        = 106;
+  GLUT_WINDOW_RED_SIZE          = 107;
+  GLUT_WINDOW_GREEN_SIZE        = 108;
+  GLUT_WINDOW_BLUE_SIZE         = 109;
+  GLUT_WINDOW_ALPHA_SIZE        = 110;
+  GLUT_WINDOW_ACCUM_RED_SIZE    = 111;
+  GLUT_WINDOW_ACCUM_GREEN_SIZE  = 112;
+  GLUT_WINDOW_ACCUM_BLUE_SIZE   = 113;
+  GLUT_WINDOW_ACCUM_ALPHA_SIZE  = 114;
+  GLUT_WINDOW_DOUBLEBUFFER      = 115;
+  GLUT_WINDOW_RGBA              = 116;
+  GLUT_WINDOW_PARENT            = 117;
+  GLUT_WINDOW_NUM_CHILDREN      = 118;
+  GLUT_WINDOW_COLORMAP_SIZE     = 119;
+  GLUT_WINDOW_NUM_SAMPLES       = 120;
+  GLUT_WINDOW_STEREO            = 121;
+  GLUT_WINDOW_CURSOR            = 122;
+  GLUT_SCREEN_WIDTH             = 200;
+  GLUT_SCREEN_HEIGHT            = 201;
+  GLUT_SCREEN_WIDTH_MM          = 202;
+  GLUT_SCREEN_HEIGHT_MM         = 203;
+  GLUT_MENU_NUM_ITEMS           = 300;
+  GLUT_DISPLAY_MODE_POSSIBLE    = 400;
+  GLUT_INIT_WINDOW_X            = 500;
+  GLUT_INIT_WINDOW_Y            = 501;
+  GLUT_INIT_WINDOW_WIDTH        = 502;
+  GLUT_INIT_WINDOW_HEIGHT       = 503;
+  GLUT_INIT_DISPLAY_MODE        = 504;
+  GLUT_ELAPSED_TIME             = 700;
+  GLUT_WINDOW_FORMAT_ID         = 123;
+
+  // glutDeviceGet parameters
+  GLUT_HAS_KEYBOARD             = 600;
+  GLUT_HAS_MOUSE                = 601;
+  GLUT_HAS_SPACEBALL            = 602;
+  GLUT_HAS_DIAL_AND_BUTTON_BOX  = 603;
+  GLUT_HAS_TABLET               = 604;
+  GLUT_NUM_MOUSE_BUTTONS        = 605;
+  GLUT_NUM_SPACEBALL_BUTTONS    = 606;
+  GLUT_NUM_BUTTON_BOX_BUTTONS   = 607;
+  GLUT_NUM_DIALS                = 608;
+  GLUT_NUM_TABLET_BUTTONS       = 609;
+  GLUT_DEVICE_IGNORE_KEY_REPEAT = 610;
+  GLUT_DEVICE_KEY_REPEAT        = 611;
+  GLUT_HAS_JOYSTICK             = 612;
+  GLUT_OWNS_JOYSTICK            = 613;
+  GLUT_JOYSTICK_BUTTONS         = 614;
+  GLUT_JOYSTICK_AXES            = 615;
+  GLUT_JOYSTICK_POLL_RATE       = 616;
+
+  // glutLayerGet parameters
+  GLUT_OVERLAY_POSSIBLE         = 800;
+  GLUT_LAYER_IN_USE             = 801;
+  GLUT_HAS_OVERLAY              = 802;
+  GLUT_TRANSPARENT_INDEX        = 803;
+  GLUT_NORMAL_DAMAGED           = 804;
+  GLUT_OVERLAY_DAMAGED          = 805;
+
+  // glutVideoResizeGet parameters
+  GLUT_VIDEO_RESIZE_POSSIBLE    = 900;
+  GLUT_VIDEO_RESIZE_IN_USE      = 901;
+  GLUT_VIDEO_RESIZE_X_DELTA     = 902;
+  GLUT_VIDEO_RESIZE_Y_DELTA     = 903;
+  GLUT_VIDEO_RESIZE_WIDTH_DELTA = 904;
+  GLUT_VIDEO_RESIZE_HEIGHT_DELTA= 905;
+  GLUT_VIDEO_RESIZE_X           = 906;
+  GLUT_VIDEO_RESIZE_Y           = 907;
+  GLUT_VIDEO_RESIZE_WIDTH       = 908;
+  GLUT_VIDEO_RESIZE_HEIGHT      = 909;
+
+  // glutGetModifiers return mask
+  GLUT_ACTIVE_SHIFT             = 1;
+  GLUT_ACTIVE_CTRL              = 2;
+  GLUT_ACTIVE_ALT               = 4;
+
+  // Cursor stuff ###
+
+// GLUT window callback sub-API
+type
+  TGlutDisplayFunc = procedure; extdecl
+  TGlutReshapeFunc = procedure(width, height: Integer); extdecl
+  TGlutTimerFunc = procedure(value: Integer); extdecl
+  TGlutKeyboardFunc = procedure(key: char;x,y:Integer); extdecl
+  TGlutIdleFunc = procedure; extdecl
+
+// GLUT game mode sub-API
+{$ifdef GLUT_GAME}
+// glutGameModeGet
+const
+  GLUT_GAME_MODE_ACTIVE         = 0;
+  GLUT_GAME_MODE_POSSIBLE       = 1;
+  GLUT_GAME_MODE_WIDTH          = 2;
+  GLUT_GAME_MODE_HEIGHT         = 3;
+  GLUT_GAME_MODE_PIXEL_DEPTH    = 4;
+  GLUT_GAME_MODE_REFRESH_RATE   = 5;
+  GLUT_GAME_MODE_DISPLAY_CHANGED= 6;
+{$endif GLUT_GAME}
+
+// GLUT initialization sub-API
+procedure glutInit(var argcp: Integer; var argv: PChar); glut_dll;
+procedure glutInitDisplayMode(mode: LongWord); glut_dll;
+procedure glutInitDisplayString(AString: PChar); glut_dll;
+procedure glutInitWindowPosition(x, y: Integer); glut_dll;
+procedure glutInitWindowSize(width, height: Integer); glut_dll;
+procedure glutMainLoop; glut_dll;
+
+// GLUT window sub-API
+function glutCreateWindow(title: PChar): Integer; glut_dll;
+function glutCreateSubWindow(win, x, y, width, height: Integer): Integer; glut_dll;
+procedure glutDestroyWindow(win: Integer); glut_dll;
+procedure glutPostRedisplay; glut_dll;
+procedure glutPostWindowRedisplay(win: Integer); glut_dll;
+procedure glutSwapBuffers; glut_dll;
+function glutGetWindow: Integer; glut_dll;
+procedure glutSetWindow(win: Integer); glut_dll;
+procedure glutSetWindowTitle(title: PChar); glut_dll;
+procedure glutSetIconTitle(title: PChar); glut_dll;
+procedure glutPositionWindow(x, y: Integer); glut_dll;
+procedure glutReshapeWindow(width, height: Integer); glut_dll;
+procedure glutPopWindow; glut_dll;
+procedure glutPushWindow; glut_dll;
+procedure glutIconifyWindow; glut_dll;
+procedure glutShowWindow; glut_dll;
+procedure glutHideWindow; glut_dll;
+procedure glutFullScreen; glut_dll;
+procedure glutSetCursor(cursor: Integer); glut_dll;
+procedure glutWarpPointer(x, y: Integer); glut_dll;
+
+//overlays ###
+
+//menus ###
+
+// GLUT window callback sub-API
+procedure glutDisplayFunc(func: TGlutDisplayFunc); glut_dll;
+procedure glutReshapeFunc(func: TGlutReshapeFunc); glut_dll;
+
+procedure glutTimerFunc(millis: LongWord; func: TGlutTimerFunc; value: longint); glut_dll;
+procedure glutKeyboardFunc(func: TGlutKeyboardFunc); glut_dll;
+procedure glutIdleFunc(func: TGlutIdleFunc); glut_dll;
+
+
+// GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK * func)(int width, int height));
+// GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK * func)(unsigned char key, int x, int y));
+// GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK * func)(int button, int state, int x, int y));
+// GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK * func)(int value), int value);
+// GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutSpecialFunc(void (GLUTCALLBACK * func)(int key, int x, int y));
+// GLUTAPI void APIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK * func)(int x, int y, int z));
+// GLUTAPI void APIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK * func)(int x, int y, int z));
+// GLUTAPI void APIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK * func)(int button, int state));
+// GLUTAPI void APIENTRY glutButtonBoxFunc(void (GLUTCALLBACK * func)(int button, int state));
+// GLUTAPI void APIENTRY glutDialsFunc(void (GLUTCALLBACK * func)(int dial, int value));
+// GLUTAPI void APIENTRY glutTabletMotionFunc(void (GLUTCALLBACK * func)(int x, int y));
+// GLUTAPI void APIENTRY glutTabletButtonFunc(void (GLUTCALLBACK * func)(int button, int state, int x, int y));
+// GLUTAPI void APIENTRY glutMenuStatusFunc(void (GLUTCALLBACK * func)(int status, int x, int y));
+// GLUTAPI void APIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK * func)(void));
+// GLUTAPI void APIENTRY glutWindowStatusFunc(void (GLUTCALLBACK * func)(int state));
+// GLUTAPI void APIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK * func)(unsigned char key, int x, int y));
+// GLUTAPI void APIENTRY glutSpecialUpFunc(void (GLUTCALLBACK * func)(int key, int x, int y));
+// GLUTAPI void APIENTRY glutJoystickFunc(void (GLUTCALLBACK * func)(unsigned int buttonMask, int x, int y, int z), int pollInterval)
+
+// GLUT color index sub-API
+procedure glutSetColor(index: Integer; red, green, blue: Single); glut_dll;
+function glutGetColor(ndx, component: Integer): Single; glut_dll;
+procedure glutCopyColormap(win: Integer); glut_dll;
+
+// GLUT state retrieval sub-API
+function glutGet(AType: GLEnum): Integer; glut_dll;
+function glutDeviceGet(AType: GLEnum): Integer; glut_dll;
+function glutExtensionSupported(name: PChar): Integer; glut_dll;
+function glutGetModifiers: Integer; glut_dll;
+function glutLayerGet(AType: GLEnum): Integer; glut_dll;
+
+// fonts ###
+
+// pre-built models ###
+
+// video resize ###
+
+// debugging ###
+
+// device control ###
+
+
+// GLUT game mode sub-API
+ {$ifdef GLUT_GAME} glut_dll;
+procedure glutGameModeString(AString: PChar); glut_dll;
+function glutEnterGameMode: Integer; glut_dll;
+procedure glutLeaveGameMode; glut_dll;
+function glutGameModeGet(mode: GLEnum): Integer; glut_dll;
+ {$endif GLUT_GAME} glut_dll;
+
+
+implementation
+
+
+{begin{of init}
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:46  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}

+ 263 - 0
packages/opengl/win32/glx.pp

@@ -0,0 +1,263 @@
+{
+  $Id$
+
+  Translation of the Mesa GLX headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GLX;
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glx_dll := external 'unknown.dll'}
+  uses Windows;
+  {x$DEFINE HasGLX}  // Activate GLX stuff
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+{$IFNDEF HasGLX}
+  {$MESSAGE GLX not present on this platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+// Note: Requires that the GL library has already been initialized
+function InitGLX: Boolean;
+
+var
+  GLXDumpUnresolvedFunctions,
+  GLXInitialized: Boolean;
+
+
+// =======================================================
+//   GLX consts, types and functions
+// =======================================================
+
+// Tokens for glXChooseVisual and glXGetConfig:
+const
+  GLX_USE_GL                            = 1;
+  GLX_BUFFER_SIZE                       = 2;
+  GLX_LEVEL                             = 3;
+  GLX_RGBA                              = 4;
+  GLX_DOUBLEBUFFER                      = 5;
+  GLX_STEREO                            = 6;
+  GLX_AUX_BUFFERS                       = 7;
+  GLX_RED_SIZE                          = 8;
+  GLX_GREEN_SIZE                        = 9;
+  GLX_BLUE_SIZE                         = 10;
+  GLX_ALPHA_SIZE                        = 11;
+  GLX_DEPTH_SIZE                        = 12;
+  GLX_STENCIL_SIZE                      = 13;
+  GLX_ACCUM_RED_SIZE                    = 14;
+  GLX_ACCUM_GREEN_SIZE                  = 15;
+  GLX_ACCUM_BLUE_SIZE                   = 16;
+  GLX_ACCUM_ALPHA_SIZE                  = 17;
+
+  // GLX_EXT_visual_info extension
+  GLX_X_VISUAL_TYPE_EXT                 = $22;
+  GLX_TRANSPARENT_TYPE_EXT              = $23;
+  GLX_TRANSPARENT_INDEX_VALUE_EXT       = $24;
+  GLX_TRANSPARENT_RED_VALUE_EXT         = $25;
+  GLX_TRANSPARENT_GREEN_VALUE_EXT       = $26;
+  GLX_TRANSPARENT_BLUE_VALUE_EXT        = $27;
+  GLX_TRANSPARENT_ALPHA_VALUE_EXT       = $28;
+
+
+  // Error codes returned by glXGetConfig:
+  GLX_BAD_SCREEN                        = 1;
+  GLX_BAD_ATTRIBUTE                     = 2;
+  GLX_NO_EXTENSION                      = 3;
+  GLX_BAD_VISUAL                        = 4;
+  GLX_BAD_CONTEXT                       = 5;
+  GLX_BAD_VALUE                         = 6;
+  GLX_BAD_ENUM                          = 7;
+
+  // GLX 1.1 and later:
+  GLX_VENDOR                            = 1;
+  GLX_VERSION                           = 2;
+  GLX_EXTENSIONS                        = 3;
+
+  // GLX_visual_info extension
+  GLX_TRUE_COLOR_EXT                    = $8002;
+  GLX_DIRECT_COLOR_EXT                  = $8003;
+  GLX_PSEUDO_COLOR_EXT                  = $8004;
+  GLX_STATIC_COLOR_EXT                  = $8005;
+  GLX_GRAY_SCALE_EXT                    = $8006;
+  GLX_STATIC_GRAY_EXT                   = $8007;
+  GLX_NONE_EXT                          = $8000;
+  GLX_TRANSPARENT_RGB_EXT               = $8008;
+  GLX_TRANSPARENT_INDEX_EXT             = $8009;
+
+type
+  // From XLib:
+  XPixmap = TXID;
+  XFont = TXID;
+  XColormap = TXID;
+
+  GLXContext = Pointer;
+  GLXPixmap = TXID;
+  GLXDrawable = TXID;
+  GLXContextID = TXID;
+
+var
+  glXChooseVisual: function(dpy: PDisplay; screen: Integer; var attribList: Integer): PXVisualInfo; cdecl; glx_dll
+  glXCreateContext: function(dpy: PDisplay; vis: PXVisualInfo; shareList: GLXContext; direct: Boolean): GLXContext; cdecl; glx_dll
+  glXDestroyContext: procedure(dpy: PDisplay; ctx: GLXContext); cdecl; glx_dll
+  glXMakeCurrent: function(dpy: PDisplay; drawable: GLXDrawable; ctx: GLXContext): Boolean; cdecl; glx_dll
+  glXCopyContext: procedure(dpy: PDisplay; src, dst: GLXContext; mask: LongWord); cdecl; glx_dll
+  glXSwapBuffers: procedure(dpy: PDisplay; drawable: GLXDrawable); cdecl; glx_dll
+  glXCreateGLXPixmap: function(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap): GLXPixmap; cdecl; glx_dll
+  glXDestroyGLXPixmap: procedure(dpy: PDisplay; pixmap: GLXPixmap); cdecl; glx_dll
+  glXQueryExtension: function(dpy: PDisplay; var errorb, event: Integer): Boolean; cdecl; glx_dll
+  glXQueryVersion: function(dpy: PDisplay; var maj, min: Integer): Boolean; cdecl; glx_dll
+  glXIsDirect: function(dpy: PDisplay; ctx: GLXContext): Boolean; cdecl; glx_dll
+  glXGetConfig: function(dpy: PDisplay; visual: PXVisualInfo; attrib: Integer; var value: Integer): Integer; cdecl; glx_dll
+  glXGetCurrentContext: function: GLXContext; cdecl; glx_dll
+  glXGetCurrentDrawable: function: GLXDrawable; cdecl; glx_dll
+  glXWaitGL: procedure; cdecl; glx_dll
+  glXWaitX: procedure; cdecl; glx_dll
+  glXUseXFont: procedure(font: XFont; first, count, list: Integer); cdecl; glx_dll
+
+  // GLX 1.1 and later
+  glXQueryExtensionsString: function(dpy: PDisplay; screen: Integer): PChar; cdecl; glx_dll
+  glXQueryServerString: function(dpy: PDisplay; screen, name: Integer): PChar; cdecl; glx_dll
+  glXGetClientString: function(dpy: PDisplay; name: Integer): PChar; cdecl; glx_dll
+
+  // Mesa GLX Extensions
+  glXCreateGLXPixmapMESA: function(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap; cmap: XColormap): GLXPixmap; cdecl; glx_dll
+  glXReleaseBufferMESA: function(dpy: PDisplay; d: GLXDrawable): Boolean; cdecl; glx_dll
+  glXCopySubBufferMESA: procedure(dpy: PDisplay; drawbale: GLXDrawable; x, y, width, height: Integer); cdecl; glx_dll
+  glXGetVideoSyncSGI: function(var counter: LongWord): Integer; cdecl; glx_dll
+  glXWaitVideoSyncSGI: function(divisor, remainder: Integer; var count: LongWord): Integer; cdecl; glx_dll
+
+
+// =======================================================
+//
+// =======================================================
+
+implementation
+
+type
+  HInstance = LongWord;
+
+{$IFDEF HasGLX}
+
+var
+  libGLX : HInstance;
+
+function GetProc(handle: HInstance; name: PChar): Pointer;
+begin
+  Result := GetProcAddress(handle, name);
+  if (Result = nil) and GLXDumpUnresolvedFunctions then
+    WriteLn('Unresolved: ', name);
+end;
+
+function InitGLX: Boolean;
+begin
+  Result := False;
+  { Unix GLX is implemented as special subset of the GL interface }
+  if libGL = 0 then exit;
+
+  glXQueryVersion := GetProcAddress(libGL, 'glXQueryVersion');
+  if @glXQueryVersion = nil then exit;
+
+  glXChooseVisual := GetProc(libGLX, 'glXChooseVisual');
+  glXCreateContext := GetProc(libGLX, 'glXCreateContext');
+  glXDestroyContext := GetProc(libGLX, 'glXDestroyContext');
+  glXMakeCurrent := GetProc(libGLX, 'glXMakeCurrent');
+  glXCopyContext := GetProc(libGLX, 'glXCopyContext');
+  glXSwapBuffers := GetProc(libGLX, 'glXSwapBuffers');
+  glXCreateGLXPixmap := GetProc(libGLX, 'glXCreateGLXPixmap');
+  glXDestroyGLXPixmap := GetProc(libGLX, 'glXDestroyGLXPixmap');
+  glXQueryExtension := GetProc(libGLX, 'glXQueryExtension');
+  glXQueryVersion := GetProc(libGLX, 'glXQueryVersion');
+  glXIsDirect := GetProc(libGLX, 'glXIsDirect');
+  glXGetConfig := GetProc(libGLX, 'glXGetConfig');
+  glXGetCurrentContext := GetProc(libGLX, 'glXGetCurrentContext');
+  glXGetCurrentDrawable := GetProc(libGLX, 'glXGetCurrentDrawable');
+  glXWaitGL := GetProc(libGLX, 'glXWaitGL');
+  glXWaitX := GetProc(libGLX, 'glXWaitX');
+  glXUseXFont := GetProc(libGLX, 'glXUseXFont');
+  // GLX 1.1 and later
+  glXQueryExtensionsString := GetProc(libGLX, 'glXQueryExtensionsString');
+  glXQueryServerString := GetProc(libGLX, 'glXQueryServerString');
+  glXGetClientString := GetProc(libGLX, 'glXGetClientString');
+  // Mesa GLX Extensions
+  glXCreateGLXPixmapMESA := GetProc(libGLX, 'glXCreateGLXPixmapMESA');
+  glXReleaseBufferMESA := GetProc(libGLX, 'glXReleaseBufferMESA');
+  glXCopySubBufferMESA := GetProc(libGLX, 'glXCopySubBufferMESA');
+  glXGetVideoSyncSGI := GetProc(libGLX, 'glXGetVideoSyncSGI');
+  glXWaitVideoSyncSGI := GetProc(libGLX, 'glXWaitVideoSyncSGI');
+
+  GLXInitialized := True;
+  Result := True;
+end;
+
+{$ENDIF  IFDEF HasGLX}
+
+
+initialization
+  InitGLX;
+finalization
+  if libGLX <> 0 then FreeLibrary(libGLX);
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:46  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:18  michael
+  + Initial import
+
+  Revision 1.1  2000/05/31 00:36:08  alex
+  dummy - incomplete code.
+
+}
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:46  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}

+ 192 - 0
packages/opengl/win32/glx_sl.pp

@@ -0,0 +1,192 @@
+{
+  $Id$
+
+  Translation of the Mesa GLX headers for FreePascal
+  Copyright (C) 1999 Sebastian Guenther
+
+
+  Mesa 3-D graphics library
+  Version:  3.0
+  Copyright (C) 1995-1998  Brian Paul
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Library General Public
+  License as published by the Free Software Foundation; either
+  version 2 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Library General Public License for more details.
+
+  You should have received a copy of the GNU Library General Public
+  License along with this library; if not, write to the Free
+  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+{$MODE delphi}  // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+unit GLX_SL;
+
+interface
+
+{$MACRO ON}
+
+{$IFDEF Win32}
+  {$DEFINE glx_dll := external 'unknown.dll'}
+  uses Windows;
+  {x$DEFINE HasGLX}  // Activate GLX stuff
+{$ELSE}
+  {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+{$IFNDEF HasGLX}
+  {$MESSAGE GLX not present on this platform.}
+{$ENDIF}
+
+
+// =======================================================
+//   Unit specific extensions
+// =======================================================
+
+
+// =======================================================
+//   GLX consts, types and functions
+// =======================================================
+
+// Tokens for glXChooseVisual and glXGetConfig:
+const
+  GLX_USE_GL                            = 1;
+  GLX_BUFFER_SIZE                       = 2;
+  GLX_LEVEL                             = 3;
+  GLX_RGBA                              = 4;
+  GLX_DOUBLEBUFFER                      = 5;
+  GLX_STEREO                            = 6;
+  GLX_AUX_BUFFERS                       = 7;
+  GLX_RED_SIZE                          = 8;
+  GLX_GREEN_SIZE                        = 9;
+  GLX_BLUE_SIZE                         = 10;
+  GLX_ALPHA_SIZE                        = 11;
+  GLX_DEPTH_SIZE                        = 12;
+  GLX_STENCIL_SIZE                      = 13;
+  GLX_ACCUM_RED_SIZE                    = 14;
+  GLX_ACCUM_GREEN_SIZE                  = 15;
+  GLX_ACCUM_BLUE_SIZE                   = 16;
+  GLX_ACCUM_ALPHA_SIZE                  = 17;
+
+  // GLX_EXT_visual_info extension
+  GLX_X_VISUAL_TYPE_EXT                 = $22;
+  GLX_TRANSPARENT_TYPE_EXT              = $23;
+  GLX_TRANSPARENT_INDEX_VALUE_EXT       = $24;
+  GLX_TRANSPARENT_RED_VALUE_EXT         = $25;
+  GLX_TRANSPARENT_GREEN_VALUE_EXT       = $26;
+  GLX_TRANSPARENT_BLUE_VALUE_EXT        = $27;
+  GLX_TRANSPARENT_ALPHA_VALUE_EXT       = $28;
+
+
+  // Error codes returned by glXGetConfig:
+  GLX_BAD_SCREEN                        = 1;
+  GLX_BAD_ATTRIBUTE                     = 2;
+  GLX_NO_EXTENSION                      = 3;
+  GLX_BAD_VISUAL                        = 4;
+  GLX_BAD_CONTEXT                       = 5;
+  GLX_BAD_VALUE                         = 6;
+  GLX_BAD_ENUM                          = 7;
+
+  // GLX 1.1 and later:
+  GLX_VENDOR                            = 1;
+  GLX_VERSION                           = 2;
+  GLX_EXTENSIONS                        = 3;
+
+  // GLX_visual_info extension
+  GLX_TRUE_COLOR_EXT                    = $8002;
+  GLX_DIRECT_COLOR_EXT                  = $8003;
+  GLX_PSEUDO_COLOR_EXT                  = $8004;
+  GLX_STATIC_COLOR_EXT                  = $8005;
+  GLX_GRAY_SCALE_EXT                    = $8006;
+  GLX_STATIC_GRAY_EXT                   = $8007;
+  GLX_NONE_EXT                          = $8000;
+  GLX_TRANSPARENT_RGB_EXT               = $8008;
+  GLX_TRANSPARENT_INDEX_EXT             = $8009;
+
+type
+  // From XLib:
+  XPixmap = TXID;
+  XFont = TXID;
+  XColormap = TXID;
+
+  GLXContext = Pointer;
+  GLXPixmap = TXID;
+  GLXDrawable = TXID;
+  GLXContextID = TXID;
+
+function glXChooseVisual(dpy: PDisplay; screen: Integer; var attribList: Integer): PXVisualInfo; cdecl; glx_dll;
+function glXCreateContext(dpy: PDisplay; vis: PXVisualInfo; shareList: GLXContext; direct: Boolean): GLXContext; cdecl; glx_dll;
+procedure glXDestroyContext(dpy: PDisplay; ctx: GLXContext); cdecl; glx_dll;
+function glXMakeCurrent(dpy: PDisplay; drawable: GLXDrawable; ctx: GLXContext): Boolean; cdecl; glx_dll;
+procedure glXCopyContext(dpy: PDisplay; src, dst: GLXContext; mask: LongWord); cdecl; glx_dll;
+procedure glXSwapBuffers(dpy: PDisplay; drawable: GLXDrawable); cdecl; glx_dll;
+function glXCreateGLXPixmap(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap): GLXPixmap; cdecl; glx_dll;
+procedure glXDestroyGLXPixmap(dpy: PDisplay; pixmap: GLXPixmap); cdecl; glx_dll;
+function glXQueryExtension(dpy: PDisplay; var errorb, event: Integer): Boolean; cdecl; glx_dll;
+function glXQueryVersion(dpy: PDisplay; var maj, min: Integer): Boolean; cdecl; glx_dll;
+function glXIsDirect(dpy: PDisplay; ctx: GLXContext): Boolean; cdecl; glx_dll;
+function glXGetConfig(dpy: PDisplay; visual: PXVisualInfo; attrib: Integer; var value: Integer): Integer; cdecl; glx_dll;
+function glXGetCurrentContext: GLXContext; cdecl; glx_dll;
+function glXGetCurrentDrawable: GLXDrawable; cdecl; glx_dll;
+procedure glXWaitGL; cdecl; glx_dll;
+procedure glXWaitX; cdecl; glx_dll;
+procedure glXUseXFont(font: XFont; first, count, list: Integer); cdecl; glx_dll;
+
+  // GLX 1.1 and later
+function glXQueryExtensionsString(dpy: PDisplay; screen: Integer): PChar; cdecl; glx_dll;
+function glXQueryServerString(dpy: PDisplay; screen, name: Integer): PChar; cdecl; glx_dll;
+function glXGetClientString(dpy: PDisplay; name: Integer): PChar; cdecl; glx_dll;
+
+  // Mesa GLX Extensions
+function glXCreateGLXPixmapMESA(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap; cmap: XColormap): GLXPixmap; cdecl; glx_dll;
+function glXReleaseBufferMESA(dpy: PDisplay; d: GLXDrawable): Boolean; cdecl; glx_dll;
+procedure glXCopySubBufferMESA(dpy: PDisplay; drawbale: GLXDrawable; x, y, width, height: Integer); cdecl; glx_dll;
+function glXGetVideoSyncSGI(var counter: LongWord): Integer; cdecl; glx_dll;
+function glXWaitVideoSyncSGI(divisor, remainder: Integer; var count: LongWord): Integer; cdecl; glx_dll;
+
+
+// =======================================================
+//
+// =======================================================
+
+implementation
+
+end.
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:46  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+  Revision 1.1  2000/07/13 06:34:18  michael
+  + Initial import
+
+  Revision 1.1  2000/05/31 00:36:08  alex
+  dummy - incomplete code.
+
+}
+
+
+{
+  $Log$
+  Revision 1.1  2000-09-03 21:25:46  peter
+    * new updated version
+    * gtkglarea unit and demo
+    * win32 opengl headers
+    * morph3d demo
+
+}