Browse Source

* added the new, adapted OpenGL examples...

sg 23 years ago
parent
commit
6ec5674995

+ 1319 - 0
packages/extra/opengl/examples/Makefile

@@ -0,0 +1,1319 @@
+#
+# Don't edit, this file is generated by FPCMake Version 1.1 [2002/10/11]
+#
+default: all
+MAKEFILETARGETS=linux go32v2 win32 os2 freebsd beos netbsd amiga atari sunos qnx netware openbsd wdosx
+override PATH:=$(subst \,/,$(PATH))
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygwin,$(MACHTYPE)),)
+inCygWin=1
+endif
+endif
+ifeq ($(OS_TARGET),freebsd)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),netbsd)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),openbsd)
+BSDhier=1
+endif
+ifdef inUnix
+BATCHEXT=.sh
+else
+ifdef inOS2
+BATCHEXT=.cmd
+else
+BATCHEXT=.bat
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifneq ($(findstring sh.exe,$(SHELL)),)
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../../../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+FPC:=$(shell $(FPCPROG) -PB)
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=ppc386
+endif
+else
+override FPC=ppc386
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+ifndef FPC_VERSION
+FPC_VERSION:=$(shell $(FPC) -iV)
+endif
+export FPC FPC_VERSION
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+COMPILERINFO:=$(shell $(FPC) -iSP -iTP -iSO -iTO)
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 1,$(COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 2,$(COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 3,$(COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 4,$(COMPILERINFO))
+endif
+else
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(shell $(FPC) -iSP)
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(shell $(FPC) -iTP)
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(shell $(FPC) -iSO)
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(shell $(FPC) -iTO)
+endif
+endif
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(OS_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(OS_TARGET), please run fpcmake first)
+endif
+endif
+export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+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 $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+ifndef CROSSDIR
+CROSSDIR:=$(FPCDIR)/cross/$(FULL_TARGET)
+endif
+ifndef CROSSTARGETDIR
+CROSSTARGETDIR=$(CROSSDIR)/$(FULL_TARGET)
+endif
+ifdef CROSSCOMPILE
+UNITSDIR:=$(wildcard $(CROSSTARGETDIR)/units)
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+else
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+override TARGET_PROGRAMS+=glutdemo morph3d bounce radblur
+override INSTALL_FPCPACKAGE=y
+override COMPILER_OPTIONS+=-S2h
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifeq ($(OS_TARGET),linux)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),freebsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),netbsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),openbsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),sunos)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),qnx)
+UNIXINSTALLDIR=1
+endif
+else
+ifeq ($(OS_SOURCE),linux)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_SOURCE),freebsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_SOURCE),netbsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_SOURCE),openbsd)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),sunos)
+UNIXINSTALLDIR=1
+endif
+ifeq ($(OS_TARGET),qnx)
+UNIXINSTALLDIR=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXINSTALLDIR
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef INSTALL_BASEDIR
+ifdef UNIXINSTALLDIR
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXINSTALLDIR
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(OS_TARGET)
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+ifdef CROSSCOMPILE
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/cross/$(FULL_TARGET)/units
+else
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(OS_TARGET)
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXINSTALLDIR
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXINSTALLDIR
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXINSTALLDIR
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXINSTALLDIR
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(FULL_SOURCE))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(FULL_TARGET)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+ifdef inUnix
+ifndef GCCLIBDIR
+GCCLIBDIR:=$(shell dirname `(gcc -v 2>&1)| head -n 1| awk '{ print $$4 } '`)
+endif
+ifeq ($(OS_TARGET),linux)
+ifndef OTHERLIBDIR
+OTHERLIBDIR:=$(shell grep -v "^\#" /etc/ld.so.conf | awk '{ ORS=" "; print $1 }')
+endif
+endif
+ifeq ($(OS_TARGET),netbsd)
+OTHERLIBDIR+=/usr/pkg/lib
+endif
+export GCCLIBDIR OTHERLIB
+endif
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+STATICLIBPREFIX=libp
+RSTEXT=.rst
+FPCMADE=fpcmade
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+FPCMADE=fpcmade.v1
+PACKAGESUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+FPCMADE=fpcmade.dos
+ZIPSUFFIX=go32
+endif
+ifeq ($(OS_TARGET),linux)
+EXEEXT=
+HASSHAREDLIB=1
+FPCMADE=fpcmade.lnx
+ZIPSUFFIX=linux
+endif
+ifeq ($(OS_TARGET),freebsd)
+EXEEXT=
+HASSHAREDLIB=1
+FPCMADE=fpcmade.freebsd
+ZIPSUFFIX=freebsd
+endif
+ifeq ($(OS_TARGET),netbsd)
+EXEEXT=
+HASSHAREDLIB=1
+FPCMADE=fpcmade.netbsd
+ZIPSUFFIX=netbsd
+endif
+ifeq ($(OS_TARGET),openbsd)
+EXEEXT=
+HASSHAREDLIB=1
+FPCMADE=fpcmade.openbsd
+ZIPSUFFIX=openbsd
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.w32
+ZIPSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+FPCMADE=fpcmade.os2
+ZIPSUFFIX=emx
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.asm
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+FPCMADE=fpcmade.amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+FPCMADE=fpcmade.ata
+endif
+ifeq ($(OS_TARGET),beos)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+FPCMADE=fpcmade.be
+ZIPSUFFIX=be
+endif
+ifeq ($(OS_TARGET),sunos)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+FPCMADE=fpcmade.sun
+ZIPSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+FPCMADE=fpcmade.qnx
+ZIPSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppn
+OEXT=.on
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+FPCMADE=fpcmade.nw
+ZIPSUFFIX=nw
+EXEEXT=.nlm
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE=
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL=
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG=
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG=
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG=
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef ECHOREDIR
+ECHOREDIR:=$(subst /,$(PATHSEP),$(ECHO))
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -rfp
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE=
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE=
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG=
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG=
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=as
+LDNAME=ld
+ARNAME=ar
+RCNAME=rc
+ifeq ($(OS_TARGET),win32)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+PPAS=ppas$(BATCHEXT)
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vI
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl opengl
+ifeq ($(OS_TARGET),linux)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(OS_TARGET),go32v2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(OS_TARGET),win32)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(OS_TARGET),os2)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(OS_TARGET),freebsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(OS_TARGET),beos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(OS_TARGET),netbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(OS_TARGET),amiga)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(OS_TARGET),atari)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(OS_TARGET),sunos)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(OS_TARGET),qnx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(OS_TARGET),netware)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(OS_TARGET),openbsd)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_X11=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifeq ($(OS_TARGET),wdosx)
+REQUIRE_PACKAGES_RTL=1
+REQUIRE_PACKAGES_OPENGL=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/$(OS_TARGET)/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/$(OS_TARGET)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/$(OS_TARGET)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifdef REQUIRE_PACKAGES_X11
+PACKAGEDIR_X11:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /x11/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_X11),)
+ifneq ($(wildcard $(PACKAGEDIR_X11)/$(OS_TARGET)),)
+UNITDIR_X11=$(PACKAGEDIR_X11)/$(OS_TARGET)
+else
+UNITDIR_X11=$(PACKAGEDIR_X11)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_X11)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_X11) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_X11)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_X11=
+UNITDIR_X11:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /x11/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_X11),)
+UNITDIR_X11:=$(firstword $(UNITDIR_X11))
+else
+UNITDIR_X11=
+endif
+endif
+ifdef UNITDIR_X11
+override COMPILER_UNITDIR+=$(UNITDIR_X11)
+endif
+endif
+ifdef REQUIRE_PACKAGES_OPENGL
+PACKAGEDIR_OPENGL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /opengl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_OPENGL),)
+ifneq ($(wildcard $(PACKAGEDIR_OPENGL)/$(OS_TARGET)),)
+UNITDIR_OPENGL=$(PACKAGEDIR_OPENGL)/$(OS_TARGET)
+else
+UNITDIR_OPENGL=$(PACKAGEDIR_OPENGL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_OPENGL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_OPENGL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_OPENGL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_OPENGL=
+UNITDIR_OPENGL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /opengl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_OPENGL),)
+UNITDIR_OPENGL:=$(firstword $(UNITDIR_OPENGL))
+else
+UNITDIR_OPENGL=
+endif
+endif
+ifdef UNITDIR_OPENGL
+override COMPILER_UNITDIR+=$(UNITDIR_OPENGL)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(CPU_TARGET)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+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
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+else
+FPCCPUOPT:=
+endif
+override FPCOPT+=-Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+ifeq ($(CPU_TARGET),i386)
+override FPCOPT+=-OG2p3
+endif
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef GCCLIBDIR
+override FPCOPT+=-Fl$(GCCLIBDIR)
+endif
+ifdef OTHERLIBDIR
+override FPCOPT+=$(addprefix -Fl,$(OTHERLIBDIR))
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(OS_SOURCE),$(OS_TARGET))
+EXECPPAS:=@$(PPAS)
+endif
+endif
+.PHONY: fpc_exes
+ifdef TARGET_PROGRAMS
+override EXEFILES=$(addsuffix $(EXEEXT),$(TARGET_PROGRAMS))
+override EXEOFILES:=$(addsuffix $(OEXT),$(TARGET_PROGRAMS)) $(addprefix $(STATICLIBPREFIX),$(addsuffix $(STATICLIBEXT),$(TARGET_PROGRAMS)))
+override ALLTARGET+=fpc_exes
+override INSTALLEXEFILES+=$(EXEFILES)
+override CLEANEXEFILES+=$(EXEFILES) $(EXEOFILES)
+ifeq ($(OS_TARGET),os2)
+override CLEANEXEFILES+=$(addsuffix $(AOUTEXT),$(TARGET_PROGRAMS))
+endif
+endif
+fpc_exes: $(EXEFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+	@$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+	$(MAKE) all DEBUG=1
+fpc_release:
+	$(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .pp .rc .res
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(INSTALLPPUFILES))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(INSTALLPPULINKFILES)))
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(INSTALLEXEFILES))
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+fpc_distclean: clean
+ifdef COMPILER_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) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Upx....... $(UPXPROG)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+examples:
+shared:
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall:
+zipinstall:
+zipsourceinstall:
+zipexampleinstall:
+zipdistinstall:
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif

+ 20 - 0
packages/extra/opengl/examples/Makefile.fpc

@@ -0,0 +1,20 @@
+#
+#   Makefile.fpc for GL demos
+#
+
+[target]
+programs=glutdemo morph3d bounce radblur
+
+[require]
+packages=opengl
+
+[install]
+fpcpackage=y
+
+[compiler]
+options=-S2h
+
+[default]
+fpcdir=../../../..
+
+

+ 244 - 0
packages/extra/opengl/examples/bounce.pp

@@ -0,0 +1,244 @@
+{
+  $Id$
+  Bouncing ball demo.  Color index mode only!
+
+  This program is in the public domain
+  Brian Paul
+
+  Converted to Pascal by Peter Vreman
+}
+program bounce;
+uses
+  gl,glut;
+
+const
+  RED=1;
+  WHITE=2;
+  CYAN=3;
+
+var
+  IndexMode : Boolean;
+  Ball : GLuint;
+
+const
+  Zrot  : GLfloat = 0.0;
+  Zstep : GLfloat = 6.0;
+  Xpos  : GLfloat = 0.0;
+  Ypos  : GLfloat = 1.0;
+  Xvel  : GLfloat = 0.2;
+  Yvel  : GLfloat = 0.0;
+  Xmin  : GLfloat = -4.0;
+  Xmax  : GLfloat = 4.0;
+  Ymin  : GLfloat = -3.8;
+  Ymax  : GLfloat = 4.0;
+  G     : GLfloat = -0.1;
+
+
+function make_ball:GLuint;
+var
+  list   : GLuint;
+  a,b,
+  ar,br  : GLFloat;
+  da,db,
+  dar    : GLFloat;
+  radius : GLFloat;
+  color  : boolean;
+  x,y,z  : GLFloat;
+begin
+  da:=18.0;
+  db:=18.0;
+  radius:=1.0;
+
+  list := glGenLists(1);
+
+  glNewList(list, GL_COMPILE);
+
+  color := false;
+  a:=-90.0;
+  while (a+da<=90.0) do
+   begin
+     glBegin(GL_QUAD_STRIP);
+
+     b:=0.0;
+     while (b<=360.0) do
+      begin
+        if (color) then
+         begin
+           glIndexi(RED);
+           glColor3f(1, 0, 0);
+         end
+        else
+         begin
+           glIndexi(WHITE);
+           glColor3f(1, 1, 1);
+         end;
+
+        ar:=a * 3.14159/180.0;
+        br:=b * 3.14159/180.0;
+        x := COS(br) * COS(ar);
+        y := SIN(br) * COS(ar);
+        z := SIN(ar);
+        glVertex3f(x, y, z);
+
+        dar:=da * 3.14159/180.0;
+        x := radius * COS(br) * COS(ar + dar);
+        y := radius * SIN(br) * COS(ar + dar);
+        z := radius * SIN(ar + dar);
+        glVertex3f(x, y, z);
+
+        color := not color;
+        b:=b+db;
+      end;
+
+     glEnd();
+     a:=a+da;
+   end;
+
+  glEndList();
+
+  make_ball:=list;
+end;
+
+
+procedure reshape(width,height:longint); cdecl;
+var
+  aspect : glFloat;
+begin
+  aspect := glfloat(width) / glfloat(height);
+  glViewport(0, 0, width, height);
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  glOrtho(-6.0 * aspect, 6.0 * aspect, -6.0, 6.0, -6.0, 6.0);
+  glMatrixMode(GL_MODELVIEW);
+end;
+
+
+procedure key(k:byte;x,y:longint); cdecl;
+begin
+  case k of
+    27 :
+      halt(0);
+  end;
+end;
+
+
+procedure draw; cdecl;
+var
+  i : GLint;
+begin
+  glClear(GL_COLOR_BUFFER_BIT);
+
+  glIndexi(CYAN);
+  glColor3f(0, 1, 1);
+  glBegin(GL_LINES);
+  for i:=-5 to 5 do
+   begin
+     glVertex2i(i, -5);
+     glVertex2i(i, 5);
+   end;
+  for i:=-5 to 5 do
+   begin
+     glVertex2i(-5, i);
+     glVertex2i(5, i);
+   end;
+  for i:=-5 to 5 do
+   begin
+     glVertex2i(i, -5);
+     glVertex2f(i * 1.15, -5.9);
+   end;
+  glVertex2f(-5.3, -5.35);
+  glVertex2f(5.3, -5.35);
+  glVertex2f(-5.75, -5.9);
+  glVertex2f(5.75, -5.9);
+  glEnd();
+
+  glPushMatrix();
+  glTranslatef(Xpos, Ypos, 0.0);
+  glScalef(2.0, 2.0, 2.0);
+  glRotatef(8.0, 0.0, 0.0, 1.0);
+  glRotatef(90.0, 1.0, 0.0, 0.0);
+  glRotatef(Zrot, 0.0, 0.0, 1.0);
+
+  glCallList(Ball);
+
+  glPopMatrix();
+
+  glFlush();
+  glutSwapBuffers();
+end;
+
+
+const
+  vel0 : glfloat = -100.0;
+procedure idle; cdecl;
+begin
+  Zrot:=Zrot+Zstep;
+  Xpos:=Xpos+Xvel;
+  if (Xpos >= Xmax) then
+   begin
+     Xpos := Xmax;
+     Xvel := -Xvel;
+     Zstep := -Zstep;
+   end;
+  if (Xpos <= Xmin) then
+   begin
+     Xpos := Xmin;
+     Xvel := -Xvel;
+     Zstep := -Zstep;
+   end;
+  Ypos:=Ypos+Yvel;
+  Yvel:=Yvel+G;
+  if (Ypos < Ymin) then
+   begin
+     Ypos := Ymin;
+     if (vel0 = -100.0) then
+       vel0 := abs(Yvel);
+     Yvel := vel0;
+   end;
+  glutPostRedisplay();
+end;
+
+
+procedure visible(vis:longint); cdecl;
+begin
+  if (vis=GLUT_VISIBLE) then
+    glutIdleFunc(@idle)
+  else
+    glutIdleFunc(nil);
+end;
+
+
+begin
+  glutInit(@argc, argv);
+  glutInitWindowPosition(0, 0);
+  glutInitWindowSize(600, 450);
+
+  if paramcount>1 then
+   IndexMode:=(paramstr(1)='-ci');
+
+  if (IndexMode) then
+     glutInitDisplayMode(GLUT_INDEX or GLUT_DOUBLE)
+  else
+     glutInitDisplayMode(GLUT_RGB or GLUT_DOUBLE);
+
+  glutCreateWindow('Bounce');
+  Ball := make_ball();
+  glCullFace(GL_BACK);
+  glEnable(GL_CULL_FACE);
+  glDisable(GL_DITHER);
+  glShadeModel(GL_FLAT);
+
+  glutDisplayFunc(@draw);
+  glutReshapeFunc(@reshape);
+  glutVisibilityFunc(@visible);
+  glutKeyboardFunc(@key);
+
+  if (IndexMode) then
+   begin
+     glutSetColor(RED, 1.0, 0.0, 0.0);
+     glutSetColor(WHITE, 1.0, 1.0, 1.0);
+     glutSetColor(CYAN, 0.0, 1.0, 1.0);
+   end;
+
+  glutMainLoop();
+end.

+ 130 - 0
packages/extra/opengl/examples/glutdemo.pp

@@ -0,0 +1,130 @@
+{
+  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.
+}
+
+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
+  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: ', PChar(glGetString(GL_VENDOR)));
+  WriteLn('  Renderer: ', PChar(glGetString(GL_RENDERER)));
+  WriteLn('  Version: ', PChar(glGetString(GL_VERSION)));
+  WriteLn('  Extensions: ', PChar(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);
+
+  WriteLn('Starte...');
+  glutMainLoop;
+
+end.

+ 931 - 0
packages/extra/opengl/examples/morph3d.pp

@@ -0,0 +1,931 @@
+{
+ $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;
+
+{
+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,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 TRIANGLE(Edge,Amp:GLFloat; Divisions: longint; Z:GLFloat);
+var
+  Xf,Yf,Xa,Yb,Xf2,Yf2 : Extended;
+  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;
+      glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+      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;
+      glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+      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;
+    glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+    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;
+      glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+      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;
+      glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+      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;
+        glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+        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;
+        glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+        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;
+      glNormal3f(NeiAY*NeiBZ-NeiAZ*NeiBY,NeiAZ*NeiBX-NeiAX*NeiBZ,NeiAX*NeiBY-NeiAY*NeiBX);
+      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:byte;x,y:integer); cdecl;
+begin
+  case Char(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  2002-10-13 14:01:45  sg
+  * added the new, adapted OpenGL examples...
+
+  Revision 1.4  2002/09/07 15:43:05  peter
+    * old logs removed and tabs fixed
+
+  Revision 1.3  2002/08/06 09:09:17  michael
+  + Fixed missing @
+
+  Revision 1.2  2002/05/31 11:54:33  marco
+  * Renamefest for 1.0, many 1.1.x spots patched also.
+
+  Revision 1.1  2002/01/29 17:55:19  peter
+    * splitted to base and extra
+
+}

+ 372 - 0
packages/extra/opengl/examples/radblur.pp

@@ -0,0 +1,372 @@
+//------------------------------------------------------------------------
+//
+// Author              : Dario Corno (rIo) / Jeff Molofee (NeHe)
+// Converted to Delphi : Jan Horn
+// Email               : [email protected]
+// Website             : http://www.sulaco.co.za
+// Authors Web Site    : http://www.spinningkids.org/rio
+// Date                : 14 October 2001
+// Version             : 1.0
+// Description         : Radial Blur
+//
+// Adapted to FPC      : Sebastian Guenther ([email protected]) 2001-11-21
+//
+//------------------------------------------------------------------------
+program RadialBlur;
+
+uses GL, GLU, GLUT;
+
+const
+  WND_TITLE = 'Radial Blur';
+
+type TVector = Array[0..2] of glFloat;
+var
+  ElapsedTime : Integer;             // Elapsed time between frames
+
+  // Textures
+  BlurTexture : glUint;              // An Unsigned Int To Store The Texture Number
+
+  // User vaiables
+  Angle : glFloat;
+  Vertexes : Array[0..3] of TVector;
+  normal : TVector;
+
+const
+  FPSCount : Integer = 0;            // Counter for FPS
+  // Lights and Materials
+  globalAmbient  : Array[0..3] of glFloat = (0.2, 0.2,  0.2, 1.0);	// Set Ambient Lighting To Fairly Dark Light (No Color)
+  Light0Pos      : Array[0..3] of glFloat = (0.0, 5.0, 10.0, 1.0); 	// Set The Light Position
+  Light0Ambient  : Array[0..3] of glFloat = (0.2, 0.2,  0.2, 1.0);	// More Ambient Light
+  Light0Diffuse  : Array[0..3] of glFloat = (0.3, 0.3,  0.3, 1.0); 	// Set The Diffuse Light A Bit Brighter
+  Light0Specular : Array[0..3] of glFloat = (0.8, 0.8,  0.8, 1.0);      // Fairly Bright Specular Lighting
+
+  LmodelAmbient  : Array[0..3] of glFloat = (0.2, 0.2,  0.2, 1.0); 	// And More Ambient Light
+
+
+function EmptyTexture : glUint;
+var txtnumber : glUint;
+    pData : Pointer;
+begin
+  // Create Storage Space For Texture Data (128x128x4)
+  GetMem(pData, 128*128*4);
+
+  glGenTextures(1, @txtnumber);		      		// Create 1 Texture
+  glBindTexture(GL_TEXTURE_2D, txtnumber);    		// Bind The Texture
+  glTexImage2D(GL_TEXTURE_2D, 0, 4, 128, 128, 0, GL_RGBA, GL_UNSIGNED_BYTE, pData);
+  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+
+  result :=txtNumber;
+end;
+
+
+procedure ReduceToUnit(var vector : Array of glFloat);
+var length : glFLoat;
+begin
+  // Calculates The Length Of The Vector
+  length := sqrt((vector[0]*vector[0]) + (vector[1]*vector[1]) + (vector[2]*vector[2]));
+  if Length = 0 then
+    Length :=1;
+
+  vector[0] :=vector[0] / length;
+  vector[1] :=vector[1] / length;
+  vector[2] :=vector[2] / length;
+end;
+
+
+procedure calcNormal(const v : Array of TVector; var cross : Array of glFloat);
+var v1, v2 : Array[0..2] of glFloat;
+begin
+  // Finds The Vector Between 2 Points By Subtracting
+  // The x,y,z Coordinates From One Point To Another.
+
+  // Calculate The Vector From Point 1 To Point 0
+  v1[0] := v[0][0] - v[1][0];	      		// Vector 1.x=Vertex[0].x-Vertex[1].x
+  v1[1] := v[0][1] - v[1][1];	      		// Vector 1.y=Vertex[0].y-Vertex[1].y
+  v1[2] := v[0][2] - v[1][2];	      		// Vector 1.z=Vertex[0].y-Vertex[1].z
+  // Calculate The Vector From Point 2 To Point 1
+  v2[0] := v[1][0] - v[2][0];	      		// Vector 2.x=Vertex[0].x-Vertex[1].x
+  v2[1] := v[1][1] - v[2][1];	      		// Vector 2.y=Vertex[0].y-Vertex[1].y
+  v2[2] := v[1][2] - v[2][2];	      		// Vector 2.z=Vertex[0].z-Vertex[1].z
+  // Compute The Cross Product To Give Us A Surface Normal
+  cross[0] := v1[1]*v2[2] - v1[2]*v2[1];      	// Cross Product For Y - Z
+  cross[1] := v1[2]*v2[0] - v1[0]*v2[2];      	// Cross Product For X - Z
+  cross[2] := v1[0]*v2[1] - v1[1]*v2[0];      	// Cross Product For X - Y
+
+  ReduceToUnit(cross);	 			// Normalize The Vectors
+end;
+
+
+// Draws A Helix
+procedure ProcessHelix;
+const Twists = 5;
+      MaterialColor : Array[1..4] of glFloat = (0.4, 0.2, 0.8, 1.0);
+      Specular      : Array[1..4] of glFloat = (1, 1, 1, 1);
+var x, y, z : glFLoat;
+    phi, theta : Integer;
+    r, u, v : glFLoat;
+begin
+  glLoadIdentity();				// Reset The Modelview Matrix
+  gluLookAt(0, 5, 50, 0, 0, 0, 0, 1, 0);	// Eye Position (0,5,50) Center Of Scene (0,0,0), Up On Y Axis
+
+  glPushMatrix();				// Push The Modelview Matrix
+    glTranslatef(0,0,-50);		        // Translate 50 Units Into The Screen
+    glRotatef(angle/2.0, 1, 0, 0);		// Rotate By angle/2 On The X-Axis
+    glRotatef(angle/3.0, 0, 1, 0);		// Rotate By angle/3 On The Y-Axis
+
+    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, @MaterialColor);
+    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, @specular);
+
+    r :=1.5;					// Radius
+
+    glBegin(GL_QUADS);				// Begin Drawing Quads
+      phi :=0;
+      while phi < 360 do
+      begin
+        theta :=0;
+        while theta < 360*twists do
+        begin
+          v := phi / 180.0 * pi;  		// Calculate Angle Of First Point	(  0 )
+          u := theta / 180.0 * pi; 		// Calculate Angle Of First Point	(  0 )
+
+          x :=cos(u)*(2 + cos(v))*r;		// Calculate x Position (1st Point)
+          y :=sin(u)*(2 + cos(v))*r;		// Calculate y Position (1st Point)
+          z :=(u-(2*pi) + sin(v))*r;		// Calculate z Position (1st Point)
+
+          vertexes[0][0] :=x;			// Set x Value Of First Vertex
+          vertexes[0][1] :=y;			// Set y Value Of First Vertex
+          vertexes[0][2] :=z;			// Set z Value Of First Vertex
+
+          v :=(phi/180.0 * pi);	  		// Calculate Angle Of Second Point	(  0 )
+          u :=((theta+20)/180.0 * pi);		// Calculate Angle Of Second Point	( 20 )
+
+          x :=cos(u)*(2 + cos(v))*r;		// Calculate x Position (2nd Point)
+          y :=sin(u)*(2 + cos(v))*r;		// Calculate y Position (2nd Point)
+          z :=(u-(2*pi) + sin(v))*r;		// Calculate z Position (2nd Point)
+
+          vertexes[1][0] :=x;	      		// Set x Value Of Second Vertex
+          vertexes[1][1] :=y;	                // Set y Value Of Second Vertex
+          vertexes[1][2] :=z;			// Set z Value Of Second Vertex
+
+          v :=(phi+20)/180.0*pi;		// Calculate Angle Of Third Point	( 20 )
+          u :=(theta+20)/180.0*pi;		// Calculate Angle Of Third Point	( 20 )
+
+          x :=cos(u)*(2 + cos(v))*r;		// Calculate x Position (3rd Point)
+          y :=sin(u)*(2 + cos(v))*r;		// Calculate y Position (3rd Point)
+          z :=(u-(2*pi) + sin(v))*r;		// Calculate z Position (3rd Point)
+
+          vertexes[2][0] :=x;			// Set x Value Of Third Vertex
+          vertexes[2][1] :=y;			// Set y Value Of Third Vertex
+          vertexes[2][2] :=z;			// Set z Value Of Third Vertex
+
+          v :=(phi+20)/180.0*pi;     		// Calculate Angle Of Fourth Point	( 20 )
+          u :=theta / 180.0*pi;	     		// Calculate Angle Of Fourth Point	(  0 )
+
+          x :=cos(u)*(2 + cos(v))*r;   		// Calculate x Position (4th Point)
+          y :=sin(u)*(2 + cos(v))*r;   		// Calculate y Position (4th Point)
+          z :=(u-(2*pi) + sin(v))*r;		// Calculate z Position (4th Point)
+
+          vertexes[3][0] :=x;	    		// Set x Value Of Fourth Vertex
+          vertexes[3][1] :=y;	    		// Set y Value Of Fourth Vertex
+          vertexes[3][2] :=z;	    		// Set z Value Of Fourth Vertex
+
+          calcNormal(vertexes, normal);	  	// Calculate The Quad Normal
+
+          glNormal3f(normal[0],normal[1],normal[2]);	// Set The Normal
+
+          // Render The Quad
+          glVertex3f(vertexes[0][0],vertexes[0][1],vertexes[0][2]);
+          glVertex3f(vertexes[1][0],vertexes[1][1],vertexes[1][2]);
+          glVertex3f(vertexes[2][0],vertexes[2][1],vertexes[2][2]);
+          glVertex3f(vertexes[3][0],vertexes[3][1],vertexes[3][2]);
+          theta := theta + 20;
+        end;
+        phi :=phi + 20;
+      end;
+    glEnd();				       // Done Rendering Quads
+  glPopMatrix();			       // Pop The Matrix
+end;
+
+
+// Set Up An Ortho View
+procedure ViewOrtho;
+begin
+  glMatrixMode(GL_PROJECTION);		   	// Select Projection
+  glPushMatrix();			   	// Push The Matrix
+  glLoadIdentity();			   	// Reset The Matrix
+  glOrtho( 0, 640 , 480 , 0, -1, 1 );	   	// Select Ortho Mode (640x480)
+  glMatrixMode(GL_MODELVIEW);		   	// Select Modelview Matrix
+  glPushMatrix();			   	// Push The Matrix
+  glLoadIdentity();			   	// Reset The Matrix
+end;
+
+
+// Set Up A Perspective View
+procedure ViewPerspective;
+begin
+  glMatrixMode( GL_PROJECTION );	   	// Select Projection
+  glPopMatrix();			   	// Pop The Matrix
+  glMatrixMode( GL_MODELVIEW );		   	// Select Modelview
+  glPopMatrix();    			        // Pop The Matrix
+end;
+
+
+// Renders To A Texture
+procedure RenderToTexture;
+begin
+  glViewport(0, 0, 128, 128);                      	// Set Our Viewport (Match Texture Size)
+  ProcessHelix();   					// Render The Helix
+  glBindTexture(GL_TEXTURE_2D,BlurTexture);		// Bind To The Blur Texture
+
+  // Copy Our ViewPort To The Blur Texture (From 0,0 To 128,128... No Border)
+  glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 0, 0, 128, 128, 0);
+  glClearColor(0.0, 0.0, 0.5, 0.5);			// Set The Clear Color To Medium Blue
+  glClear(GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT);	// Clear The Screen And Depth Buffer
+  glViewport(0, 0, 640 ,480);				// Set Viewport (0,0 to 640x480)
+end;
+
+
+// Draw The Blurred Image
+procedure DrawBlur(const times : Integer; const inc : glFloat);
+var spost, alpha, alphainc : glFloat;
+    I : Integer;
+begin
+  alpha := 0.2;
+
+  glEnable(GL_TEXTURE_2D);		   	// Enable 2D Texture Mapping
+  glDisable(GL_DEPTH_TEST);		   	// Disable Depth Testing
+  glBlendFunc(GL_SRC_ALPHA,GL_ONE);	   	// Set Blending Mode
+  glEnable(GL_BLEND);			   	// Enable Blending
+  glBindTexture(GL_TEXTURE_2D,BlurTexture);	// Bind To The Blur Texture
+  ViewOrtho();				   	// Switch To An Ortho View
+
+  alphainc := alpha / times;		   	// alphainc=0.2f / Times To Render Blur
+
+  glBegin(GL_QUADS);			   	// Begin Drawing Quads
+    // Number Of Times To Render Blur
+    For I :=0 to times-1 do
+    begin
+      glColor4f(1.0, 1.0, 1.0, alpha);	        // Set The Alpha Value (Starts At 0.2)
+      glTexCoord2f(0+spost,1-spost);		// Texture Coordinate	( 0, 1 )
+      glVertex2f(0,0);		              	// First Vertex		(   0,   0 )
+
+      glTexCoord2f(0+spost,0+spost);		// Texture Coordinate	( 0, 0 )
+      glVertex2f(0,480);			// Second Vertex	(   0, 480 )
+
+      glTexCoord2f(1-spost,0+spost);		// Texture Coordinate	( 1, 0 )
+      glVertex2f(640,480);			// Third Vertex		( 640, 480 )
+
+      glTexCoord2f(1-spost,1-spost);		// Texture Coordinate	( 1, 1 )
+      glVertex2f(640,0);			// Fourth Vertex	( 640,   0 )
+
+      spost := spost + inc; 			// Gradually Increase spost (Zooming Closer To Texture Center)
+      alpha := alpha - alphainc;		// Gradually Decrease alpha (Gradually Fading Image Out)
+    end;
+  glEnd();					// Done Drawing Quads
+
+  ViewPerspective();				// Switch To A Perspective View
+
+  glEnable(GL_DEPTH_TEST);			// Enable Depth Testing
+  glDisable(GL_TEXTURE_2D);			// Disable 2D Texture Mapping
+  glDisable(GL_BLEND);				// Disable Blending
+  glBindTexture(GL_TEXTURE_2D,0);		// Unbind The Blur Texture
+end;
+
+{------------------------------------------------------------------}
+{  Function to draw the actual scene                               }
+{------------------------------------------------------------------}
+procedure glDraw;
+begin
+  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);    // Clear The Screen And The Depth Buffer
+  glLoadIdentity();                     // Reset The View
+  RenderToTexture; 			// Render To A Texture
+  ProcessHelix;    			// Draw Our Helix
+  DrawBlur(25, 0.02);			// Draw The Blur Effect
+
+  angle :=ElapsedTime / 5.0;   		// Update angle Based On The Clock
+end;
+
+
+{------------------------------------------------------------------}
+{  Initialise OpenGL                                               }
+{------------------------------------------------------------------}
+procedure glInit;
+begin
+  glClearColor(0.0, 0.0, 0.0, 0.5); 	   // Black Background
+  glShadeModel(GL_SMOOTH);                 // Enables Smooth Color Shading
+  glClearDepth(1.0);                       // Depth Buffer Setup
+  glDepthFunc(GL_LESS);		           // The Type Of Depth Test To Do
+
+  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);   //Realy Nice perspective calculations
+
+  glEnable(GL_DEPTH_TEST);                 // Enable Depth Buffer
+  glEnable(GL_TEXTURE_2D);                 // Enable Texture Mapping
+
+  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, @LmodelAmbient);       // Set The Ambient Light Model
+
+  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, @GlobalAmbient);     	// Set The Global Ambient Light Model
+  glLightfv(GL_LIGHT0, GL_POSITION, @light0Pos);	      	// Set The Lights Position
+  glLightfv(GL_LIGHT0, GL_AMBIENT, @light0Ambient);	      	// Set The Ambient Light
+  glLightfv(GL_LIGHT0, GL_DIFFUSE, @light0Diffuse);	      	// Set The Diffuse Light
+  glLightfv(GL_LIGHT0, GL_SPECULAR, @light0Specular);	      	// Set Up Specular Lighting
+  glEnable(GL_LIGHTING);										// Enable Lighting
+  glEnable(GL_LIGHT0);										// Enable Light0
+
+  BlurTexture := EmptyTexture();								// Create Our Empty Texture
+  glShadeModel(GL_SMOOTH);									// Select Smooth Shading
+  glMateriali(GL_FRONT, GL_SHININESS, 128);
+end;
+
+
+{------------------------------------------------------------------}
+{  Handle window resize                                            }
+{------------------------------------------------------------------}
+procedure glResizeWnd(Width, Height : Integer);
+begin
+  if (Height = 0) then                // prevent divide by zero exception
+    Height := 1;
+  glViewport(0, 0, Width, Height);    // Set the viewport for the OpenGL window
+  glMatrixMode(GL_PROJECTION);        // Change Matrix Mode to Projection
+  glLoadIdentity();                   // Reset View
+  gluPerspective(45.0, Width/glFloat(Height), 2.0, 200.0);  // Do the perspective calculations. Last value = max clipping depth
+
+  glMatrixMode(GL_MODELVIEW);         // Return to the modelview matrix
+  glLoadIdentity();                   // Reset View
+end;
+
+
+var
+  DemoStart, LastTime : LongWord;
+
+
+procedure DisplayWindow; cdecl;
+begin
+  Inc(FPSCount);                      // Increment FPS Counter
+
+  LastTime :=ElapsedTime;
+  ElapsedTime := glutGet(GLUT_ELAPSED_TIME) - DemoStart;     // Calculate Elapsed Time
+  ElapsedTime :=(LastTime + ElapsedTime) DIV 2; // Average it out for smoother movement
+  glDraw;
+  glutSwapBuffers;
+  Inc(ElapsedTime, 10);
+  glutPostRedisplay;
+end;
+
+procedure OnReshape(width, height: Integer); cdecl;
+begin
+  glResizeWnd(width, height);
+end;
+
+
+begin
+  glutInitDisplayMode(GLUT_RGB or GLUT_DOUBLE or GLUT_DEPTH);
+  glutCreateWindow(WND_TITLE);
+  glutDisplayFunc(@DisplayWindow);
+  glutReshapeFunc(@OnReshape);
+  glutInitWindowSize(640, 480);
+
+  glInit;
+
+  DemoStart := glutGet(GLUT_ELAPSED_TIME);
+  glutMainLoop;
+end.