aboutsummaryrefslogtreecommitdiffstats
path: root/demos
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2000-11-18 06:43:49 +0000
committerSven Gothel <[email protected]>2000-11-18 06:43:49 +0000
commit880653d31a8f1ff8384fdbc75b84934bceecfdb8 (patch)
treebdafb71416f176d2a4b73bf716c9dc3f13685a8b /demos
Initial revision
Diffstat (limited to 'demos')
-rw-r--r--demos/GLLandScape/GLLandScape-readme.txt58
-rw-r--r--demos/GLLandScape/GLLandScape1-big.html14
-rw-r--r--demos/GLLandScape/GLLandScape1-big_plugin13.html46
-rw-r--r--demos/GLLandScape/GLLandScape1.html14
-rw-r--r--demos/GLLandScape/GLLandScape1.java714
-rw-r--r--demos/GLLandScape/GLLandScape1Applet.java399
-rw-r--r--demos/GLLandScape/GLLandScape1_plugin13.html46
-rw-r--r--demos/GLLandScape/GLLandScape1w1-big.html14
-rw-r--r--demos/GLLandScape/GLLandScape1w1-big_plugin13.html46
-rw-r--r--demos/GLLandScape/GLLandScape1w1.html14
-rw-r--r--demos/GLLandScape/GLLandScape1w1.java781
-rw-r--r--demos/GLLandScape/GLLandScape1w1Applet$SpeedTimerbin0 -> 1521 bytes
-rwxr-xr-xdemos/GLLandScape/GLLandScape1w1Applet.java416
-rw-r--r--demos/GLLandScape/GLLandScape1w1_plugin13.html46
-rw-r--r--demos/GLLandScape/GlutPlaneObj.java112
-rw-r--r--demos/GLLandScape/LICENSE.txt36
-rw-r--r--demos/GLLandScape/index.html52
-rw-r--r--demos/HodglimsNeHe/Lesson1.html35
-rw-r--r--demos/HodglimsNeHe/Lesson1.java261
-rw-r--r--demos/HodglimsNeHe/Lesson11.html35
-rw-r--r--demos/HodglimsNeHe/Lesson11.java382
-rw-r--r--demos/HodglimsNeHe/Lesson11_plugin13.html66
-rw-r--r--demos/HodglimsNeHe/Lesson12.html46
-rw-r--r--demos/HodglimsNeHe/Lesson12.java437
-rw-r--r--demos/HodglimsNeHe/Lesson12_plugin13.html77
-rw-r--r--demos/HodglimsNeHe/Lesson16.html51
-rw-r--r--demos/HodglimsNeHe/Lesson16.java551
-rw-r--r--demos/HodglimsNeHe/Lesson16_plugin13.html82
-rw-r--r--demos/HodglimsNeHe/Lesson18.html50
-rw-r--r--demos/HodglimsNeHe/Lesson18.java459
-rw-r--r--demos/HodglimsNeHe/Lesson18_plugin13.html81
-rw-r--r--demos/HodglimsNeHe/Lesson1_plugin13.html66
-rw-r--r--demos/HodglimsNeHe/Lesson2.html35
-rw-r--r--demos/HodglimsNeHe/Lesson2.java280
-rw-r--r--demos/HodglimsNeHe/Lesson2_plugin13.html66
-rw-r--r--demos/HodglimsNeHe/Lesson3.html35
-rw-r--r--demos/HodglimsNeHe/Lesson3.java284
-rw-r--r--demos/HodglimsNeHe/Lesson3_plugin13.html66
-rw-r--r--demos/HodglimsNeHe/Lesson4.html35
-rw-r--r--demos/HodglimsNeHe/Lesson4.java304
-rw-r--r--demos/HodglimsNeHe/Lesson4_plugin13.html66
-rw-r--r--demos/HodglimsNeHe/Lesson5.html35
-rw-r--r--demos/HodglimsNeHe/Lesson5.java355
-rw-r--r--demos/HodglimsNeHe/Lesson5_plugin13.html66
-rw-r--r--demos/HodglimsNeHe/Lesson6.html35
-rw-r--r--demos/HodglimsNeHe/Lesson6.java357
-rw-r--r--demos/HodglimsNeHe/Lesson6_plugin13.html66
-rw-r--r--demos/HodglimsNeHe/Lesson7.html50
-rw-r--r--demos/HodglimsNeHe/Lesson7.java504
-rw-r--r--demos/HodglimsNeHe/Lesson7_plugin13.html81
-rw-r--r--demos/HodglimsNeHe/Lesson8.html51
-rw-r--r--demos/HodglimsNeHe/Lesson8.java545
-rw-r--r--demos/HodglimsNeHe/Lesson8_plugin13.html82
-rw-r--r--demos/HodglimsNeHe/Lesson9.html47
-rw-r--r--demos/HodglimsNeHe/Lesson9.java451
-rw-r--r--demos/HodglimsNeHe/Lesson9_plugin13.html78
-rw-r--r--demos/HodglimsNeHe/data/Star.pngbin0 -> 7183 bytes
-rw-r--r--demos/HodglimsNeHe/data/crate.pngbin0 -> 118727 bytes
-rw-r--r--demos/HodglimsNeHe/data/cube.pngbin0 -> 37079 bytes
-rw-r--r--demos/HodglimsNeHe/data/glass.pngbin0 -> 32955 bytes
-rw-r--r--demos/HodglimsNeHe/data/nehe.pngbin0 -> 34169 bytes
-rw-r--r--demos/HodglimsNeHe/data/tim.pngbin0 -> 95984 bytes
-rw-r--r--demos/HodglimsNeHe/index.html38
-rw-r--r--demos/HodglimsNeHe/index_plugin13.html41
-rwxr-xr-xdemos/Java2Applet.bat1
-rwxr-xr-xdemos/Java2AppletB.bat1
-rwxr-xr-xdemos/Java2AppletC.bat1
-rw-r--r--demos/MiscDemos/DrawColoredPrimitives.html14
-rwxr-xr-xdemos/MiscDemos/DrawColoredPrimitives.java142
-rw-r--r--demos/MiscDemos/DrawColoredPrimitives2.html16
-rw-r--r--demos/MiscDemos/DrawColoredPrimitives2.java302
-rw-r--r--demos/MiscDemos/DrawColoredPrimitives2_plugin13.html48
-rw-r--r--demos/MiscDemos/DrawColoredPrimitives_plugin13.html46
-rwxr-xr-xdemos/MiscDemos/GLImageViewerCanvas.java126
-rwxr-xr-xdemos/MiscDemos/GLImageViewerWorld.java112
-rwxr-xr-xdemos/MiscDemos/GLImageWorld1.java456
-rwxr-xr-xdemos/MiscDemos/PerformanceCheck.sh56
-rw-r--r--demos/MiscDemos/PerformanceEtc/profile.jdk1.2-sun48
-rw-r--r--demos/MiscDemos/PerformanceEtc/profile.jdk1.3-ibm52
-rw-r--r--demos/MiscDemos/PerformanceEtc/profile.jdk1.3-sun52
-rw-r--r--demos/MiscDemos/PerformanceEtc/profile.jdk118-ibm48
-rw-r--r--demos/MiscDemos/PerformanceEtc/profile.jdk118_v150
-rw-r--r--demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-ppc-500mhz-xf68-4.0.1-DRI-soft.log82
-rw-r--r--demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-x86-350mhz-Mesa321-soft-gears.log130
-rw-r--r--demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-x86-350mhz-xf68-4.0.1-DRI-soft-gears.log137
-rw-r--r--demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-x86-350mhz-xf68-4.0.1-NVidia-GForce256-gears.log131
-rw-r--r--demos/MiscDemos/PerformanceLogs/index.html15
-rw-r--r--demos/MiscDemos/SharedGLTest.java73
-rw-r--r--demos/MiscDemos/SharedGLTest2.html13
-rwxr-xr-xdemos/MiscDemos/SharedGLTest2.java144
-rw-r--r--demos/MiscDemos/SharedGLTest2_plugin13.html45
-rw-r--r--demos/MiscDemos/TriangleRotate.html14
-rwxr-xr-xdemos/MiscDemos/TriangleRotate.java139
-rw-r--r--demos/MiscDemos/TriangleRotate_plugin13.html46
-rw-r--r--demos/MiscDemos/accanti.html17
-rw-r--r--demos/MiscDemos/accanti.java258
-rw-r--r--demos/MiscDemos/accanti_plugin13.html48
-rw-r--r--demos/MiscDemos/alpha3D.html17
-rw-r--r--demos/MiscDemos/alpha3D.java287
-rw-r--r--demos/MiscDemos/alpha3D_plugin13.html48
-rw-r--r--demos/MiscDemos/anti.html17
-rw-r--r--demos/MiscDemos/anti.java162
-rw-r--r--demos/MiscDemos/anti_plugin13.html48
-rw-r--r--demos/MiscDemos/coloredCross.java111
-rw-r--r--demos/MiscDemos/depthcue.html17
-rw-r--r--demos/MiscDemos/depthcue.java140
-rw-r--r--demos/MiscDemos/depthcue_plugin13.html48
-rw-r--r--demos/MiscDemos/gears.html13
-rw-r--r--demos/MiscDemos/gears.java437
-rw-r--r--demos/MiscDemos/gears_plugin13.html45
-rw-r--r--demos/MiscDemos/glJavaFontTest1.java120
-rw-r--r--demos/MiscDemos/glutFontBitmapTest.html15
-rw-r--r--demos/MiscDemos/glutFontBitmapTest.java137
-rw-r--r--demos/MiscDemos/glutFontBitmapTest2Applet$glutFbin0 -> 5910 bytes
-rw-r--r--demos/MiscDemos/glutFontBitmapTest2Applet.html16
-rw-r--r--demos/MiscDemos/glutFontBitmapTest2Applet.java319
-rw-r--r--demos/MiscDemos/glutFontBitmapTest2Applet_plugin13.html48
-rw-r--r--demos/MiscDemos/glutFontBitmapTest_plugin13.html47
-rw-r--r--demos/MiscDemos/glutFontStrokeTest.html15
-rw-r--r--demos/MiscDemos/glutFontStrokeTest.java128
-rw-r--r--demos/MiscDemos/glutFontStrokeTest_plugin13.html47
-rw-r--r--demos/MiscDemos/index.html78
-rw-r--r--demos/MiscDemos/index_plugin13.html80
-rw-r--r--demos/MiscDemos/morph3d.html17
-rwxr-xr-xdemos/MiscDemos/morph3d.java1060
-rw-r--r--demos/MiscDemos/morph3d_plugin13.html48
-rw-r--r--demos/MiscDemos/nurbs.html14
-rw-r--r--demos/MiscDemos/nurbs.java314
-rw-r--r--demos/MiscDemos/nurbs_plugin13.html46
-rw-r--r--demos/MiscDemos/pngTextureTestApplet.html16
-rwxr-xr-xdemos/MiscDemos/pngTextureTestApplet.java420
-rw-r--r--demos/MiscDemos/pngTextureTestApplet_plugin13.html48
-rw-r--r--demos/MiscDemos/select.html17
-rw-r--r--demos/MiscDemos/select.java596
-rw-r--r--demos/MiscDemos/select_plugin13.html49
-rw-r--r--demos/MiscDemos/spectex.html14
-rw-r--r--demos/MiscDemos/spectex.java336
-rw-r--r--demos/MiscDemos/spectex_plugin13.html46
-rw-r--r--demos/MiscDemos/stencil.html20
-rw-r--r--demos/MiscDemos/stencil.java342
-rw-r--r--demos/MiscDemos/stencil_plugin13.html51
-rw-r--r--demos/MiscDemos/teaambient.html17
-rwxr-xr-xdemos/MiscDemos/teaambient.java182
-rw-r--r--demos/MiscDemos/teaambient_plugin13.html48
-rw-r--r--demos/MiscDemos/teapots.html17
-rw-r--r--demos/MiscDemos/teapots.java279
-rw-r--r--demos/MiscDemos/teapots_plugin13.html48
-rw-r--r--demos/MiscDemos/tess.h40
-rw-r--r--demos/MiscDemos/tess.html15
-rw-r--r--demos/MiscDemos/tess.java298
-rw-r--r--demos/MiscDemos/tess_plugin13.html47
-rw-r--r--demos/MiscDemos/tessdemo.html15
-rwxr-xr-xdemos/MiscDemos/tessdemo.java667
-rw-r--r--demos/MiscDemos/tessdemo_plugin13.html47
-rw-r--r--demos/MiscDemos/tesswind.html15
-rwxr-xr-xdemos/MiscDemos/tesswind.java464
-rw-r--r--demos/MiscDemos/tesswind_plugin13.html47
-rw-r--r--demos/MiscDemos/tex/DAISYX.pngbin0 -> 17768 bytes
-rw-r--r--demos/MiscDemos/tex/a.tgabin0 -> 450018 bytes
-rw-r--r--demos/MiscDemos/tex/gleeson_head.jpgbin0 -> 6065 bytes
-rwxr-xr-xdemos/MiscDemos/tex/gnu-head-sm.pngbin0 -> 1915 bytes
-rwxr-xr-xdemos/MiscDemos/tex/jaulogo-300x80.pngbin0 -> 12576 bytes
-rw-r--r--demos/RectRenderSpeed/GL4JCanvas.java674
-rw-r--r--demos/RectRenderSpeed/GL4JTests2.java149
-rwxr-xr-xdemos/RectRenderSpeed/GL4JTests2.sh12
-rw-r--r--demos/RectRenderSpeed/perfomance-Linux-300MHzPII-Mesa1
-rw-r--r--demos/RectRenderSpeed/perfomance-Linux-300MHzPII-MesaRivaTNT2.txt167
-rw-r--r--demos/RectRenderSpeed/perfomance-Linux-350MHzPII-Mesa1
-rw-r--r--demos/RectRenderSpeed/perfomance-Linux-350MHzPII-MesaRivaTNT2.txt168
-rw-r--r--demos/RectRenderSpeed/perfomance-Win32-400MHzPII-Matr1
-rw-r--r--demos/RectRenderSpeed/perfomance-Win32-400MHzPII-MatroxG200.txt247
-rw-r--r--demos/RonsDemos/DemoTex1.java4158
-rw-r--r--demos/RonsDemos/FullScreenGears.java18
-rw-r--r--demos/RonsDemos/GL4JDemos.pvkbin0 -> 332 bytes
-rw-r--r--demos/RonsDemos/GL4JDemos.spcbin0 -> 452 bytes
-rw-r--r--demos/RonsDemos/HardCodedTexture.java31
-rw-r--r--demos/RonsDemos/MatrixFuncs.java200
-rw-r--r--demos/RonsDemos/animApplet.skel125
-rw-r--r--demos/RonsDemos/dinoshade.html21
-rwxr-xr-xdemos/RonsDemos/dinoshade.java1104
-rw-r--r--demos/RonsDemos/dinoshade_plugin13.html52
-rw-r--r--demos/RonsDemos/dof.html17
-rw-r--r--demos/RonsDemos/dof.java513
-rw-r--r--demos/RonsDemos/dof_plugin13.html48
-rw-r--r--demos/RonsDemos/fog.html18
-rw-r--r--demos/RonsDemos/fog.java266
-rw-r--r--demos/RonsDemos/fog_plugin13.html49
-rw-r--r--demos/RonsDemos/gears.html23
-rw-r--r--demos/RonsDemos/gears.java432
-rw-r--r--demos/RonsDemos/gears_plugin13.html54
-rw-r--r--demos/RonsDemos/gl4java.policy27
-rw-r--r--demos/RonsDemos/glutplane.html19
-rw-r--r--demos/RonsDemos/glutplane.java334
-rw-r--r--demos/RonsDemos/glutplane_plugin13.html50
-rw-r--r--demos/RonsDemos/index.html123
-rw-r--r--demos/RonsDemos/index_plugin13.html124
-rw-r--r--demos/RonsDemos/logo.html45
-rw-r--r--demos/RonsDemos/logo.java1091
-rw-r--r--demos/RonsDemos/logo_plugin13.html76
-rw-r--r--demos/RonsDemos/material.html17
-rw-r--r--demos/RonsDemos/material.java416
-rw-r--r--demos/RonsDemos/material_plugin13.html48
-rw-r--r--demos/RonsDemos/mipmap.html17
-rw-r--r--demos/RonsDemos/mipmap.java317
-rw-r--r--demos/RonsDemos/mipmap_plugin13.html48
-rw-r--r--demos/RonsDemos/molehill.html17
-rw-r--r--demos/RonsDemos/molehill.java286
-rw-r--r--demos/RonsDemos/molehill_plugin13.html48
-rw-r--r--demos/RonsDemos/moth.html19
-rw-r--r--demos/RonsDemos/moth.java1149
-rw-r--r--demos/RonsDemos/moth_plugin13.html50
-rw-r--r--demos/RonsDemos/movelight.html20
-rw-r--r--demos/RonsDemos/movelight.java322
-rw-r--r--demos/RonsDemos/movelight_plugin13.html51
-rw-r--r--demos/RonsDemos/nonAnimApplet.skel120
-rw-r--r--demos/RonsDemos/particle.html26
-rw-r--r--demos/RonsDemos/particle.java613
-rw-r--r--demos/RonsDemos/particle_plugin13.html57
-rw-r--r--demos/RonsDemos/pointblast.html19
-rw-r--r--demos/RonsDemos/pointblast.java664
-rw-r--r--demos/RonsDemos/pointblast_plugin13.html50
-rw-r--r--demos/RonsDemos/polyoff.html23
-rw-r--r--demos/RonsDemos/polyoff.java332
-rw-r--r--demos/RonsDemos/polyoff_plugin13.html54
-rw-r--r--demos/RonsDemos/quadric.html17
-rw-r--r--demos/RonsDemos/quadric.java250
-rw-r--r--demos/RonsDemos/quadric_plugin13.html48
-rw-r--r--demos/RonsDemos/reflect.html22
-rw-r--r--demos/RonsDemos/reflect.java424
-rw-r--r--demos/RonsDemos/reflect_plugin13.html53
-rw-r--r--demos/RonsDemos/renormal.html18
-rw-r--r--demos/RonsDemos/renormal.java112
-rw-r--r--demos/RonsDemos/renormal_plugin13.html49
-rw-r--r--demos/RonsDemos/rings.html18
-rw-r--r--demos/RonsDemos/rings.java406
-rw-r--r--demos/RonsDemos/rings_plugin13.html49
-rwxr-xr-xdemos/RonsDemos/sappletviewer.bat1
-rwxr-xr-xdemos/RonsDemos/sappletviewer.sh3
-rw-r--r--demos/RonsDemos/scube.html27
-rw-r--r--demos/RonsDemos/scube.java590
-rw-r--r--demos/RonsDemos/scube_plugin13.html58
-rw-r--r--demos/RonsDemos/shadowvol.html18
-rw-r--r--demos/RonsDemos/shadowvol.java458
-rw-r--r--demos/RonsDemos/shadowvol_plugin13.html49
-rw-r--r--demos/RonsDemos/softshadow.html19
-rw-r--r--demos/RonsDemos/softshadow.java528
-rw-r--r--demos/RonsDemos/softshadow_plugin13.html50
-rw-r--r--demos/RonsDemos/spots.html17
-rw-r--r--demos/RonsDemos/spots.java384
-rw-r--r--demos/RonsDemos/spots_plugin13.html48
-rw-r--r--demos/RonsDemos/star.html22
-rw-r--r--demos/RonsDemos/star.java349
-rw-r--r--demos/RonsDemos/star_plugin13.html53
-rw-r--r--demos/RonsDemos/steam.html22
-rw-r--r--demos/RonsDemos/steam.java791
-rw-r--r--demos/RonsDemos/steam_plugin13.html53
-rw-r--r--demos/RonsDemos/surface.html18
-rw-r--r--demos/RonsDemos/surface.java263
-rw-r--r--demos/RonsDemos/surface_plugin13.html49
-rw-r--r--demos/RonsDemos/teapots.html17
-rw-r--r--demos/RonsDemos/teapots.java465
-rw-r--r--demos/RonsDemos/teapots_plugin13.html48
-rw-r--r--demos/RonsDemos/texgen.html22
-rw-r--r--demos/RonsDemos/texgen.java478
-rw-r--r--demos/RonsDemos/texgen_plugin13.html53
-rw-r--r--demos/RonsDemos/texobj.html18
-rw-r--r--demos/RonsDemos/texobj.java233
-rw-r--r--demos/RonsDemos/texobj_plugin13.html49
-rw-r--r--demos/RonsDemos/text3d.html17
-rw-r--r--demos/RonsDemos/text3d.java682
-rw-r--r--demos/RonsDemos/text3d_plugin13.html48
-rw-r--r--demos/SwingDemos/CrossColorJPanel.java55
-rw-r--r--demos/SwingDemos/DrawColoredPrimitivesJPanel.java79
-rwxr-xr-xdemos/SwingDemos/GLSwingDemoApplet.java168
-rw-r--r--demos/SwingDemos/GearsJPanel.java382
-rw-r--r--demos/SwingDemos/InternalGLFrameDemo1.java248
-rw-r--r--demos/SwingDemos/MatrixFuncs.java200
-rw-r--r--demos/SwingDemos/TessJPanel.java244
-rwxr-xr-xdemos/SwingDemos/gears.java370
-rw-r--r--demos/SwingDemos/test/GLJPanel/GLJPanel.java694
-rw-r--r--demos/SwingDemos/test/GLJPanel/test1.java158
-rw-r--r--demos/SwingDemos/test/GLJPanel/test2.java115
-rw-r--r--demos/SwingDemos/test/GLPanel-AWTGraphics/GLPanel.java676
-rw-r--r--demos/SwingDemos/test/GLPanel-AWTGraphics/test1.java137
-rw-r--r--demos/SwingDemos/test/GLPanel-GLGraphics/GLGraphics.java513
-rw-r--r--demos/SwingDemos/test/GLPanel-GLGraphics/GLPanel.java692
-rw-r--r--demos/SwingDemos/test/GLPanel-GLGraphics/test1.java129
-rwxr-xr-xdemos/change2GL4JavaV2.sh23
-rw-r--r--demos/demoCvs.java57
-rw-r--r--demos/demoCvsAnim.java57
-rw-r--r--demos/gl4java.policy60
-rw-r--r--demos/glDemosCvs.html14
-rw-r--r--demos/glDemosCvs.java620
-rw-r--r--demos/glLogoCvs.java765
-rw-r--r--demos/glLogoCvsApplet.html14
-rw-r--r--demos/glLogoCvsApplet.java71
-rw-r--r--demos/glLogoCvsAppletDbg.java125
-rw-r--r--demos/glLogoCvsAppletJ2P.html45
-rw-r--r--demos/glOlympicCvsApplet.html14
-rw-r--r--demos/glOlympicCvsApplet.java78
-rw-r--r--demos/glOlympicCvsAppletJ2P.html45
-rw-r--r--demos/glOlympicSwingApplet.html14
-rw-r--r--demos/glOlympicSwingApplet.java125
-rwxr-xr-xdemos/glStencilTest.java95
-rwxr-xr-xdemos/glc2glj32
-rwxr-xr-xdemos/index.html62
-rw-r--r--demos/java.policy56
-rw-r--r--demos/lunaL.ppmbin0 -> 98362 bytes
-rw-r--r--demos/makefile36
-rw-r--r--demos/natives/bc5/cube.c289
-rw-r--r--demos/natives/bc5/cube.idebin0 -> 43014 bytes
-rw-r--r--demos/natives/bc5/testGL1.c224
-rw-r--r--demos/natives/bc5/testGL1.idebin0 -> 43014 bytes
-rw-r--r--demos/natives/wgl.c517
-rw-r--r--demos/natives/wgl.h81
-rw-r--r--demos/natives/x11/cube.c95
-rw-r--r--demos/natives/x11/gears.c374
-rwxr-xr-xdemos/natives/x11/makeGears.sh3
-rw-r--r--demos/natives/x11/makefile30
-rw-r--r--demos/natives/x11/makefile.mesa30
-rw-r--r--demos/natives/x11/makefile.x1130
-rw-r--r--demos/natives/x11/olympic.c409
-rw-r--r--demos/natives/x11/testGL1.c222
-rw-r--r--demos/natives/x11/testGL2.c517
-rw-r--r--demos/natives/x11/wave.c500
-rw-r--r--demos/olympicCvs.java282
-rwxr-xr-xdemos/sappletviewer.bat1
-rwxr-xr-xdemos/sappletviewer.sh4
-rw-r--r--demos/starCvs.java205
-rw-r--r--demos/starCvs.java-orig444
-rwxr-xr-xdemos/test-jni12tst.sh3
-rwxr-xr-xdemos/test-jnitst.sh3
-rwxr-xr-xdemos/test.sh3
-rw-r--r--demos/test1Cvs.java100
-rw-r--r--demos/testTextPPM1.html13
-rwxr-xr-xdemos/testTextPPM1.java496
-rw-r--r--demos/testTextPPM1J2P.html43
-rw-r--r--demos/waveCvs.java634
338 files changed, 56050 insertions, 0 deletions
diff --git a/demos/GLLandScape/GLLandScape-readme.txt b/demos/GLLandScape/GLLandScape-readme.txt
new file mode 100644
index 0000000..7ceb26f
--- /dev/null
+++ b/demos/GLLandScape/GLLandScape-readme.txt
@@ -0,0 +1,58 @@
+GLLandScape V 1.1 (for JDK 1.1.X + GL4Java)
+===========================================
+
+you need to have:
+=================
+
+ o jdk 1.1.X or java2
+ o GL4Java V 2.X.X (http://www.jausoft.com/gl4java.html)
+
+ABOUT
+=====
+
+GLLandScape is another demonstration and test for GL4Java.
+
+The landscape algorythms are taken from
+Nicholas Anderson's Landscape V1.0 !
+ http://www.fortunecity.com/skyscraper/online/263
+
+A landscape will be generated, where you can walk through :-)
+
+FUTURE
+======
+
+I ported Nicholas Anderson's Landscape V1.0,
+because i am thinking that this is a fine virtual-world,
+to create a game :-)
+
+CHANGES
+=======
+
+Now using display lists for the world -> faster !
+
+INSTALL
+=======
+
+be sure to have GL4Java correctly installed
+(check the manuals at http://www.jausoft.com/gl4java.html !
+
+extract the GLLandScape.zip file !
+
+generate the classes with: �javac *.java�
+
+run GLLandScape with: 'java GLLandScapeFrame'
+
+thats it :-)
+
+THANXS
+======
+
+Thanxs to Nicholas Anderson for his source code of
+Landscape V1.0, which was written in ANSI-C and uses
+OpenGL GLU and GLUT !
+
+Sven Goethel
+
+
+
diff --git a/demos/GLLandScape/GLLandScape1-big.html b/demos/GLLandScape/GLLandScape1-big.html
new file mode 100644
index 0000000..06dcdf4
--- /dev/null
+++ b/demos/GLLandScape/GLLandScape1-big.html
@@ -0,0 +1,14 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<applet code="GLLandScape1Applet.class" width=800 height=600>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/GLLandScape/GLLandScape1-big_plugin13.html b/demos/GLLandScape/GLLandScape1-big_plugin13.html
new file mode 100644
index 0000000..1cb8f63
--- /dev/null
+++ b/demos/GLLandScape/GLLandScape1-big_plugin13.html
@@ -0,0 +1,46 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 800 HEIGHT = 600 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "GLLandScape1Applet.class" WIDTH = 800 HEIGHT = 600 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "GLLandScape1Applet.class" WIDTH = 800 HEIGHT = 600></XMP>
+<PARAM NAME = CODE VALUE = "GLLandScape1Applet.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "GLLandScape1Applet.class" WIDTH = 800 HEIGHT = 600>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/GLLandScape/GLLandScape1.html b/demos/GLLandScape/GLLandScape1.html
new file mode 100644
index 0000000..5521afd
--- /dev/null
+++ b/demos/GLLandScape/GLLandScape1.html
@@ -0,0 +1,14 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<applet code="GLLandScape1Applet.class" width=500 height=300>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/GLLandScape/GLLandScape1.java b/demos/GLLandScape/GLLandScape1.java
new file mode 100644
index 0000000..209f6db
--- /dev/null
+++ b/demos/GLLandScape/GLLandScape1.java
@@ -0,0 +1,714 @@
+/**
+ * @(#) GLLandScape1.java
+ */
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+
+/**
+ * This is meant as an skellekton for porting/writing
+ * OpenGL to gl4java
+ *
+ * If you are interessting in further Documentation and/or
+ * the history of gl4java follow the following link.
+ *
+ * <pre>
+ <a href="gl4java.html#_top_">The gl4java Documentation</a>
+ * </pre>
+ * <p>
+ *
+ * This NEW dummy code uses repaint(),
+ * the std. java thread, and sleep to suspend with a given
+ * Frames per secounds value !!
+ * (of course - sDisplay is still avaiable,
+ * but i guess it is not that reliable ... comments welcome )
+ *
+ *
+ * @see WinDataAccess
+ * @version 1.1, 3. MAI 1999
+ * @author Sven Goethel
+ *
+ */
+class GLLandScape1 extends GLAnimCanvas
+{
+ /**
+ * Variables for the LandScape
+ */
+ class COLOUR
+ {
+ public float r, g, b;
+
+ public COLOUR()
+ {
+ r = 0.0f;
+ g = 0.0f;
+ b = 0.0f;
+ }
+
+ }
+
+ /* The constant MAP is used throughout the program and represents the MAP of
+ the matrix/landscape. */
+ static final int MAP = 256;
+
+ /* This is the holding space for the landscape. */
+ float y[/*MAP+2*/][/*MAP+2*/];
+
+ char object[/*MAP+1*/][/*MAP+1*/];
+
+ /* This is the holding space for the landscape colours. */
+ COLOUR c[/*MAP+1*/][/*MAP+1*/];
+
+ public static final int FORWARD = 1;
+
+ public static final int UP = 2;
+
+ public static final int TURNLEFT = 3;
+
+ public static final int STRAFELEFT = 4;
+
+ public static final int LOOKUP = 5;
+
+ public static final int LOOKSET = 6;
+
+ static final int TRUE = 1;
+
+ static final int FALSE = 0;
+
+ static final int WIDTH = 32;
+
+ /* The width of the texture map. */
+ byte texImg[/*WIDTH * WIDTH * 4*/];
+
+ int texName[/*1*/] = {0};
+
+ short comp = 32;
+
+ /* Scale modifier. */
+ short temp, texture_mapping = FALSE, land_fogging = TRUE,
+ flat_shading = FALSE;
+
+ /* Initial eye position and vector of sight. */
+ float posx, posy, posz;
+
+ float lookx, looky, lookz;
+
+ float mySpeed = 0;
+
+ int myDir = FORWARD;
+
+ // the display list for the land ..
+ int theLand;
+
+
+ public GLLandScape1(int w, int h)
+ {
+ super(w,h);
+ }
+
+ public void init_pos()
+ {
+ posx = 4500.0f;
+ posy = 256.0f;
+ posz = 4500.0f;
+ lookx = 4096.0f;
+ looky = 0.0f;
+ lookz = 4096.0f;
+ mySpeed = 0;
+ System.out.println("init_pos");
+ }
+
+ public void init()
+ {
+ int i, j;
+ /* here we should add and initialize our JAVA components */
+ texImg = new byte[WIDTH * WIDTH * 4];
+ y = new float[MAP + 2][MAP + 2];
+ object = new char[MAP + 1][MAP + 1];
+ c = new COLOUR[MAP + 1][MAP + 1];
+ for(i = 0;i <= MAP;i++)
+ {
+ for(j = 0;j <= MAP;j++)
+ {
+ c[i][j] = new COLOUR();
+ }
+ }
+ float fogColor[] = {0.75f, 0.75f, 1.0f, 1.0f};
+ init_pos();
+ // srand(224);
+
+ create_fractal();
+ genLand();
+
+ // srand((unsigned)time(NULL));
+ makeTexture();
+ /* ... and furthet OpenGL init's - like you want to */
+ gl.glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+ if(texture_mapping == TRUE)
+ gl.glEnable(GL_TEXTURE_2D);
+ gl.glGenTextures(1,texName);
+ gl.glBindTexture(GL_TEXTURE_2D,texName[0]);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+ gl.glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,WIDTH,WIDTH,0,GL_RGBA,GL_UNSIGNED_BYTE,texImg);
+ gl.glEnable(GL_DEPTH_TEST);
+ if(flat_shading == FALSE)
+ gl.glShadeModel(GL_SMOOTH);
+ else
+ gl.glShadeModel(GL_FLAT);
+ if(land_fogging == TRUE)
+ gl.glEnable(GL_FOG);
+ else
+ gl.glDisable(GL_FOG);
+ gl.glFogi(GL_FOG_MODE,GL_LINEAR);
+ gl.glFogfv(GL_FOG_COLOR,fogColor);
+ gl.glFogf(GL_FOG_DENSITY,0.4f);
+ gl.glFogf(GL_FOG_START,800.0f);
+ gl.glFogf(GL_FOG_END,1000.0f);
+ gl.glClearColor(0.75f,0.75f,1.0f,1.0f);
+ // FreeConsole();
+ glj.gljCheckGL();
+
+
+ Dimension dim = getSize();
+ reshape(dim.width,dim.height);
+ myMove(FORWARD,mySpeed,true);
+ check_height();
+ repaint();
+ /* and start our working thread ... */
+ start();
+ }
+
+ public void display()
+ {
+ int i;
+ /* Standard gl4java Init */
+ if(!cvsIsInit() || glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ // ... just render it
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gl.glCallList(theLand);
+
+ myMove(FORWARD,mySpeed,true);
+ check_height();
+
+ setSuspended(mySpeed==0);
+
+ /* For your animation dutys ;-) */
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ /*************************************************************/
+ /*************************************************************/
+ /*************************************************************/
+ /*************************************************************/
+ /*************************************************************/
+ /*************************************************************/
+ void create_fractal()
+ {
+ int bsize, csize;
+ int x, z, i;
+ int r = 256;
+ /* The maximum random value. */
+ float gradient, shadow = 0.5f, n;
+ /* Make the matrix flat. */
+ for(x = 0;x < MAP + 2;x++)
+ for(z = 0;z < MAP + 2;z++)
+ y[x][z] = 0L;
+ bsize = MAP;
+ for(i = 0;i < 8;i++)
+ {
+ for(x = 0;x < MAP;x += bsize)
+ for(z = 0;z < MAP;z += bsize)
+ y[x][z] += (Math.random() * r - r / 2);
+ if(i > 4)
+ r = r / 2;
+ csize = bsize / 2;
+ if(csize > 0)
+ {
+ for(x = 0;x < MAP;x += bsize)
+ for(z = 0;z < MAP;z += bsize)
+ {
+ if(x < MAP)
+ y[x + csize][z] = (y[x + bsize][z] + y[x][z]) / 2;
+ if(z < MAP)
+ y[x][z + csize] = (y[x][z + bsize] + y[x][z]) / 2;
+ if(x < MAP && z < MAP)
+ y[x + csize][z + csize] = (y[x][z] + y[x + bsize][z] + y[x][z + bsize] + y[x + bsize][z + bsize]) / 4;
+ }
+ }
+ bsize = csize;
+ }
+ for(x = 0;x < MAP;x++)
+ {
+ for(z = 0;z < MAP;z++)
+ {
+ y[x][z] = y[x][z] + y[x + 1][z] + y[x + 1][z + 1] + y[x][z + 1];
+ y[x][z] /= 4.0f;
+ }
+ }
+ for(x = MAP;x > 0;x--)
+ {
+ for(z = 0;z < MAP;z++)
+ {
+ y[x][z] = y[x][z] + y[x - 1][z] + y[x - 1][z + 1] + y[x][z + 1];
+ y[x][z] /= 4.0f;
+ }
+ }
+ /* put trees in various places on grassland. */
+ for(x = 0;x < MAP;x++)
+ {
+ for(z = 0;z < MAP;z++)
+ {
+ if(((int)(Math.random() * 256.0f)) % 8 == 0 && y[x][z] > 0 && y[x][z] < 64)
+ {
+ object[x][z] = 't';
+ }
+ else
+ {
+ object[x][z] = 'n';
+ }
+ }
+ }
+ for(x = 0;x < MAP;x++)
+ for(z = 0;z < MAP;z++)
+ if(y[x][z] > 8)
+ {
+ n = y[x][z];
+ y[x][z] *= n;
+ y[x][z] /= 256.0f;
+ }
+ for(x = 0;x <= MAP;x++)
+ {
+ for(z = 0;z <= MAP;z++)
+ {
+ gradient = ((float)(y[x][z] - y[x + 1][z])) / 100.0f;
+ if(y[x][z] > 64)
+ {
+ if((y[x][z] - y[x][z + 1]) < 8 && (y[x][z] - y[x][z + 1]) > -8 && (y[x][z] - y[x + 1][z]) < 8 && (y[x][z] - y[x + 1][z]) > -8)
+ {
+ c[x][z].g = gradient + 0.75f;
+ c[x][z].r = c[x][z].g;
+ c[x][z].b = c[x][z].g;
+ }
+ else
+ {
+ c[x][z].r = gradient + 0.75f;
+ c[x][z].g = c[x][z].r * 0.8f;
+ c[x][z].b = c[x][z].r * 0.5f;
+ }
+ }
+ else
+ if(y[x][z] > 0)
+ {
+ c[x][z].g = gradient + 0.75f;
+ c[x][z].r = c[x][z].g * 0.6f;
+ c[x][z].b = 0.0f;
+ }
+ else
+ {
+ c[x][z].r = gradient + 1.0f;
+ c[x][z].g = c[x][z].r * 0.75f;
+ c[x][z].b = c[x][z].r * 0.5f;
+ }
+ }
+ }
+ for(x = 0;x <= MAP;x++)
+ for(z = 0;z <= MAP;z++)
+ {
+ if(y[x][z] < 0)
+ y[x][z] /= 4.0f;
+ }
+
+ }
+
+ void makeTexture()
+ {
+ int i, j, h, c;
+ for(i = 0;i < WIDTH;i++)
+ {
+ for(j = 0;j < WIDTH;j++)
+ {
+ c = (int)(Math.random() * 15 + 240);
+ h = i * WIDTH * 4 + j * 4;
+ texImg[h + 0] = (byte)c;
+ texImg[h + 1] = (byte)c;
+ texImg[h + 2] = (byte)c;
+ texImg[h + 3] = (byte)255;
+ }
+ }
+ }
+
+ void check_height()
+ {
+ float x0, x1, lx, lz, x, z, midpoint;
+ int fx, fz;
+ x = (posx / (comp * 1.0f));
+ z = (posz / (comp * 1.0f));
+ fx = (int)(x);
+ fz = (int)(z);
+ lx = x - fx;
+ lz = z - fz;
+ if(fx >= MAP + 2 || fz >= MAP + 2 || fx < 0 || fz < 0)
+ {
+ init_pos();
+ return;
+ }
+ x0 = y[fx][fz] + (y[fx][fz + 1] - y[fx][fz]) * lz;
+ x1 = y[fx + 1][fz] + (y[fx + 1][fz + 1] - y[fx + 1][fz]) * lz;
+ midpoint = x0 + (x1 - x0) * lx;
+ posy = midpoint + 16.0f;
+ }
+
+ /* Function that moves the eye / turns the angle of sight. */
+ /* Updates scene if update. */
+ void myMove(int dir, float amount, boolean update)
+ {
+ float diff = (float)Math.sqrt(lookx * lookx + lookz * lookz);
+ /*
+ float alpha = (float)
+ Math.atan(Math.abs(lookz)/Math.abs(lookx));
+ if(lookx<0&&lookz>=0)
+ alpha+=(float)(Math.PI/2.0);
+ else if(lookx>=0&&lookz>=0)
+ alpha+=0;
+ else if(lookx<0&&lookz<0)
+ alpha+=(float)Math.PI;
+ else if(lookx>=0&&lookz<0)
+ alpha+=(float)((3.0*Math.PI)/2.0);
+ float _alpha = (float) (alpha*180f/Math.PI );
+ */
+ boolean do_repaint = false;
+ lookx /= diff;
+ lookz /= diff;
+ //myDir=dir;
+ switch(dir)
+ {
+ case FORWARD:
+ posx += lookx * amount;
+ posz += lookz * amount;
+ break;
+ case TURNLEFT:
+ lookx = lookx * (float)Math.cos(amount) + lookz * (float)Math.sin(amount);
+ lookz = lookz * (float)Math.cos(amount) - lookx * (float)Math.sin(amount);
+ // lookx^2 + lookz^2 != 1 for some reason. Fix.
+ lookx /= diff;
+ lookz /= diff;
+ do_repaint = true;
+ break;
+ case STRAFELEFT:
+ posx += lookz * amount;
+ posz -= lookx * amount;
+ break;
+ case UP:
+ posy += amount;
+ do_repaint = true;
+ break;
+ case LOOKUP:
+ looky += amount;
+ do_repaint = true;
+ break;
+ case LOOKSET:
+ looky = amount;
+ do_repaint = true;
+ break;
+ }
+ int x = (int)(posx / (comp * 1.0f));
+ int z = (int)(posz / (comp * 1.0f));
+ if(x > MAP)
+ posx = 0;
+ if(z > MAP)
+ posz = 0;
+ if(posx < 0)
+ posx = MAP * comp;
+ if(posz < 0)
+ posz = MAP * comp;
+ if (update)
+ {
+ gl.glMatrixMode(GL_MODELVIEW); gl.glLoadIdentity();
+ glu.gluLookAt(posx, posy, posz,
+ posx+lookx, posy+looky,
+ posz+lookz, 0.0f,1.0f,0.0f);
+ if( do_repaint )
+ repaint();
+ }
+ }
+
+ void draw_tree(int x, int z)
+ {
+ int x1, y1, z1;
+ y1 = (int)y[x][z];
+ x1 = x * comp;
+ z1 = z * comp;
+ gl.glBegin(GL_POLYGON);
+ gl.glColor3f(0.6f,0.4f,0.0f);
+ gl.glVertex3f(x1 - 2,y1 + 5,z1);
+ gl.glVertex3f(x1 + 2,y1 + 5,z1);
+ gl.glVertex3f(x1 + 2,y1,z1);
+ gl.glVertex3f(x1 - 2,y1,z1);
+ gl.glEnd();
+ gl.glBegin(GL_POLYGON);
+ gl.glVertex3f(x1,y1 + 5,z1 - 2);
+ gl.glVertex3f(x1,y1 + 5,z1 + 2);
+ gl.glVertex3f(x1,y1,z1 + 2);
+ gl.glVertex3f(x1,y1,z1 - 2);
+ gl.glEnd();
+ gl.glBegin(GL_POLYGON);
+ gl.glColor3f(0.35f,0.7f,0.0f);
+ gl.glTexCoord2f(0.0f,0.0f);
+ gl.glVertex3f(x1 - 10,y1 + 5,z1);
+ gl.glTexCoord2f(0.5f,1.0f);
+ gl.glVertex3f(x1,y1 + 25,z1);
+ gl.glTexCoord2f(1.0f,0.0f);
+ gl.glVertex3f(x1 + 10,y1 + 5,z1);
+ gl.glEnd();
+ gl.glBegin(GL_POLYGON);
+ gl.glColor3f(0.4f,0.8f,0.0f);
+ gl.glTexCoord2f(0.0f,0.0f);
+ gl.glVertex3f(x1,y1 + 5,z1 - 10);
+ gl.glTexCoord2f(0.5f,1.0f);
+ gl.glVertex3f(x1,y1 + 25,z1);
+ gl.glTexCoord2f(1.0f,0.0f);
+ gl.glVertex3f(x1,y1 + 5,z1 + 10);
+ gl.glEnd();
+ }
+
+ void genLand()
+ {
+ int x, z, position_x, position_z;
+ float x1, x2, z1, z2;
+
+ theLand = gl.glGenLists(1);
+ gl.glNewList(theLand, GL_COMPILE);
+
+ position_x = (int)(posx / comp);
+ position_z = (int)(posz / comp);
+ for(x = position_x - 16;x < position_x + 17;x++)
+ for(z = position_z - 16;z < position_z + 17;z++)
+ {
+ if(x > 0 && x < MAP && z > 0 && z < MAP)
+ {
+ x1 = x * comp;
+ x2 = x * comp + comp;
+ z1 = z * comp;
+ z2 = z * comp + comp;
+ gl.glBegin(GL_POLYGON);
+ gl.glColor3f(c[x][z].r,c[x][z].g,c[x][z].b);
+ gl.glTexCoord2f(0.0f,0.0f);
+ gl.glVertex3f(x1,y[x][z],z1);
+ gl.glColor3f(c[x + 1][z].r,c[x + 1][z].g,c[x + 1][z].b);
+ gl.glTexCoord2f(1.0f,0.0f);
+ gl.glVertex3f(x2,y[x + 1][z],z1);
+ gl.glColor3f(c[x][z + 1].r,c[x][z + 1].g,c[x][z + 1].b);
+ gl.glTexCoord2f(0.0f,1.0f);
+ gl.glVertex3f(x1,y[x][z + 1],z2);
+ gl.glEnd();
+ gl.glBegin(GL_POLYGON);
+ gl.glColor3f(c[x + 1][z + 1].r,c[x + 1][z + 1].g,c[x + 1][z + 1].b);
+ gl.glTexCoord2f(1.0f,1.0f);
+ gl.glVertex3f(x2,y[x + 1][z + 1],z2);
+ gl.glColor3f(c[x][z + 1].r,c[x][z + 1].g,c[x][z + 1].b);
+ gl.glTexCoord2f(0.0f,1.0f);
+ gl.glVertex3f(x1,y[x][z + 1],z2);
+ gl.glColor3f(c[x + 1][z].r,c[x + 1][z].g,c[x + 1][z].b);
+ gl.glTexCoord2f(1.0f,0.0f);
+ gl.glVertex3f(x2,y[x + 1][z],z1);
+ gl.glEnd();
+ if(object[x][z] == 't')
+ draw_tree(x,z);
+ }
+ }
+ gl.glEndList();
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int w, int h)
+ {
+ glj.gljResize(w,h);
+ gl.glViewport(0,0,w,h);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective(60.0,(double)w / (double)h,1.0,1000.0);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ glu.gluLookAt(posx,posy,posz,posx + lookx,posy + looky,posz + lookz,0.0,1.0,0.0);
+ }
+
+ public float getMySpeed()
+ {
+ return mySpeed;
+ }
+
+ public void setMySpeed(float s)
+ {
+ mySpeed = s;
+ setSuspended(false);
+ }
+
+ public boolean getTextureState()
+ {
+ return texture_mapping == TRUE;
+ }
+
+ public void setTexture(boolean t)
+ {
+ if(t)
+ {
+ if(texture_mapping == FALSE)
+ {
+ if(glj!=null)
+ {
+ if(glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ gl.glEnable(GL_TEXTURE_2D);
+ texture_mapping = TRUE;
+ glj.gljCheckGL();
+ repaint();
+ }
+ }
+ }
+ else
+ {
+ if(texture_mapping == TRUE)
+ {
+ if(glj!=null)
+ {
+ if(glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ gl.glDisable(GL_TEXTURE_2D);
+ texture_mapping = FALSE;
+ glj.gljCheckGL();
+ repaint();
+ }
+ }
+ }
+ setSuspended(false);
+ }
+
+ public boolean getFogState()
+ {
+ return land_fogging == TRUE;
+ }
+
+ public void setFog(boolean t)
+ {
+ if(t)
+ {
+ if(land_fogging == FALSE)
+ {
+ if(glj!=null)
+ {
+ if(glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ gl.glEnable(GL_FOG);
+ land_fogging = TRUE;
+ glj.gljCheckGL();
+ repaint();
+ }
+ }
+ }
+ else
+ {
+ if(land_fogging == TRUE)
+ {
+ if(glj!=null)
+ {
+ if(glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ gl.glDisable(GL_FOG);
+ land_fogging = FALSE;
+ glj.gljCheckGL();
+ repaint();
+ }
+ }
+ }
+ setSuspended(false);
+ }
+
+ public boolean getFlatShadeState()
+ {
+ return flat_shading == TRUE;
+ }
+
+ public void setFlatShading(boolean t)
+ {
+ if(t)
+ {
+ if(flat_shading == FALSE)
+ {
+ if(glj!=null)
+ {
+ if(glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ gl.glShadeModel(GL_FLAT);
+ flat_shading = TRUE;
+ glj.gljCheckGL();
+ repaint();
+ }
+ }
+ }
+ else
+ {
+ if(flat_shading == TRUE)
+ {
+ if(glj!=null)
+ {
+ if(glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ gl.glShadeModel(GL_SMOOTH);
+ flat_shading = FALSE;
+ glj.gljCheckGL();
+ repaint();
+ }
+ }
+ }
+ setSuspended(false);
+ }
+
+ public void newFractal()
+ {
+ create_fractal();
+ if(!cvsIsInit() || glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ gl.glFinish();
+ gl.glDeleteLists(theLand, 1);
+ genLand();
+ check_height();
+ repaint();
+ setSuspended(false);
+ }
+
+}
+
diff --git a/demos/GLLandScape/GLLandScape1Applet.java b/demos/GLLandScape/GLLandScape1Applet.java
new file mode 100644
index 0000000..155f934
--- /dev/null
+++ b/demos/GLLandScape/GLLandScape1Applet.java
@@ -0,0 +1,399 @@
+
+import gl4java.GLContext;
+import java.awt.*;
+import java.applet.*;
+import java.awt.event.*;
+
+public class GLLandScape1Applet extends Applet
+ implements MouseListener, KeyListener, ActionListener
+{
+ GLLandScape1 landScape = null;
+
+ Button bTexture = null;
+ Button bShading = null;
+ Button bFog = null;
+ Button bNewFractal = null;
+ Button bInfo = null;
+
+ Button bFps; TextField tFps;
+
+ boolean gameOn = true;
+
+ SpeedTimer tMySpeed = null;
+
+ public void init()
+ {
+ init(0,0);
+ }
+
+ public void init(int w, int h)
+ {
+ super.init();
+
+ setLayout(new BorderLayout());
+
+ Panel glFeatures = new Panel();
+ glFeatures.setLayout(new GridLayout(6,1));
+ glFeatures.add(bTexture =new Button("Texture"));
+ glFeatures.add(bShading =new Button("Shading"));
+ glFeatures.add(bFog =new Button("Fogging"));
+ glFeatures.add(bNewFractal =new Button("Fractal"));
+ bTexture.addMouseListener(this);
+ bShading.addMouseListener(this);
+ bFog.addMouseListener(this);
+ bNewFractal.addMouseListener(this);
+ add("East", glFeatures);
+
+ Panel pFps = new Panel();
+ pFps.setLayout(new GridLayout(1,3));
+ pFps.add(bInfo =new Button("info"));
+ pFps.add(bFps =new Button("get fps"));
+ pFps.add(tFps =new TextField());
+ bInfo.addMouseListener(this);
+ bFps.addMouseListener(this);
+ tFps.addActionListener(this);
+ add("South", pFps);
+
+ if(w==0 && h==0)
+ {
+ Dimension d = getSize();
+ landScape= new GLLandScape1(d.width, d.height);
+ } else {
+ landScape= new GLLandScape1(w, h);
+ }
+ landScape.setAnimateFps(30.0);
+ landScape.addMouseListener(this);
+ landScape.addKeyListener(this);
+
+ tMySpeed = new SpeedTimer(landScape, 200);
+
+ landScape.requestFocus();
+ landScape.setMySpeed(0);
+
+ add("Center", landScape);
+ }
+
+ public void destroy()
+ {
+ landScape.stop();
+ landScape.cvsDispose();
+ landScape.removeMouseListener(this);
+ landScape.removeKeyListener(this);
+ }
+
+ public void start()
+ {
+ landScape.start();
+ }
+
+ public void stop()
+ {
+ landScape.stop();
+ }
+
+ public static void main( String args[] ) {
+ String gljLib=null;
+ String glLib=null;
+ String gluLib=null;
+
+ if(args.length>0)
+ gljLib = args[0];
+ if(args.length>1)
+ glLib = args[1];
+ if(args.length>2)
+ gluLib = args[2];
+
+ if(GLContext.loadNativeLibraries(gljLib, glLib, gluLib)==false)
+ System.out.println("GLCanvasV2 could not load native libs:"+
+ gljLib + ", " + glLib + ", " + gluLib);
+
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+
+ GLLandScape1Applet window =
+ new GLLandScape1Applet();
+
+ Frame f = new Frame();
+ f.add(window);
+ window.init(500,300);
+ f.pack();
+ f.setVisible(true);
+
+ f.addWindowListener( new WindowAdapter()
+ {
+ public void windowClosed(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ public void windowClosing(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ }
+ );
+
+
+ window.start();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(landScape ) )
+ {
+ landScape.requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ }
+ public void mouseReleased( MouseEvent evt ) {
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+
+ if( comp.equals(bTexture ) )
+ landScape.setTexture( ! landScape.getTextureState());
+ else if( comp.equals(bNewFractal ) )
+ landScape.newFractal();
+ else if( comp.equals(bShading ) )
+ landScape.setFlatShading(!landScape.getFlatShadeState());
+ else if( comp.equals(bFog ) )
+ landScape.setFog( ! landScape.getFogState());
+ else if( comp.equals(landScape) )
+ landScape.setSuspended(false);
+ else if( comp.equals(bFps) )
+ {
+ double fps = 0;
+
+ landScape.stopFpsCounter();
+ fps=landScape.getFps();
+ tFps.setText(String.valueOf(fps));
+ landScape.resetFpsCounter();
+ }
+ else if( comp.equals(bInfo) )
+ {
+ InfoWin iw = new InfoWin();
+ }
+ }
+
+
+ public void keyTyped(KeyEvent e)
+ {
+ }
+
+ public void keyPressed(KeyEvent e)
+ {
+ int key = e.getKeyCode();
+
+ if( gameOn==true )
+ {
+ if ( key==KeyEvent.VK_LEFT )
+ {
+ landScape.myMove(landScape.TURNLEFT, 0.1f, true);
+ tMySpeed.start();
+ }
+ else if ( key==KeyEvent.VK_RIGHT )
+ {
+ landScape.myMove(landScape.TURNLEFT, -0.1f, true);
+ tMySpeed.start();
+ }
+ else if ( key==KeyEvent.VK_UP )
+ {
+ float v = tMySpeed.getSpeed();
+
+ if ( e.isShiftDown() )
+ {
+ tMySpeed.setSpeed(v+2.0f);
+ }
+ else {
+ tMySpeed.setSpeed(v+1.0f);
+ }
+ tMySpeed.start();
+ }
+ else if ( key==KeyEvent.VK_DOWN )
+ {
+ float v = tMySpeed.getSpeed();
+
+ if ( e.isShiftDown() )
+ tMySpeed.setSpeed(v/2.0f);
+ else
+ tMySpeed.setSpeed(v-1.0f);
+ tMySpeed.start();
+ }
+ else if ( key==KeyEvent.VK_PAGE_UP )
+ {
+ landScape.myMove(landScape.LOOKUP, 0.1f, true);
+ tMySpeed.start();
+ }
+ else if ( key==KeyEvent.VK_PAGE_DOWN )
+ {
+ landScape.myMove(landScape.LOOKUP, -0.1f, true);
+ tMySpeed.start();
+ }
+ else if ( key==KeyEvent.VK_END )
+ {
+ landScape.myMove(landScape.LOOKSET, 0f, true);
+ tMySpeed.start();
+ }
+ }
+ }
+
+ public void keyReleased(KeyEvent e)
+ {
+ int key = e.getKeyCode();
+
+ if( gameOn==true &&
+ ( key==KeyEvent.VK_UP ||
+ key==KeyEvent.VK_DOWN
+ )
+ )
+ {
+ //ts.start();
+ }
+ else if( gameOn==true &&
+ ( key==KeyEvent.VK_LEFT ||
+ key==KeyEvent.VK_RIGHT
+ )
+ )
+ {
+ //landScape.noMySpeed();
+ }
+ }
+
+ public void actionPerformed(ActionEvent event)
+ {
+ Object source = event.getSource();
+
+ if ( source == tFps )
+ {
+ try {
+ double FramesPerSec=
+ Double.valueOf(tFps.getText()).doubleValue();
+ landScape.setAnimateFps(FramesPerSec);
+ landScape.setSuspended(false);
+ } catch (NumberFormatException s) {
+ System.out.println("wrong fps format, use float ..");
+ }
+
+ }
+ }
+
+ class SpeedTimer implements Runnable {
+ protected Thread me = null;
+ protected boolean to=false, started=false;
+ protected int _t;
+
+ protected float speed = 0.0f;
+ protected GLLandScape1 _ls;
+
+ public SpeedTimer(GLLandScape1 ls, int t)
+ { _ls=ls; _t=t; }
+
+ public void start()
+ {
+ if(me!=null) stop();
+ to=false;
+ started=true;
+
+ me = new Thread(this);
+ me.start();
+ }
+
+ public void stop() {
+ if(me!=null)
+ {
+ me.stop();
+ me=null;
+ started=false;
+ to=false;
+ }
+ }
+
+ public void run() {
+ if(me!=null)
+ {
+ try {me.sleep(_t,0);} catch (InterruptedException e){}
+ to=true;
+ while(speed>1.0f)
+ {
+ speed/=2.0f;
+ _ls.setMySpeed(speed);
+ try {me.sleep(_t,0);} catch (InterruptedException e){}
+ }
+ speed = 0.0f;
+ _ls.setMySpeed(0f);
+ }
+ }
+
+ public boolean isActive() { return to; }
+ public boolean isStarted() { return started; }
+
+ public float getSpeed() { return speed; }
+ public void setSpeed(float v)
+ { speed=v;
+ _ls.setMySpeed(speed);
+ }
+
+ }
+
+ class InfoWin extends Frame
+ implements ActionListener
+ {
+ protected Button DismissButton;
+
+ String text =
+ "GLLandScape1 V 1.2\n"+
+ "by Sven Goethel\n"+
+ "\thttp://www.jausoft.com/gl4java.html\n"+
+ "\tmailto:[email protected]\n\n"+
+ "The original sources for the lanscape algorythms,\n"+
+ "are taken from Nicholas Anderson's Landscape V1.0 !\n"+
+ "\thttp://www.fortunecity.com/skyscraper/online/263\n"+
+ "\tmailto:[email protected]\n\n"+
+ "usage:\n"+
+ "\t ARROW-UP : accelerate\n"+
+ "\t ARROW-UP + SHIFT : accelerate fast \n"+
+ "\t ARROW-DOWN : de-accelerate\n"+
+ "\t ARROW-DOWN + SHIFT : de-accelerate fast\n"+
+ "\t ARROW-LEFT : turn left\n"+
+ "\t ARROW-right : turn right\n"+
+ "\t PAGE-UP : look-up\n"+
+ "\t PAGE-DOWN : look-down\n"+
+ "\t END : look normal\n\n"+
+ "Have a lot of fun - Sven Goethel\n";
+
+ public InfoWin()
+ {
+ setTitle("INFO");
+ setName("INFO");
+
+ setLayout(new BorderLayout());
+ add("Center", new TextArea(text, 25, 50));
+
+ add("South", DismissButton = new Button("dismiss"));
+ DismissButton.addActionListener(this);
+
+ pack();
+ setVisible(true);
+
+ toFront();
+ }
+
+ public void actionPerformed(ActionEvent event) {
+ if ( event.getSource() == DismissButton)
+ {
+ setVisible(false);
+ dispose();
+ }
+ }
+ }
+}
diff --git a/demos/GLLandScape/GLLandScape1_plugin13.html b/demos/GLLandScape/GLLandScape1_plugin13.html
new file mode 100644
index 0000000..a3f188b
--- /dev/null
+++ b/demos/GLLandScape/GLLandScape1_plugin13.html
@@ -0,0 +1,46 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 500 HEIGHT = 300 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "GLLandScape1Applet.class" WIDTH = 500 HEIGHT = 300 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "GLLandScape1Applet.class" WIDTH = 500 HEIGHT = 300></XMP>
+<PARAM NAME = CODE VALUE = "GLLandScape1Applet.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "GLLandScape1Applet.class" WIDTH = 500 HEIGHT = 300>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/GLLandScape/GLLandScape1w1-big.html b/demos/GLLandScape/GLLandScape1w1-big.html
new file mode 100644
index 0000000..7e5eae0
--- /dev/null
+++ b/demos/GLLandScape/GLLandScape1w1-big.html
@@ -0,0 +1,14 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<applet code="GLLandScape1w1Applet.class" width=800 height=600>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/GLLandScape/GLLandScape1w1-big_plugin13.html b/demos/GLLandScape/GLLandScape1w1-big_plugin13.html
new file mode 100644
index 0000000..1dc35f8
--- /dev/null
+++ b/demos/GLLandScape/GLLandScape1w1-big_plugin13.html
@@ -0,0 +1,46 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 800 HEIGHT = 600 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "GLLandScape1w1Applet.class" WIDTH = 800 HEIGHT = 600 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "GLLandScape1w1Applet.class" WIDTH = 800 HEIGHT = 600></XMP>
+<PARAM NAME = CODE VALUE = "GLLandScape1w1Applet.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "GLLandScape1w1Applet.class" WIDTH = 800 HEIGHT = 600>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/GLLandScape/GLLandScape1w1.html b/demos/GLLandScape/GLLandScape1w1.html
new file mode 100644
index 0000000..074a19e
--- /dev/null
+++ b/demos/GLLandScape/GLLandScape1w1.html
@@ -0,0 +1,14 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<applet code="GLLandScape1w1Applet.class" width=500 height=300>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/GLLandScape/GLLandScape1w1.java b/demos/GLLandScape/GLLandScape1w1.java
new file mode 100644
index 0000000..9f6f1a3
--- /dev/null
+++ b/demos/GLLandScape/GLLandScape1w1.java
@@ -0,0 +1,781 @@
+/**
+ * @(#) GLLandScape1w1.java
+ */
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+
+/**
+ * This is meant as an skellekton for porting/writing
+ * OpenGL to gl4java
+ *
+ * If you are interessting in further Documentation and/or
+ * the history of gl4java follow the following link.
+ *
+ * <pre>
+ <a href="gl4java.html#_top_">The gl4java Documentation</a>
+ * </pre>
+ * <p>
+ *
+ * This NEW dummy code uses repaint(),
+ * the std. java thread, and sleep to suspend with a given
+ * Frames per secounds value !!
+ * (of course - sDisplay is still avaiable,
+ * but i guess it is not that reliable ... comments welcome )
+ *
+ *
+ * @see WinDataAccess
+ * @version 1.1, 3. MAI 1999
+ * @author Sven Goethel
+ *
+ */
+class GLLandScape1w1 extends GLAnimCanvas
+{
+ /**
+ * Variables for the LandScape
+ */
+ class COLOUR
+ {
+ public float r, g, b;
+
+ public COLOUR()
+ {
+ r = 0.0f;
+ g = 0.0f;
+ b = 0.0f;
+ }
+
+ }
+
+ /* The constant MAP is used throughout the program and represents the MAP of
+ the matrix/landscape. */
+ static final int MAP = 256;
+
+ /* This is the holding space for the landscape. */
+ float y[/*MAP+2*/][/*MAP+2*/];
+
+ char object[/*MAP+1*/][/*MAP+1*/];
+
+ /* This is the holding space for the landscape colours. */
+ COLOUR c[/*MAP+1*/][/*MAP+1*/];
+
+ public static final int FORWARD = 1;
+
+ public static final int UP = 2;
+
+ public static final int TURNLEFT = 3;
+
+ public static final int STRAFELEFT = 4;
+
+ public static final int LOOKUP = 5;
+
+ public static final int LOOKSET = 6;
+
+ static final int TRUE = 1;
+
+ static final int FALSE = 0;
+
+ static final int WIDTH = 32;
+
+ /* The width of the texture map. */
+ byte texImg[/*WIDTH * WIDTH * 4*/];
+
+ int texName[/*1*/] = {0};
+
+ short comp = 32;
+
+ /* Scale modifier. */
+ short temp, texture_mapping = FALSE, land_fogging = TRUE,
+ flat_shading = FALSE;
+
+ /* Initial eye position and vector of sight. */
+ float posx, posy, posz;
+
+ float lookx, looky, lookz;
+
+ float mySpeed = 0;
+
+ int myDir = FORWARD;
+
+ // the display list for the land ..
+ int theLand;
+
+
+ final int MAX_PLANES = 15;
+ GlutPlaneObj planes[] = null;
+ Random random = null;
+
+
+ public GLLandScape1w1(int w, int h)
+ {
+ super(w,h);
+ }
+
+ public void init_pos()
+ {
+ posx = 4500.0f;
+ posy = 256.0f;
+ posz = 4500.0f;
+ lookx = 4096.0f;
+ looky = 0.0f;
+ lookz = 4096.0f;
+ mySpeed = 0;
+ System.out.println("init_pos");
+ }
+
+ public void init()
+ {
+ int i, j;
+ /* here we should add and initialize our JAVA components */
+ texImg = new byte[WIDTH * WIDTH * 4];
+ y = new float[MAP + 2][MAP + 2];
+ object = new char[MAP + 1][MAP + 1];
+ c = new COLOUR[MAP + 1][MAP + 1];
+ for(i = 0;i <= MAP;i++)
+ {
+ for(j = 0;j <= MAP;j++)
+ {
+ c[i][j] = new COLOUR();
+ }
+ }
+ float fogColor[] = {0.75f, 0.75f, 1.0f, 1.0f};
+ init_pos();
+ // srand(224);
+
+ create_fractal();
+ genLand();
+
+ random = new Random(System.currentTimeMillis());
+ planes = new GlutPlaneObj[MAX_PLANES];
+ for (i = 0; i < MAX_PLANES; i++)
+ planes[i] = new GlutPlaneObj(gl, glu);
+
+ // srand((unsigned)time(NULL));
+ makeTexture();
+ /* ... and furthet OpenGL init's - like you want to */
+ gl.glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+ if(texture_mapping == TRUE)
+ gl.glEnable(GL_TEXTURE_2D);
+ gl.glGenTextures(1,texName);
+ gl.glBindTexture(GL_TEXTURE_2D,texName[0]);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+ gl.glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,WIDTH,WIDTH,0,GL_RGBA,GL_UNSIGNED_BYTE,texImg);
+ gl.glEnable(GL_DEPTH_TEST);
+ if(flat_shading == FALSE)
+ gl.glShadeModel(GL_SMOOTH);
+ else
+ gl.glShadeModel(GL_FLAT);
+ if(land_fogging == TRUE)
+ gl.glEnable(GL_FOG);
+ else
+ gl.glDisable(GL_FOG);
+ gl.glFogi(GL_FOG_MODE,GL_LINEAR);
+ gl.glFogfv(GL_FOG_COLOR,fogColor);
+ gl.glFogf(GL_FOG_DENSITY,0.4f);
+ gl.glFogf(GL_FOG_START,800.0f);
+ gl.glFogf(GL_FOG_END,1000.0f);
+ gl.glClearColor(0.75f,0.75f,1.0f,1.0f);
+ // FreeConsole();
+ glj.gljCheckGL();
+
+
+ Dimension dim = getSize();
+ reshape(dim.width,dim.height);
+ myMove(FORWARD,mySpeed,true,false);
+ check_height();
+ repaint();
+ /* and start our working thread ... */
+ start();
+ }
+
+ public void display()
+ {
+ int i;
+ /* Standard gl4java Init */
+ if(!cvsIsInit() || glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ // ... just render it
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gl.glCallList(theLand);
+
+ gl.glShadeModel(GL_FLAT);
+ for (i = 0; i < MAX_PLANES; i++)
+ {
+ planes[i].display();
+ }
+ if(flat_shading == FALSE)
+ gl.glShadeModel(GL_SMOOTH);
+
+ myMove(FORWARD,mySpeed,true,false);
+ check_height();
+
+
+ /* For your animation dutys ;-) */
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void addPlane()
+ {
+ for (int i = 0; i < MAX_PLANES; i++)
+ {
+ if (planes[i].speed == 0.0f)
+ {
+ int c = random.nextInt() & 0x07;
+ while (c == 0) c = random.nextInt() & 0x07;
+ float r = (float)((c >> 2) & 0x01);
+ float g = (float)((c >> 1) & 0x01);
+ float b = (float)(c & 0x01);
+ // Blue fades into the background; lighten it up.
+ if (c == 0x01) r = g = 0.4f;
+ planes[i].setColor(r,g,b);
+ planes[i].speed =
+ ((float)(random.nextInt() % 20)) * 0.001f + 0.02f;
+ if ((random.nextInt() & 0x01) != 0)
+ planes[i].speed *= -1.0f;
+ planes[i].theta =
+ ((float)(random.nextInt() % 257))*0.1111f;
+ planes[i].tick();
+ if (isSuspended()) repaint();
+ System.out.println("plane added");
+ return;
+ }
+ }
+ }
+
+ public void removePlane()
+ {
+ for (int i = MAX_PLANES - 1; i >= 0; i--)
+ {
+ if (planes[i].speed != 0.0f)
+ {
+ planes[i].speed = 0.0f;
+ if (isSuspended()) repaint();
+ System.out.println("plane removed");
+ return;
+ }
+ }
+ }
+
+ /*************************************************************/
+ /*************************************************************/
+ /*************************************************************/
+ /*************************************************************/
+ /*************************************************************/
+ /*************************************************************/
+ void create_fractal()
+ {
+ int bsize, csize;
+ int x, z, i;
+ int r = 256;
+ /* The maximum random value. */
+ float gradient, shadow = 0.5f, n;
+ /* Make the matrix flat. */
+ for(x = 0;x < MAP + 2;x++)
+ for(z = 0;z < MAP + 2;z++)
+ y[x][z] = 0L;
+ bsize = MAP;
+ for(i = 0;i < 8;i++)
+ {
+ for(x = 0;x < MAP;x += bsize)
+ for(z = 0;z < MAP;z += bsize)
+ y[x][z] += (Math.random() * r - r / 2);
+ if(i > 4)
+ r = r / 2;
+ csize = bsize / 2;
+ if(csize > 0)
+ {
+ for(x = 0;x < MAP;x += bsize)
+ for(z = 0;z < MAP;z += bsize)
+ {
+ if(x < MAP)
+ y[x + csize][z] = (y[x + bsize][z] + y[x][z]) / 2;
+ if(z < MAP)
+ y[x][z + csize] = (y[x][z + bsize] + y[x][z]) / 2;
+ if(x < MAP && z < MAP)
+ y[x + csize][z + csize] = (y[x][z] + y[x + bsize][z] + y[x][z + bsize] + y[x + bsize][z + bsize]) / 4;
+ }
+ }
+ bsize = csize;
+ }
+ for(x = 0;x < MAP;x++)
+ {
+ for(z = 0;z < MAP;z++)
+ {
+ y[x][z] = y[x][z] + y[x + 1][z] + y[x + 1][z + 1] + y[x][z + 1];
+ y[x][z] /= 4.0f;
+ }
+ }
+ for(x = MAP;x > 0;x--)
+ {
+ for(z = 0;z < MAP;z++)
+ {
+ y[x][z] = y[x][z] + y[x - 1][z] + y[x - 1][z + 1] + y[x][z + 1];
+ y[x][z] /= 4.0f;
+ }
+ }
+ /* put trees in various places on grassland. */
+ for(x = 0;x < MAP;x++)
+ {
+ for(z = 0;z < MAP;z++)
+ {
+ if(((int)(Math.random() * 256.0f)) % 8 == 0 && y[x][z] > 0 && y[x][z] < 64)
+ {
+ object[x][z] = 't';
+ }
+ else
+ {
+ object[x][z] = 'n';
+ }
+ }
+ }
+ for(x = 0;x < MAP;x++)
+ for(z = 0;z < MAP;z++)
+ if(y[x][z] > 8)
+ {
+ n = y[x][z];
+ y[x][z] *= n;
+ y[x][z] /= 256.0f;
+ }
+ for(x = 0;x <= MAP;x++)
+ {
+ for(z = 0;z <= MAP;z++)
+ {
+ gradient = ((float)(y[x][z] - y[x + 1][z])) / 100.0f;
+ if(y[x][z] > 64)
+ {
+ if((y[x][z] - y[x][z + 1]) < 8 && (y[x][z] - y[x][z + 1]) > -8 && (y[x][z] - y[x + 1][z]) < 8 && (y[x][z] - y[x + 1][z]) > -8)
+ {
+ c[x][z].g = gradient + 0.75f;
+ c[x][z].r = c[x][z].g;
+ c[x][z].b = c[x][z].g;
+ }
+ else
+ {
+ c[x][z].r = gradient + 0.75f;
+ c[x][z].g = c[x][z].r * 0.8f;
+ c[x][z].b = c[x][z].r * 0.5f;
+ }
+ }
+ else
+ if(y[x][z] > 0)
+ {
+ c[x][z].g = gradient + 0.75f;
+ c[x][z].r = c[x][z].g * 0.6f;
+ c[x][z].b = 0.0f;
+ }
+ else
+ {
+ c[x][z].r = gradient + 1.0f;
+ c[x][z].g = c[x][z].r * 0.75f;
+ c[x][z].b = c[x][z].r * 0.5f;
+ }
+ }
+ }
+ for(x = 0;x <= MAP;x++)
+ for(z = 0;z <= MAP;z++)
+ {
+ if(y[x][z] < 0)
+ y[x][z] /= 4.0f;
+ }
+
+ }
+
+ void makeTexture()
+ {
+ int i, j, h, c;
+ for(i = 0;i < WIDTH;i++)
+ {
+ for(j = 0;j < WIDTH;j++)
+ {
+ c = (int)(Math.random() * 15 + 240);
+ h = i * WIDTH * 4 + j * 4;
+ texImg[h + 0] = (byte)c;
+ texImg[h + 1] = (byte)c;
+ texImg[h + 2] = (byte)c;
+ texImg[h + 3] = (byte)255;
+ }
+ }
+ }
+
+ void check_height()
+ {
+ float x0, x1, lx, lz, x, z, midpoint;
+ int fx, fz;
+ x = (posx / (comp * 1.0f));
+ z = (posz / (comp * 1.0f));
+ fx = (int)(x);
+ fz = (int)(z);
+ lx = x - fx;
+ lz = z - fz;
+ if(fx >= MAP + 2 || fz >= MAP + 2 || fx < 0 || fz < 0)
+ {
+ init_pos();
+ return;
+ }
+ x0 = y[fx][fz] + (y[fx][fz + 1] - y[fx][fz]) * lz;
+ x1 = y[fx + 1][fz] + (y[fx + 1][fz + 1] - y[fx + 1][fz]) * lz;
+ midpoint = x0 + (x1 - x0) * lx;
+ posy = midpoint + 16.0f;
+ }
+
+ /* Function that moves the eye / turns the angle of sight. */
+ /* Updates scene if update. */
+ void myMove(int dir, float amount, boolean update, boolean fetchGLContext)
+ {
+ float diff = (float)Math.sqrt(lookx * lookx + lookz * lookz);
+ /*
+ float alpha = (float)
+ Math.atan(Math.abs(lookz)/Math.abs(lookx));
+ if(lookx<0&&lookz>=0)
+ alpha+=(float)(Math.PI/2.0);
+ else if(lookx>=0&&lookz>=0)
+ alpha+=0;
+ else if(lookx<0&&lookz<0)
+ alpha+=(float)Math.PI;
+ else if(lookx>=0&&lookz<0)
+ alpha+=(float)((3.0*Math.PI)/2.0);
+ float _alpha = (float) (alpha*180f/Math.PI );
+ */
+ boolean do_repaint = false;
+ lookx /= diff;
+ lookz /= diff;
+ //myDir=dir;
+ switch(dir)
+ {
+ case FORWARD:
+ posx += lookx * amount;
+ posz += lookz * amount;
+ break;
+ case TURNLEFT:
+ lookx = lookx * (float)Math.cos(amount) + lookz * (float)Math.sin(amount);
+ lookz = lookz * (float)Math.cos(amount) - lookx * (float)Math.sin(amount);
+ // lookx^2 + lookz^2 != 1 for some reason. Fix.
+ lookx /= diff;
+ lookz /= diff;
+ do_repaint = true;
+ break;
+ case STRAFELEFT:
+ posx += lookz * amount;
+ posz -= lookx * amount;
+ break;
+ case UP:
+ posy += amount;
+ do_repaint = true;
+ break;
+ case LOOKUP:
+ looky += amount;
+ do_repaint = true;
+ break;
+ case LOOKSET:
+ looky = amount;
+ do_repaint = true;
+ break;
+ }
+ int x = (int)(posx / (comp * 1.0f));
+ int z = (int)(posz / (comp * 1.0f));
+ if(x > MAP)
+ posx = 0;
+ if(z > MAP)
+ posz = 0;
+ if(posx < 0)
+ posx = MAP * comp;
+ if(posz < 0)
+ posz = MAP * comp;
+ if (update)
+ {
+ if(fetchGLContext && glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ gl.glMatrixMode(GL_MODELVIEW); gl.glLoadIdentity();
+ glu.gluLookAt(posx,posy,posz,
+ posx+lookx, posy+looky,
+ posz+lookz, 0.0f,1.0f,0.0f);
+
+ if(fetchGLContext)
+ glj.gljFree();
+
+ if( do_repaint )
+ repaint();
+ }
+ }
+
+ void draw_tree(int x, int z)
+ {
+ int x1, y1, z1;
+ y1 = (int)y[x][z];
+ x1 = x * comp;
+ z1 = z * comp;
+ gl.glBegin(GL_POLYGON);
+ gl.glColor3f(0.6f,0.4f,0.0f);
+ gl.glVertex3f(x1 - 2,y1 + 5,z1);
+ gl.glVertex3f(x1 + 2,y1 + 5,z1);
+ gl.glVertex3f(x1 + 2,y1,z1);
+ gl.glVertex3f(x1 - 2,y1,z1);
+ gl.glEnd();
+ gl.glBegin(GL_POLYGON);
+ gl.glVertex3f(x1,y1 + 5,z1 - 2);
+ gl.glVertex3f(x1,y1 + 5,z1 + 2);
+ gl.glVertex3f(x1,y1,z1 + 2);
+ gl.glVertex3f(x1,y1,z1 - 2);
+ gl.glEnd();
+ gl.glBegin(GL_POLYGON);
+ gl.glColor3f(0.35f,0.7f,0.0f);
+ gl.glTexCoord2f(0.0f,0.0f);
+ gl.glVertex3f(x1 - 10,y1 + 5,z1);
+ gl.glTexCoord2f(0.5f,1.0f);
+ gl.glVertex3f(x1,y1 + 25,z1);
+ gl.glTexCoord2f(1.0f,0.0f);
+ gl.glVertex3f(x1 + 10,y1 + 5,z1);
+ gl.glEnd();
+ gl.glBegin(GL_POLYGON);
+ gl.glColor3f(0.4f,0.8f,0.0f);
+ gl.glTexCoord2f(0.0f,0.0f);
+ gl.glVertex3f(x1,y1 + 5,z1 - 10);
+ gl.glTexCoord2f(0.5f,1.0f);
+ gl.glVertex3f(x1,y1 + 25,z1);
+ gl.glTexCoord2f(1.0f,0.0f);
+ gl.glVertex3f(x1,y1 + 5,z1 + 10);
+ gl.glEnd();
+ }
+
+ void genLand()
+ {
+ int x, z, position_x, position_z;
+ float x1, x2, z1, z2;
+
+ theLand = gl.glGenLists(1);
+ gl.glNewList(theLand, GL_COMPILE);
+
+ position_x = (int)(posx / comp);
+ position_z = (int)(posz / comp);
+ for(x = position_x - 16;x < position_x + 17;x++)
+ for(z = position_z - 16;z < position_z + 17;z++)
+ {
+ if(x > 0 && x < MAP && z > 0 && z < MAP)
+ {
+ x1 = x * comp;
+ x2 = x * comp + comp;
+ z1 = z * comp;
+ z2 = z * comp + comp;
+ gl.glBegin(GL_POLYGON);
+ gl.glColor3f(c[x][z].r,c[x][z].g,c[x][z].b);
+ gl.glTexCoord2f(0.0f,0.0f);
+ gl.glVertex3f(x1,y[x][z],z1);
+ gl.glColor3f(c[x + 1][z].r,c[x + 1][z].g,c[x + 1][z].b);
+ gl.glTexCoord2f(1.0f,0.0f);
+ gl.glVertex3f(x2,y[x + 1][z],z1);
+ gl.glColor3f(c[x][z + 1].r,c[x][z + 1].g,c[x][z + 1].b);
+ gl.glTexCoord2f(0.0f,1.0f);
+ gl.glVertex3f(x1,y[x][z + 1],z2);
+ gl.glEnd();
+ gl.glBegin(GL_POLYGON);
+ gl.glColor3f(c[x + 1][z + 1].r,c[x + 1][z + 1].g,c[x + 1][z + 1].b);
+ gl.glTexCoord2f(1.0f,1.0f);
+ gl.glVertex3f(x2,y[x + 1][z + 1],z2);
+ gl.glColor3f(c[x][z + 1].r,c[x][z + 1].g,c[x][z + 1].b);
+ gl.glTexCoord2f(0.0f,1.0f);
+ gl.glVertex3f(x1,y[x][z + 1],z2);
+ gl.glColor3f(c[x + 1][z].r,c[x + 1][z].g,c[x + 1][z].b);
+ gl.glTexCoord2f(1.0f,0.0f);
+ gl.glVertex3f(x2,y[x + 1][z],z1);
+ gl.glEnd();
+ if(object[x][z] == 't')
+ draw_tree(x,z);
+ }
+ }
+ gl.glEndList();
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int w, int h)
+ {
+ glj.gljResize(w,h);
+ gl.glViewport(0,0,w,h);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective(60.0,(double)w / (double)h,1.0,1000.0);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ glu.gluLookAt(posx,posy,posz,posx + lookx,posy + looky,posz + lookz,0.0,1.0,0.0);
+ }
+
+ public float getMySpeed()
+ {
+ return mySpeed;
+ }
+
+ public void setMySpeed(float s)
+ {
+ mySpeed = s;
+ }
+
+ public boolean getTextureState()
+ {
+ return texture_mapping == TRUE;
+ }
+
+ public void setTexture(boolean t)
+ {
+ if(t)
+ {
+ if(texture_mapping == FALSE)
+ {
+ if(glj!=null)
+ {
+ if(glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ gl.glEnable(GL_TEXTURE_2D);
+ texture_mapping = TRUE;
+ glj.gljCheckGL();
+ repaint();
+ }
+ }
+ }
+ else
+ {
+ if(texture_mapping == TRUE)
+ {
+ if(glj!=null)
+ {
+ if(glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ gl.glDisable(GL_TEXTURE_2D);
+ texture_mapping = FALSE;
+ glj.gljCheckGL();
+ repaint();
+ }
+ }
+ }
+ setSuspended(false);
+ }
+
+ public boolean getFogState()
+ {
+ return land_fogging == TRUE;
+ }
+
+ public void setFog(boolean t)
+ {
+ if(t)
+ {
+ if(land_fogging == FALSE)
+ {
+ if(glj!=null)
+ {
+ if(glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ gl.glEnable(GL_FOG);
+ land_fogging = TRUE;
+ glj.gljCheckGL();
+ repaint();
+ }
+ }
+ }
+ else
+ {
+ if(land_fogging == TRUE)
+ {
+ if(glj!=null)
+ {
+ if(glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ gl.glDisable(GL_FOG);
+ land_fogging = FALSE;
+ glj.gljCheckGL();
+ repaint();
+ }
+ }
+ }
+ setSuspended(false);
+ }
+
+ public boolean getFlatShadeState()
+ {
+ return flat_shading == TRUE;
+ }
+
+ public void setFlatShading(boolean t)
+ {
+ if(t)
+ {
+ if(flat_shading == FALSE)
+ {
+ if(glj!=null)
+ {
+ if(glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ gl.glShadeModel(GL_FLAT);
+ flat_shading = TRUE;
+ glj.gljCheckGL();
+ repaint();
+ }
+ }
+ }
+ else
+ {
+ if(flat_shading == TRUE)
+ {
+ if(glj!=null)
+ {
+ if(glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ gl.glShadeModel(GL_SMOOTH);
+ flat_shading = FALSE;
+ glj.gljCheckGL();
+ repaint();
+ }
+ }
+ }
+ setSuspended(false);
+ }
+
+ public void newFractal()
+ {
+ create_fractal();
+ if(!cvsIsInit() || glj.gljMakeCurrent() == false)
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+ gl.glFinish();
+ gl.glDeleteLists(theLand, 1);
+ genLand();
+ check_height();
+ repaint();
+ setSuspended(false);
+ }
+
+}
+
diff --git a/demos/GLLandScape/GLLandScape1w1Applet$SpeedTimer b/demos/GLLandScape/GLLandScape1w1Applet$SpeedTimer
new file mode 100644
index 0000000..81e347a
--- /dev/null
+++ b/demos/GLLandScape/GLLandScape1w1Applet$SpeedTimer
Binary files differ
diff --git a/demos/GLLandScape/GLLandScape1w1Applet.java b/demos/GLLandScape/GLLandScape1w1Applet.java
new file mode 100755
index 0000000..90da5f3
--- /dev/null
+++ b/demos/GLLandScape/GLLandScape1w1Applet.java
@@ -0,0 +1,416 @@
+
+import gl4java.GLContext;
+import java.awt.*;
+import java.applet.*;
+import java.awt.event.*;
+
+public class GLLandScape1w1Applet extends Applet
+ implements MouseListener, KeyListener, ActionListener
+{
+ GLLandScape1w1 landScape = null;
+
+ Button bAddPlane = null;
+ Button bRemPlane = null;
+ Button bTexture = null;
+ Button bShading = null;
+ Button bFog = null;
+ Button bNewFractal = null;
+ Button bInfo = null;
+
+ Button bFps; TextField tFps;
+
+ boolean gameOn = true;
+
+ SpeedTimer tMySpeed = null;
+
+ public void init()
+ {
+ init(0,0);
+ }
+
+ public void init(int w, int h)
+ {
+ super.init();
+
+ setLayout(new BorderLayout());
+
+ Panel glFeatures = new Panel();
+ glFeatures.setLayout(new GridLayout(6,1));
+ glFeatures.add(bAddPlane =new Button("+ Plane"));
+ glFeatures.add(bRemPlane =new Button("- Plane"));
+ glFeatures.add(bTexture =new Button("Texture"));
+ glFeatures.add(bShading =new Button("Shading"));
+ glFeatures.add(bFog =new Button("Fogging"));
+ glFeatures.add(bNewFractal =new Button("Fractal"));
+ bAddPlane.addMouseListener(this);
+ bRemPlane.addMouseListener(this);
+ bTexture.addMouseListener(this);
+ bShading.addMouseListener(this);
+ bFog.addMouseListener(this);
+ bNewFractal.addMouseListener(this);
+ add("East", glFeatures);
+
+ Panel pFps = new Panel();
+ pFps.setLayout(new GridLayout(1,3));
+ pFps.add(bInfo =new Button("info"));
+ pFps.add(bFps =new Button("get fps"));
+ pFps.add(tFps =new TextField());
+ bInfo.addMouseListener(this);
+ bFps.addMouseListener(this);
+ tFps.addActionListener(this);
+ add("South", pFps);
+
+ if(w==0 && h==0)
+ {
+ Dimension d = getSize();
+ landScape= new GLLandScape1w1(d.width, d.height);
+ } else {
+ landScape= new GLLandScape1w1(w, h);
+ }
+ landScape.setAnimateFps(30.0);
+ landScape.addMouseListener(this);
+ landScape.addKeyListener(this);
+
+ tMySpeed = new SpeedTimer(landScape, 200);
+
+ landScape.requestFocus();
+ landScape.setMySpeed(0);
+
+ add("Center", landScape);
+ }
+
+ public void destroy()
+ {
+ landScape.stop();
+ landScape.cvsDispose();
+ landScape.removeMouseListener(this);
+ landScape.removeKeyListener(this);
+ }
+
+ public void start()
+ {
+ landScape.start();
+ }
+
+ public void stop()
+ {
+ landScape.stop();
+ }
+
+ public static void main( String args[] ) {
+ String gljLib=null;
+ String glLib=null;
+ String gluLib=null;
+
+ if(args.length>0)
+ gljLib = args[0];
+ if(args.length>1)
+ glLib = args[1];
+ if(args.length>2)
+ gluLib = args[2];
+
+ if(GLContext.loadNativeLibraries(gljLib, glLib, gluLib)==false)
+ System.out.println("GLCanvasV2 could not load native libs:"+
+ gljLib + ", " + glLib + ", " + gluLib);
+
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+
+ GLLandScape1w1Applet window =
+ new GLLandScape1w1Applet();
+
+ Frame f = new Frame();
+
+ f.addWindowListener( new WindowAdapter()
+ {
+ public void windowClosed(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ public void windowClosing(WindowEvent e)
+ {
+ windowClosed(e);
+ }
+ }
+ );
+
+ f.setLayout(new BorderLayout());
+ f.add("Center", window);
+ window.init(500,300);
+ window.start();
+ Dimension ps = window.getPreferredSize();
+ f.setBounds(-100,-100,99,99);
+ f.setVisible(true);
+ f.setVisible(false);
+ Insets i = f.getInsets();
+ f.setBounds(0,0,
+ ps.width+i.left+i.right,
+ ps.height+i.top+i.bottom);
+ f.setVisible(true);
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(landScape ) )
+ {
+ landScape.requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ }
+ public void mouseReleased( MouseEvent evt ) {
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+
+ if( comp.equals(bAddPlane ) )
+ landScape.addPlane();
+ else if( comp.equals(bRemPlane ) )
+ landScape.removePlane();
+ else if( comp.equals(bTexture ) )
+ landScape.setTexture( ! landScape.getTextureState());
+ else if( comp.equals(bNewFractal ) )
+ landScape.newFractal();
+ else if( comp.equals(bShading ) )
+ landScape.setFlatShading(!landScape.getFlatShadeState());
+ else if( comp.equals(bFog ) )
+ landScape.setFog( ! landScape.getFogState());
+ else if( comp.equals(landScape) )
+ landScape.setSuspended(false);
+ else if( comp.equals(bFps) )
+ {
+ double fps = 0;
+
+ landScape.stopFpsCounter();
+ fps=landScape.getFps();
+ tFps.setText(String.valueOf(fps));
+ landScape.resetFpsCounter();
+ }
+ else if( comp.equals(bInfo) )
+ {
+ InfoWin iw = new InfoWin();
+ }
+ }
+
+
+ public void keyTyped(KeyEvent e)
+ {
+ }
+
+ public void keyPressed(KeyEvent e)
+ {
+ int key = e.getKeyCode();
+
+ if( gameOn==true )
+ {
+ if ( key==KeyEvent.VK_LEFT )
+ {
+ landScape.myMove(landScape.TURNLEFT, 0.1f, true, true);
+ tMySpeed.start();
+ }
+ else if ( key==KeyEvent.VK_RIGHT )
+ {
+ landScape.myMove(landScape.TURNLEFT, -0.1f, true, true);
+ tMySpeed.start();
+ }
+ else if ( key==KeyEvent.VK_UP )
+ {
+ float v = tMySpeed.getSpeed();
+
+ if ( e.isShiftDown() )
+ {
+ tMySpeed.setSpeed(v+2.0f);
+ }
+ else {
+ tMySpeed.setSpeed(v+1.0f);
+ }
+ tMySpeed.start();
+ }
+ else if ( key==KeyEvent.VK_DOWN )
+ {
+ float v = tMySpeed.getSpeed();
+
+ if ( e.isShiftDown() )
+ tMySpeed.setSpeed(v/2.0f);
+ else
+ tMySpeed.setSpeed(v-1.0f);
+ tMySpeed.start();
+ }
+ else if ( key==KeyEvent.VK_PAGE_UP )
+ {
+ landScape.myMove(landScape.LOOKUP, 0.1f, true,true);
+ tMySpeed.start();
+ }
+ else if ( key==KeyEvent.VK_PAGE_DOWN )
+ {
+ landScape.myMove(landScape.LOOKUP, -0.1f, true,true);
+ tMySpeed.start();
+ }
+ else if ( key==KeyEvent.VK_END )
+ {
+ landScape.myMove(landScape.LOOKSET, 0f, true,true);
+ tMySpeed.start();
+ }
+ }
+ }
+
+ public void keyReleased(KeyEvent e)
+ {
+ int key = e.getKeyCode();
+
+ if( gameOn==true &&
+ ( key==KeyEvent.VK_UP ||
+ key==KeyEvent.VK_DOWN
+ )
+ )
+ {
+ //ts.start();
+ }
+ else if( gameOn==true &&
+ ( key==KeyEvent.VK_LEFT ||
+ key==KeyEvent.VK_RIGHT
+ )
+ )
+ {
+ //landScape.noMySpeed();
+ }
+ }
+
+ public void actionPerformed(ActionEvent event)
+ {
+ Object source = event.getSource();
+
+ if ( source == tFps )
+ {
+ try {
+ double FramesPerSec=
+ Double.valueOf(tFps.getText()).doubleValue();
+ landScape.setAnimateFps(FramesPerSec);
+ landScape.setSuspended(false);
+ } catch (NumberFormatException s) {
+ System.out.println("wrong fps format, use float ..");
+ }
+
+ }
+ }
+
+ class SpeedTimer implements Runnable {
+ protected Thread me = null;
+ protected boolean to=false, started=false;
+ protected int _t;
+
+ protected float speed = 0.0f;
+ protected GLLandScape1w1 _ls;
+
+ public SpeedTimer(GLLandScape1w1 ls, int t)
+ { _ls=ls; _t=t; }
+
+ public void start()
+ {
+ if(me!=null) stop();
+ to=false;
+ started=true;
+
+ me = new Thread(this);
+ me.start();
+ }
+
+ public void stop() {
+ if(me!=null)
+ {
+ me.stop();
+ me=null;
+ started=false;
+ to=false;
+ }
+ }
+
+ public void run() {
+ if(me!=null)
+ {
+ try {me.sleep(_t,0);} catch (InterruptedException e){}
+ to=true;
+ while(speed>1.0f)
+ {
+ speed/=2.0f;
+ _ls.setMySpeed(speed);
+ try {me.sleep(_t,0);} catch (InterruptedException e){}
+ }
+ speed = 0.0f;
+ _ls.setMySpeed(0f);
+ }
+ }
+
+ public boolean isActive() { return to; }
+ public boolean isStarted() { return started; }
+
+ public float getSpeed() { return speed; }
+ public void setSpeed(float v)
+ { speed=v;
+ _ls.setMySpeed(speed);
+ }
+
+ }
+
+ class InfoWin extends Frame
+ implements ActionListener
+ {
+ protected Button DismissButton;
+
+ String text =
+ "GLLandScape1w1 V 1.0\n"+
+ "by Sven Goethel\n"+
+ "\thttp://www.jausoft.com/gl4java.html\n"+
+ "\tmailto:[email protected]\n\n"+
+ "The original sources for the lanscape algorythms,\n"+
+ "are taken from Nicholas Anderson's Landscape V1.0 !\n"+
+ "\thttp://www.fortunecity.com/skyscraper/online/263\n"+
+ "\tmailto:[email protected]\n\n"+
+ "usage:\n"+
+ "\t ARROW-UP : accelerate\n"+
+ "\t ARROW-UP + SHIFT : accelerate fast \n"+
+ "\t ARROW-DOWN : de-accelerate\n"+
+ "\t ARROW-DOWN + SHIFT : de-accelerate fast\n"+
+ "\t ARROW-LEFT : turn left\n"+
+ "\t ARROW-right : turn right\n"+
+ "\t PAGE-UP : look-up\n"+
+ "\t PAGE-DOWN : look-down\n"+
+ "\t END : look normal\n\n"+
+ "Have a lot of fun - Sven Goethel\n";
+
+ public InfoWin()
+ {
+ setTitle("INFO");
+ setName("INFO");
+
+ setLayout(new BorderLayout());
+ add("Center", new TextArea(text, 25, 50));
+
+ add("South", DismissButton = new Button("dismiss"));
+ DismissButton.addActionListener(this);
+
+ pack();
+ setVisible(true);
+
+ toFront();
+ }
+
+ public void actionPerformed(ActionEvent event) {
+ if ( event.getSource() == DismissButton)
+ {
+ setVisible(false);
+ dispose();
+ }
+ }
+ }
+}
diff --git a/demos/GLLandScape/GLLandScape1w1_plugin13.html b/demos/GLLandScape/GLLandScape1w1_plugin13.html
new file mode 100644
index 0000000..32ab0bf
--- /dev/null
+++ b/demos/GLLandScape/GLLandScape1w1_plugin13.html
@@ -0,0 +1,46 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 500 HEIGHT = 300 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "GLLandScape1w1Applet.class" WIDTH = 500 HEIGHT = 300 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "GLLandScape1w1Applet.class" WIDTH = 500 HEIGHT = 300></XMP>
+<PARAM NAME = CODE VALUE = "GLLandScape1w1Applet.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "GLLandScape1w1Applet.class" WIDTH = 500 HEIGHT = 300>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/GLLandScape/GlutPlaneObj.java b/demos/GLLandScape/GlutPlaneObj.java
new file mode 100644
index 0000000..3b449a7
--- /dev/null
+++ b/demos/GLLandScape/GlutPlaneObj.java
@@ -0,0 +1,112 @@
+/**
+ * @(#) glutplane.java
+ * @(#) author: Mark J. Kilgard (converted to Java by Ron Cemer)
+ */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.GLFunc;
+import gl4java.GLUFunc;
+import gl4java.GLEnum;
+import gl4java.GLUEnum;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class GlutPlaneObj
+ implements GLEnum, GLUEnum
+{
+ float speed = 0.0f; /* zero speed means not flying */
+ float red = 0.0f, green = 0.0f, blue = 0.0f;
+ float theta = 0.0f;
+ public float x = 0.0f, y = 0.0f, z = 0.0f, angle = 0.0f;
+
+ public void setPosition(float x, float y, float z)
+ {
+ this.x=x;
+ this.y=y;
+ this.z=z;
+ }
+
+
+ public void setColor(float r, float g, float b)
+ {
+ red = r;
+ green = g;
+ blue = b;
+ }
+
+
+ private final double M_PI = 3.14159265;
+ private final double M_PI_2 = 1.57079632;
+
+ GLFunc gl;
+ GLUFunc glu;
+
+ public GlutPlaneObj(GLFunc gl, GLUFunc glu)
+ {
+ this.gl=gl;
+ this.glu=glu;
+ }
+
+ public void display()
+ {
+
+ if (speed != 0.0f)
+ {
+ tick();
+ // System.out.println("plane: ("+x+"/"+y+"/"+z+")");
+ gl.glPushMatrix();
+ gl.glTranslatef(x, y, z);
+ gl.glRotatef(290.0f, 1.0f, 0.0f, 0.0f);
+ gl.glRotatef(angle, 0.0f, 0.0f, 1.0f);
+ // gl.glScalef(1.0f / 3.0f, 1.0f / 4.0f, 1.0f / 4.0f);
+ gl.glScalef(5.0f, 5.0f, 5.0f);
+ gl.glTranslatef(0.0f, -4.0f, -1.5f);
+ gl.glBegin(GL_TRIANGLE_STRIP);
+ /* left wing */
+ gl.glVertex3f(-7.0f, 0.0f, 2.0f);
+ gl.glVertex3f(-1.0f, 0.0f, 3.0f);
+ gl.glColor3f(red,green,blue);
+ gl.glVertex3f(-1.0f, 7.0f, 3.0f);
+ /* left side */
+ gl.glColor3f(0.6f * red, 0.6f * green, 0.6f * blue);
+ gl.glVertex3f(0.0f, 0.0f, 0.0f);
+ gl.glVertex3f(0.0f, 8.0f, 0.0f);
+ /* right side */
+ gl.glVertex3f(1.0f, 0.0f, 3.0f);
+ gl.glVertex3f(1.0f, 7.0f, 3.0f);
+ /* final tip of right wing */
+ gl.glColor3f(red, green, blue);
+ gl.glVertex3f(7.0f, 0.0f, 2.0f);
+ gl.glEnd();
+ gl.glPopMatrix();
+ }
+ }
+
+ public void tick()
+ {
+ /*
+ posx = 4500.0f;
+ posy = 256.0f;
+ posz = 4500.0f;
+ */
+ theta += speed;
+ z = 4500.0f + 600.0f * (float)Math.cos(theta);
+ x = 4500.0f + 600.0f * (float)Math.sin(2.0f * theta);
+ y = 280.0f + (float)Math.sin(theta / 3.4f) * 20.0f;
+ angle = (float)
+ (((Math.atan(2.0) + M_PI_2) * Math.sin(theta) - M_PI_2) *
+ 180.0 / M_PI);
+ if (speed < 0.0f) angle += 180.0f;
+ }
+}
diff --git a/demos/GLLandScape/LICENSE.txt b/demos/GLLandScape/LICENSE.txt
new file mode 100644
index 0000000..9611410
--- /dev/null
+++ b/demos/GLLandScape/LICENSE.txt
@@ -0,0 +1,36 @@
+GLLandScape - A landscape generator, where you can walk through - uses GL4Java
+
+Copyright (C) 1999 Sven Goethel
+
+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., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+
+You can also check the GNU Library General Public License
+in the internet at http://www.gnu.org/copyleft/lgpl.html !
+
+If you like to contact the author use:
+
+Sven Goethel, Elpke 5, 33605 Bielefeld, Germany
+web : http://www.jausoft.com
+voice: +49-521-2399440
+fax : +49-521-2399442
+
+The landscape algorythms are taken from Nicholas Anderson's Landscape V1.0 !
+ http://www.fortunecity.com/skyscraper/online/263
+Those parts are still under the Copyright (C) of Nicholas Anderson !
+
+Sven Goethel, 15 January 1999
diff --git a/demos/GLLandScape/index.html b/demos/GLLandScape/index.html
new file mode 100644
index 0000000..2efada2
--- /dev/null
+++ b/demos/GLLandScape/index.html
@@ -0,0 +1,52 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Ron Cemer & Sven Goethel">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>GL4Java Landscape World</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<p>The GLLandScape World</p><BR>
+Paperplanes are flying arround a landscape !<br>
+<I>Thanxs to </I>
+<A HREF="http://pages.eidosnet.co.uk/~n.anderson/index.html">
+<I>Nicholas Anderson</I></A>
+<I> for ANSI-C sources of Landscape V1.0</I>
+<br>
+<br>
+Use the keybord's cursor keys to move arround.<br>
+The page up and down keys are used to look up and down.<br>
+This all is done to move like in Quake.<br>
+<br>
+<p>&nbsp;<a href="GLLandScape1.html">GLLandScape</a>
+: a LandScape V1 at 500x300
+<p>&nbsp;<a href="GLLandScape1-big.html">GLLandScape BIG</a>
+: a LandScape V1 at 800x600
+<p>&nbsp;<a href="GLLandScape1w1.html">GLLandScape-World</a>
+: a LandScape World V1 at 500x300
+<p>&nbsp;<a href="GLLandScape1w1-big.html">GLLandScape-World BIG</a>
+: a LandScape World V1 at 800x600
+<br>&nbsp;
+<br>
+<hr>
+<P ALIGN=CENTER><SPAN STYLE="text-decoration: none"><I>For use with
+the Java2-Plug-In: Tested with Win32,Netscape,Java2 <A HREF="Java2.txt">(see
+Installation-instructions Java2)</A> ! </I></SPAN><br>
+<br>&nbsp;
+<a href="../../Installer/java.policy">The Java2 (sdk, jre, plugin 1.3) policy file example to give GL4Java the necessary permissions (Click here) !</a>
+<br>&nbsp;
+</P>
+<p>&nbsp;<a href="GLLandScape1_plugin13.html">GLLandScape</a>
+: a LandScape V1 at 500x300
+<p>&nbsp;<a href="GLLandScape1-big_plugin13.html">GLLandScape BIG</a>
+: a LandScape V1 at 800x600
+<p>&nbsp;<a href="GLLandScape1w1_plugin13.html">GLLandScape-World</a>
+: a LandScape World V1 at 500x300
+<p>&nbsp;<a href="GLLandScape1w1-big_plugin13.html">GLLandScape-World BIG</a>
+: a LandScape World V1 at 800x600
+<br>&nbsp;
+<br>
+<hr>
+</body>
+</html>
diff --git a/demos/HodglimsNeHe/Lesson1.html b/demos/HodglimsNeHe/Lesson1.html
new file mode 100644
index 0000000..1c73238
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson1.html
@@ -0,0 +1,35 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson1 Applet: Setting Up OpenGL In Windows</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Setting Up OpenGL In Windows</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<APPLET CODE="Lesson1.class" WIDTH="400" HEIGHT="400">
+</APPLET>
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson1.java b/demos/HodglimsNeHe/Lesson1.java
new file mode 100644
index 0000000..fb05de2
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson1.java
@@ -0,0 +1,261 @@
+/**
+ * Lesson1.java
+ *
+ * Author: Darren Hodges
+ * Date: 16/12/1999
+ *
+ * Port of the NeHe OpenGL Tutorial (Lesson 1: "Setting Up OpenGL In Windows")
+ * to Java using the GL4Java interface to OpenGL.
+ * Although the title "Setting Up OpenGL In Windows" doesn't really apply
+ * to Java because it is a multi-platform language.
+ *
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+
+//GL4Java classes
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+
+
+public class Lesson1 extends Applet
+{
+ //Our rendering canvas
+ //We are using GLAnimCanvas because we want the canvas
+ //to be constantly redrawn
+ renderCanvas canvas = null;
+
+
+ /**
+ * void init()
+ *
+ * Initialise the applet.
+ */
+ public void init()
+ {
+ //We will use BorderLayout to layout the applet components
+ setLayout(new BorderLayout());
+
+ //Create our canvas and add it to the center of the applet
+ canvas = new renderCanvas(getSize().width, getSize().height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /**
+ * void start()
+ *
+ * Start the applet.
+ */
+ public void start()
+ {
+ //Start animating the canvas
+ canvas.start();
+ }
+
+
+ /**
+ * void stop()
+ *
+ * Stop the applet.
+ */
+ public void stop()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the applet.
+ */
+ public void destroy()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ //Destroy the canvas
+ canvas.destroy();
+ }
+
+
+
+ private class renderCanvas extends GLAnimCanvas
+ implements KeyListener, MouseListener
+ {
+ /**
+ * renderCanvas(int w, int h)
+ *
+ * Constructor.
+ */
+ public renderCanvas(int w, int h)
+ {
+ super(w, h);
+
+ //Registers this canvas to process keyboard events
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+
+ /**
+ * void preInit()
+ *
+ * Called just BEFORE the GL-Context is created.
+ */
+ public void preInit()
+ {
+ //We want double buffering
+ doubleBuffer = true;
+ //But we dont want stereo view
+ stereoView = false;
+ }
+
+
+ /**
+ * void init()
+ *
+ * Called just AFTER the GL-Context is created.
+ */
+ public void init()
+ {
+ //This Will Clear The Background Color To Black
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ //Enables Clearing Of The Depth Buffer
+ gl.glClearDepth(1.0);
+ //The Type Of Depth Test To Do
+ gl.glDepthFunc(GL_LESS);
+ //Enables Depth Testing
+ gl.glEnable(GL_DEPTH_TEST);
+
+ //Enables Smooth Color Shading
+ gl.glShadeModel(GL_SMOOTH);
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the canvas.
+ */
+ public void destroy()
+ {
+ //Destroy the GLContext
+ cvsDispose();
+ }
+
+
+ /**
+ * void reshape(int width, int height)
+ *
+ * Called after the first paint command.
+ */
+ public void reshape(int width, int height)
+ {
+ //Reset The Current Viewport And Perspective Transformation
+ gl.glViewport(0, 0, width, height);
+
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void display()
+ *
+ * Draw to the canvas.
+ */
+ public void display()
+ {
+ //Ensure GL is initialised correctly
+ if (glj.gljMakeCurrent(true) == false)
+ return;
+
+ //Clear The Screen And The Depth Buffer
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ //Reset The View
+ gl.glLoadIdentity();
+
+ //Swap buffers
+ glj.gljSwap();
+ }
+
+
+ /**
+ * void keyTyped(KeyEvent e)
+ *
+ * Invoked when a key has been typed. This event occurs when a key press is followed by a key release.
+ */
+ public void keyTyped(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+
+ /**
+ * void keyPressed(KeyEvent e)
+ *
+ * Invoked when a key has been pressed.
+ */
+ public void keyPressed(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+
+ /**
+ * void keyReleased(KeyEvent e)
+ *
+ * Invoked when a key has been released.
+ */
+ public void keyReleased(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ }
+}
diff --git a/demos/HodglimsNeHe/Lesson11.html b/demos/HodglimsNeHe/Lesson11.html
new file mode 100644
index 0000000..7976c3c
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson11.html
@@ -0,0 +1,35 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson11 Applet: OpenGL Flag Effect</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>OpenGL Flag Effect</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<APPLET CODE="Lesson11.class" WIDTH="400" HEIGHT="400">
+</APPLET>
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson11.java b/demos/HodglimsNeHe/Lesson11.java
new file mode 100644
index 0000000..ad566ee
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson11.java
@@ -0,0 +1,382 @@
+/**
+ * Lesson11.java
+ *
+ * Author: Darren Hodges
+ * Date: 23/12/1999
+ *
+ * Port of the NeHe OpenGL Tutorial (Lesson 11: "OpenGL Flag Effect")
+ * to Java using the GL4Java interface to OpenGL.
+ *
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+
+//GL4Java classes
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.utils.textures.*;
+
+
+public class Lesson11 extends Applet
+{
+ //Our rendering canvas
+ //We are using GLAnimCanvas because we want the canvas
+ //to be constantly redrawn
+ renderCanvas canvas = null;
+
+
+ /**
+ * void init()
+ *
+ * Initialise the applet.
+ */
+ public void init()
+ {
+ //We will use BorderLayout to layout the applet components
+ setLayout(new BorderLayout());
+
+ //Create our canvas and add it to the center of the applet
+ canvas = new renderCanvas(getSize().width, getSize().height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /**
+ * void start()
+ *
+ * Start the applet.
+ */
+ public void start()
+ {
+ //Start animating the canvas
+ canvas.start();
+ }
+
+
+ /**
+ * void stop()
+ *
+ * Stop the applet.
+ */
+ public void stop()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the applet.
+ */
+ public void destroy()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ //Destroy the canvas
+ canvas.destroy();
+ }
+
+
+
+ private class renderCanvas extends GLAnimCanvas
+ implements KeyListener, MouseListener
+ {
+ float xrot = 0.0f; //X Rotation
+ float yrot = 0.0f; //Y Rotation
+ float zrot = 0.0f; //Z Rotation
+
+ //The array for the points on the grid of our "wave"
+ float[][][] points = new float[45][45][3];
+
+ int wiggle_count = 0;
+
+ int[] texture = new int[1]; //Storage for one texture
+
+
+ /**
+ * renderCanvas(int w, int h)
+ *
+ * Constructor.
+ */
+ public renderCanvas(int w, int h)
+ {
+ super(w, h);
+
+ //Registers this canvas to process keyboard events
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+
+ /**
+ * void preInit()
+ *
+ * Called just BEFORE the GL-Context is created.
+ */
+ public void preInit()
+ {
+ //We want double buffering
+ doubleBuffer = true;
+ //But we dont want stereo view
+ stereoView = false;
+ }
+
+
+ /**
+ * void LoadGLTextures()
+ *
+ * Load textures.
+ */
+ public void LoadGLTextures()
+ {
+ PngTextureLoader texLoader = new PngTextureLoader(gl, glu);
+ texLoader.readTexture(getCodeBase(), "data/tim.png");
+
+ if(texLoader.isOk())
+ {
+ //Create Texture
+ gl.glGenTextures(1, texture);
+ gl.glBindTexture(GL_TEXTURE_2D, texture[0]);
+
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ gl.glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(),
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+ }
+ }
+
+
+ /**
+ * void init()
+ *
+ * Called just AFTER the GL-Context is created.
+ */
+ public void init()
+ {
+ //Load The Texture(s)
+ LoadGLTextures();
+ //Enable Texture Mapping
+ gl.glEnable(GL_TEXTURE_2D);
+
+ //This Will Clear The Background Color To Black
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ //Enables Clearing Of The Depth Buffer
+ gl.glClearDepth(1.0);
+ //The Type Of Depth Test To Do
+ gl.glDepthFunc(GL_LESS);
+ //Enables Depth Testing
+ gl.glEnable(GL_DEPTH_TEST);
+
+ //Enables Smooth Color Shading
+ gl.glShadeModel(GL_SMOOTH);
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+
+
+ for(float float_x = 0.0f; float_x < 9.0f; float_x += 0.2f)
+ {
+ for(float float_y = 0.0f; float_y < 9.0f; float_y += 0.2f)
+ {
+ points[(int)(float_x * 5)][(int)(float_y * 5)][0] = float_x - 4.4f;
+ points[(int)(float_x * 5)][(int)(float_y * 5)][1] = float_y - 4.4f;
+ points[(int)(float_x * 5)][(int)(float_y * 5)][2] = (float)(Math.sin(((float_x * 5 * 8) / 360) * 3.14159 * 2));
+ }
+ }
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the canvas.
+ */
+ public void destroy()
+ {
+ //Destroy the GLContext
+ cvsDispose();
+ }
+
+
+ /**
+ * void reshape(int width, int height)
+ *
+ * Called after the first paint command.
+ */
+ public void reshape(int width, int height)
+ {
+ //Reset The Current Viewport And Perspective Transformation
+ gl.glViewport(0, 0, width, height);
+
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void display()
+ *
+ * Draw to the canvas.
+ */
+ public void display()
+ {
+ //Ensure GL is initialised correctly
+ if (glj.gljMakeCurrent(true) == false)
+ return;
+
+ int x, y;
+ float float_x, float_y, float_xb, float_yb;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gl.glLoadIdentity();
+ gl.glTranslatef(0.0f, 0.0f, -15.0f);
+
+ gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);
+ gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);
+ gl.glRotatef(zrot, 0.0f, 0.0f, 1.0f);
+
+ gl.glBindTexture(GL_TEXTURE_2D, texture[0]);
+
+ gl.glPolygonMode(GL_BACK, GL_FILL);
+ gl.glPolygonMode(GL_FRONT, GL_LINE);
+
+ gl.glBegin(GL_QUADS);
+
+ for(x = 0; x < 44; x++)
+ {
+ for(y = 0; y < 44; y++)
+ {
+ float_x = (float)x / 44;
+ float_y = (float)y / 44;
+ float_xb = (float)(x + 1) / 44;
+ float_yb = (float)(y + 1) / 44;
+
+ gl.glTexCoord2f(float_x, float_y);
+ gl.glVertex3f(points[x][y][0], points[x][y][1], points[x][y][2]);
+
+ gl.glTexCoord2f(float_x, float_yb);
+ gl.glVertex3f(points[x][y + 1][0], points[x][y + 1][1], points[x][y + 1][2]);
+
+ gl.glTexCoord2f(float_xb, float_yb);
+ gl.glVertex3f(points[x + 1][y + 1][0], points[x + 1][y + 1][1], points[x + 1][y + 1][2]);
+
+ gl.glTexCoord2f(float_xb, float_y);
+ gl.glVertex3f(points[x + 1][y][0], points[x + 1][y][1], points[x + 1][y][2]);
+ }
+ }
+
+ gl.glEnd();
+
+ if(wiggle_count == 2)
+ {
+ for(y = 0; y < 45; y++)
+ {
+ points[44][y][2] = points[0][y][2];
+ }
+
+ for(x = 0; x < 44; x++)
+ {
+ for(y = 0; y < 45; y++)
+ {
+ points[x][y][2] = points[x + 1][y][2];
+ }
+ }
+
+ wiggle_count = 0;
+ }
+
+ wiggle_count++;
+
+ xrot += 0.3f;
+ yrot += 0.2f;
+ zrot += 0.4f;
+
+ //Swap buffers
+ glj.gljSwap();
+ }
+
+
+ /**
+ * void keyTyped(KeyEvent e)
+ *
+ * Invoked when a key has been typed. This event occurs when a key press is followed by a key release.
+ */
+ public void keyTyped(KeyEvent e)
+ {
+ //We are not handling any keyboard events
+ }
+
+
+ /**
+ * void keyPressed(KeyEvent e)
+ *
+ * Invoked when a key has been pressed.
+ */
+ public void keyPressed(KeyEvent e)
+ {
+ //We are not handling any keyboard events
+ }
+
+
+ /**
+ * void keyReleased(KeyEvent e)
+ *
+ * Invoked when a key has been released.
+ */
+ public void keyReleased(KeyEvent e)
+ {
+ //We are not handling any keyboard events
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ }
+}
diff --git a/demos/HodglimsNeHe/Lesson11_plugin13.html b/demos/HodglimsNeHe/Lesson11_plugin13.html
new file mode 100644
index 0000000..28737f8
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson11_plugin13.html
@@ -0,0 +1,66 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson11 Applet: OpenGL Flag Effect</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>OpenGL Flag Effect</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = "400" HEIGHT = "400" codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "Lesson11.class" WIDTH = "400" HEIGHT = "400" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "Lesson11.class" WIDTH = "400" HEIGHT = "400"></XMP>
+<PARAM NAME = CODE VALUE = "Lesson11.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "Lesson11.class" WIDTH = "400" HEIGHT = "400">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson12.html b/demos/HodglimsNeHe/Lesson12.html
new file mode 100644
index 0000000..037b1d6
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson12.html
@@ -0,0 +1,46 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson12 Applet: Display Lists</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Display Lists</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana"><B><U>Keys</U></B></FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<B>UP</B> - Rotate up<BR>
+<B>DOWN</B> - Rotate down<BR>
+<B>LEFT</B> - Rotate left<BR>
+<B>RIGHT</B> - Rotate right
+</FONT>
+</P>
+<P><FONT SIZE="1" FACE="Verdana"><B>Note:</B> You must click inside the applet window before using these keys.</FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<APPLET CODE="Lesson12.class" WIDTH="400" HEIGHT="400">
+</APPLET>
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson12.java b/demos/HodglimsNeHe/Lesson12.java
new file mode 100644
index 0000000..86a9f02
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson12.java
@@ -0,0 +1,437 @@
+/**
+ * Lesson12.java
+ *
+ * Author: Darren Hodges
+ * Date: 05/01/2000
+ *
+ * Port of the NeHe OpenGL Tutorial (Lesson 12: "Display Lists")
+ * to Java using the GL4Java interface to OpenGL.
+ *
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+
+//GL4Java classes
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.utils.textures.*;
+
+
+public class Lesson12 extends Applet
+{
+ //Our rendering canvas
+ //We are using GLAnimCanvas because we want the canvas
+ //to be constantly redrawn
+ renderCanvas canvas = null;
+
+
+ /**
+ * void init()
+ *
+ * Initialise the applet.
+ */
+ public void init()
+ {
+ //We will use BorderLayout to layout the applet components
+ setLayout(new BorderLayout());
+
+ //Create our canvas and add it to the center of the applet
+ canvas = new renderCanvas(getSize().width, getSize().height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /**
+ * void start()
+ *
+ * Start the applet.
+ */
+ public void start()
+ {
+ //Start animating the canvas
+ canvas.start();
+ }
+
+
+ /**
+ * void stop()
+ *
+ * Stop the applet.
+ */
+ public void stop()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the applet.
+ */
+ public void destroy()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ //Destroy the canvas
+ canvas.destroy();
+ }
+
+
+
+ private class renderCanvas extends GLAnimCanvas
+ implements KeyListener, MouseListener
+ {
+ int[] texture = new int[1]; //Storage for one texture
+
+ int cube = 0; //Storage For The Display List
+ int top = 0; //Storage For The Second Display List
+ int xloop = 0; //Loop For X Axis
+ int yloop = 0; //Loop For Y Axis
+
+ float xrot = 0.0f; //X Rotation
+ float yrot = 0.0f; //Y Rotation
+
+ //Box colours
+ float boxcol[][] =
+ {
+ {1.0f,0.0f,0.0f},{1.0f,0.5f,0.0f},{1.0f,1.0f,0.0f},{0.0f,1.0f,0.0f},{0.0f,1.0f,1.0f}
+ };
+
+ //Box top colours
+ float topcol[][] =
+ {
+ {0.5f,0.0f,0.0f},{0.5f,0.25f,0.0f},{0.5f,0.5f,0.0f},{0.0f,0.5f,0.0f},{0.0f,0.5f,0.5f}
+ };
+
+
+ /**
+ * renderCanvas(int w, int h)
+ *
+ * Constructor.
+ */
+ public renderCanvas(int w, int h)
+ {
+ super(w, h);
+
+ //Registers this canvas to process keyboard events
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+
+ /**
+ * void preInit()
+ *
+ * Called just BEFORE the GL-Context is created.
+ */
+ public void preInit()
+ {
+ //We want double buffering
+ doubleBuffer = true;
+ //But we dont want stereo view
+ stereoView = false;
+ }
+
+
+ /**
+ *
+ * void BuildList()
+ *
+ * Builds our display lists
+ */
+ public void BuildList()
+ {
+ //Create display list for cube
+ cube = gl.glGenLists(2);
+
+ gl.glNewList(cube, GL_COMPILE);
+ gl.glBegin(GL_QUADS);
+ //Bottom Face
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ //Front Face
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Top Left Of The Texture and Quad
+ //Back Face
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Bottom Left Of The Texture and Quad
+ //Right face
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ //Left Face
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glEnd();
+ gl.glEndList();
+
+ //Create display list for cube top
+ top = cube + 1;
+
+ gl.glNewList(top, GL_COMPILE);
+ gl.glBegin(GL_QUADS);
+ //Top Face
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glEnd();
+ gl.glEndList();
+ }
+
+
+ /**
+ * void LoadGLTextures()
+ *
+ * Load textures.
+ */
+ public void LoadGLTextures()
+ {
+ PngTextureLoader texLoader = new PngTextureLoader(gl, glu);
+ texLoader.readTexture(getCodeBase(), "data/cube.png");
+
+ if(texLoader.isOk())
+ {
+ //Create Texture
+ gl.glGenTextures(1, texture);
+ gl.glBindTexture(GL_TEXTURE_2D, texture[0]);
+
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ gl.glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(),
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+ }
+ }
+
+
+ /**
+ * void init()
+ *
+ * Called just AFTER the GL-Context is created.
+ */
+ public void init()
+ {
+ //Load The Texture(s)
+ LoadGLTextures();
+
+ //Build display lists
+ BuildList();
+
+ //Enable Texture Mapping
+ gl.glEnable(GL_TEXTURE_2D);
+
+ //This Will Clear The Background Color To Black
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ //Enables Clearing Of The Depth Buffer
+ gl.glClearDepth(1.0);
+ //The Type Of Depth Test To Do
+ gl.glDepthFunc(GL_LESS);
+ //Enables Depth Testing
+ gl.glEnable(GL_DEPTH_TEST);
+
+ //Enables Smooth Color Shading
+ gl.glShadeModel(GL_SMOOTH);
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the canvas.
+ */
+ public void destroy()
+ {
+ //Destroy the GLContext
+ cvsDispose();
+ }
+
+
+ /**
+ * void reshape(int width, int height)
+ *
+ * Called after the first paint command.
+ */
+ public void reshape(int width, int height)
+ {
+ //Reset The Current Viewport And Perspective Transformation
+ gl.glViewport(0, 0, width, height);
+
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+
+ //Enable 3D cards default light
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_LIGHTING);
+
+ //Enable coloured textures
+ gl.glEnable(GL_COLOR_MATERIAL);
+ }
+
+
+ /**
+ * void display()
+ *
+ * Draw to the canvas.
+ */
+ public void display()
+ {
+ //Ensure GL is initialised correctly
+ if (glj.gljMakeCurrent(true) == false)
+ return;
+
+ //Clear The Screen And The Depth Buffer
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ //Select texture
+ gl.glBindTexture(GL_TEXTURE_2D, texture[0]);
+
+ for(yloop = 1; yloop < 6; yloop++)
+ {
+ for(xloop = 0; xloop < yloop; xloop++)
+ {
+ //Reset The View
+ gl.glLoadIdentity();
+ gl.glTranslatef(1.4f + ((float)xloop * 2.8f) - ((float)yloop * 1.4f),((6.0f - (float)yloop) * 2.4f) -7.0f, -20.0f);
+ gl.glRotatef(45.0f - (2.0f * yloop) + xrot, 1.0f, 0.0f, 0.0f);
+ gl.glRotatef(45.0f + yrot, 0.0f, 1.0f, 0.0f);
+
+ //Select color
+ gl.glColor3fv(boxcol[yloop - 1]);
+ //Draw cube
+ gl.glCallList(cube);
+
+ //Select color
+ gl.glColor3fv(topcol[yloop - 1]);
+ //Draw top
+ gl.glCallList(top);
+ }
+ }
+
+ //Swap buffers
+ glj.gljSwap();
+ }
+
+
+ /**
+ * void keyTyped(KeyEvent e)
+ *
+ * Invoked when a key has been typed. This event occurs when a key press is followed by a key release.
+ */
+ public void keyTyped(KeyEvent e)
+ {
+ }
+
+
+ /**
+ * void keyPressed(KeyEvent e)
+ *
+ * Invoked when a key has been pressed.
+ */
+ public void keyPressed(KeyEvent e)
+ {
+ switch(e.getKeyCode())
+ {
+ //Rotate cubes when user presses UP
+ case KeyEvent.VK_UP:
+ {
+ xrot -= 0.2f;
+ break;
+ }
+
+ //Rotate cubes when user presses DOWN
+ case KeyEvent.VK_DOWN:
+ {
+ xrot += 0.2f;
+ break;
+ }
+
+ //Rotate cubes when user presses RIGHT
+ case KeyEvent.VK_RIGHT:
+ {
+ yrot += 0.2f;
+ break;
+ }
+
+ //Rotate cubes when user presses LEFT
+ case KeyEvent.VK_LEFT:
+ {
+ yrot -= 0.2f;
+ break;
+ }
+ }
+ }
+
+
+ /**
+ * void keyReleased(KeyEvent e)
+ *
+ * Invoked when a key has been released.
+ */
+ public void keyReleased(KeyEvent e)
+ {
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ }
+}
diff --git a/demos/HodglimsNeHe/Lesson12_plugin13.html b/demos/HodglimsNeHe/Lesson12_plugin13.html
new file mode 100644
index 0000000..6ac571e
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson12_plugin13.html
@@ -0,0 +1,77 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson12 Applet: Display Lists</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Display Lists</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana"><B><U>Keys</U></B></FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<B>UP</B> - Rotate up<BR>
+<B>DOWN</B> - Rotate down<BR>
+<B>LEFT</B> - Rotate left<BR>
+<B>RIGHT</B> - Rotate right
+</FONT>
+</P>
+<P><FONT SIZE="1" FACE="Verdana"><B>Note:</B> You must click inside the applet window before using these keys.</FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = "400" HEIGHT = "400" codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "Lesson12.class" WIDTH = "400" HEIGHT = "400" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "Lesson12.class" WIDTH = "400" HEIGHT = "400"></XMP>
+<PARAM NAME = CODE VALUE = "Lesson12.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "Lesson12.class" WIDTH = "400" HEIGHT = "400">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson16.html b/demos/HodglimsNeHe/Lesson16.html
new file mode 100644
index 0000000..ea079be
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson16.html
@@ -0,0 +1,51 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson16 Applet: Cool Looking Fog</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Cool Looking Fog</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana"><B><U>Keys</U></B></FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<B>L</B> - Lights ON/OFF<BR>
+<B>F</B> - Change texture filter<BR>
+<B>G</B> - Change fog mode<BR>
+<B>PG_UP</B> - Zoom out<BR>
+<B>PG_DOWN</B> - Zoom in<BR>
+<B>UP</B> - Rotate cube<BR>
+<B>DOWN</B> - Rotate cube<BR>
+<B>LEFT</B> - Rotate cube<BR>
+<B>RIGHT</B> - Rotate cube
+</FONT>
+</P>
+<P><FONT SIZE="1" FACE="Verdana"><B>Note:</B> You must click inside the applet window before using these keys.</FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<APPLET CODE="Lesson16.class" WIDTH="400" HEIGHT="400">
+</APPLET>
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson16.java b/demos/HodglimsNeHe/Lesson16.java
new file mode 100644
index 0000000..82fa7b7
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson16.java
@@ -0,0 +1,551 @@
+/**
+ * Lesson16.java
+ *
+ * Author: Darren Hodges
+ * Date: 19/01/2000
+ *
+ * Port of the NeHe OpenGL Tutorial (Lesson 16: "Cool Looking Fog")
+ * to Java using the GL4Java interface to OpenGL.
+ *
+ * Note: The MipMapping code is only available in GL4Java 2.1.2.1 and later!
+ *
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+
+//GL4Java classes
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.utils.textures.*;
+
+
+public class Lesson16 extends Applet
+{
+ //Our rendering canvas
+ //We are using GLAnimCanvas because we want the canvas
+ //to be constantly redrawn
+ renderCanvas canvas = null;
+
+
+ /**
+ * void init()
+ *
+ * Initialise the applet.
+ */
+ public void init()
+ {
+ //We will use BorderLayout to layout the applet components
+ setLayout(new BorderLayout());
+
+ //Create our canvas and add it to the center of the applet
+ canvas = new renderCanvas(getSize().width, getSize().height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /**
+ * void start()
+ *
+ * Start the applet.
+ */
+ public void start()
+ {
+ //Start animating the canvas
+ canvas.start();
+ }
+
+
+ /**
+ * void stop()
+ *
+ * Stop the applet.
+ */
+ public void stop()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the applet.
+ */
+ public void destroy()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ //Destroy the canvas
+ canvas.destroy();
+ }
+
+
+
+ private class renderCanvas extends GLAnimCanvas
+ implements KeyListener, MouseListener
+ {
+ boolean light = true; //Lighting ON/OFF
+ boolean lp = false; //L Pressed?
+ boolean fp = false; //F Pressed?
+ boolean gp = false; //G Pressed?
+
+ float xrot = 0.0f; //X Rotation
+ float yrot = 0.0f; //Y Rotation
+ float xspeed = 0.0f; //X Rotation Speed
+ float yspeed = 0.0f; //Y Rotation Speed
+
+ float z = -8.0f; //Depth Into The Screen
+
+ //Ambient light
+ float[] LightAmbient = { 0.5f, 0.5f, 0.5f, 1.0f };
+
+ //Diffuse light
+ float[] LightDiffuse = { 1.0f, 1.0f, 1.0f, 1.0f };
+
+ //Light position
+ float[] LightPosition = { 0.0f, 0.0f, 2.0f, 1.0f };
+
+ int filter = 0; //Which Filter To Use
+
+ int[] texture = new int[3]; //Storage for 3 textures
+
+ //Fog
+ int[] fogMode = { GL_EXP, GL_EXP2, GL_LINEAR }; //Storage For Three Types Of Fog
+ int fogfilter = 0; //Which Fog To Use
+ float[] fogColor = { 0.5f, 0.5f, 0.5f, 1.0f }; //Fog Color
+
+
+ /**
+ * renderCanvas(int w, int h)
+ *
+ * Constructor.
+ */
+ public renderCanvas(int w, int h)
+ {
+ super(w, h);
+
+ //Registers this canvas to process keyboard events
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+
+ /**
+ * void preInit()
+ *
+ * Called just BEFORE the GL-Context is created.
+ */
+ public void preInit()
+ {
+ //We want double buffering
+ doubleBuffer = true;
+ //But we dont want stereo view
+ stereoView = false;
+ }
+
+
+ /**
+ * void LoadGLTextures()
+ *
+ * Load textures.
+ */
+ public void LoadGLTextures()
+ {
+ PngTextureLoader texLoader = new PngTextureLoader(gl, glu);
+ texLoader.readTexture(getCodeBase(), "data/crate.png");
+
+ if(texLoader.isOk())
+ {
+ //Create Nearest Filtered Texture
+ gl.glGenTextures(3, texture);
+ gl.glBindTexture(GL_TEXTURE_2D, texture[0]);
+
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ gl.glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(),
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+
+ //Create Linear Filtered Texture
+ gl.glBindTexture(GL_TEXTURE_2D, texture[1]);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ gl.glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(),
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+
+ //Create MipMapped Texture (Only with GL4Java 2.1.2.1 and later!)
+ gl.glBindTexture(GL_TEXTURE_2D, texture[2]);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
+
+ glu.gluBuild2DMipmaps(GL_TEXTURE_2D,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(),
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+ }
+ }
+
+
+ /**
+ * void init()
+ *
+ * Called just AFTER the GL-Context is created.
+ */
+ public void init()
+ {
+ //Load The Texture(s)
+ LoadGLTextures();
+ //Enable Texture Mapping
+ gl.glEnable(GL_TEXTURE_2D);
+
+ //This Will Clear The Background Color To Color Of Fog
+ gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
+
+ //Enables Clearing Of The Depth Buffer
+ gl.glClearDepth(1.0);
+ //The Type Of Depth Test To Do
+ gl.glDepthFunc(GL_LESS);
+ //Enables Depth Testing
+ gl.glEnable(GL_DEPTH_TEST);
+
+ //Enables Smooth Color Shading
+ gl.glShadeModel(GL_SMOOTH);
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+
+ //Lights
+ gl.glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
+ gl.glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
+ gl.glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
+
+ //Enable light
+ gl.glEnable(GL_LIGHT1);
+ gl.glEnable(GL_LIGHTING);
+
+ //Enables GL_FOG
+ gl.glEnable(GL_FOG);
+ //Fog Mode
+ gl.glFogi(GL_FOG_MODE, fogMode[fogfilter]);
+ //Set Fog Color
+ gl.glFogfv(GL_FOG_COLOR, fogColor);
+ //How Dense Will The Fog Be
+ gl.glFogf(GL_FOG_DENSITY, 0.35f);
+ //Fog Hint Value
+ gl.glHint(GL_FOG_HINT, GL_DONT_CARE);
+ //Fog Start Depth
+ gl.glFogf(GL_FOG_START, 1.0f);
+ //Fog End Depth
+ gl.glFogf(GL_FOG_END, 5.0f);
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the canvas.
+ */
+ public void destroy()
+ {
+ //Destroy the GLContext
+ cvsDispose();
+ }
+
+
+ /**
+ * void reshape(int width, int height)
+ *
+ * Called after the first paint command.
+ */
+ public void reshape(int width, int height)
+ {
+ //Reset The Current Viewport And Perspective Transformation
+ gl.glViewport(0, 0, width, height);
+
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void display()
+ *
+ * Draw to the canvas.
+ */
+ public void display()
+ {
+ //Ensure GL is initialised correctly
+ if (glj.gljMakeCurrent(true) == false)
+ return;
+
+ //Clear The Screen And The Depth Buffer
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ //Reset The View
+ gl.glLoadIdentity();
+
+ //Move into the screen
+ gl.glTranslatef(0.0f, 0.0f, z);
+
+ //Rotate On The X Axis
+ gl.glRotatef(xrot,1.0f, 0.0f, 0.0f);
+ //Rotate On The Y Axis
+ gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);
+
+ //Select texture
+ gl.glBindTexture(GL_TEXTURE_2D, texture[filter]);
+
+ gl.glBegin(GL_QUADS);
+ //Front Face
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Top Left Of The Texture and Quad
+ //Back Face
+ gl.glNormal3f(0.0f, 0.0f, -1.0f);
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Bottom Left Of The Texture and Quad
+ //Top Face
+ gl.glNormal3f(0.0f, 1.0f, 0.0f);
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ //Bottom Face
+ gl.glNormal3f(0.0f, -1.0f, 0.0f);
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ //Right face
+ gl.glNormal3f(1.0f, 0.0f, 0.0f);
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ //Left Face
+ gl.glNormal3f(-1.0f, 0.0f, 0.0f);
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glEnd();
+
+ //X Axis Rotation
+ xrot += xspeed;
+ //Y Axis Rotation
+ yrot += yspeed;
+
+ //Swap buffers
+ glj.gljSwap();
+ }
+
+
+ /**
+ * void keyTyped(KeyEvent e)
+ *
+ * Invoked when a key has been typed. This event occurs when a key press is followed by a key release.
+ */
+ public void keyTyped(KeyEvent e)
+ {
+ }
+
+
+ /**
+ * void keyPressed(KeyEvent e)
+ *
+ * Invoked when a key has been pressed.
+ */
+ public void keyPressed(KeyEvent e)
+ {
+ switch(e.getKeyCode())
+ {
+ //Switch ON/OFF light when L is pressed
+ case KeyEvent.VK_L:
+ {
+ if(!lp)
+ {
+ lp = true;
+ //Toggle light
+ light = !light;
+
+ if(!light)
+ gl.glDisable(GL_LIGHTING);
+ else
+ gl.glEnable(GL_LIGHTING);
+ }
+
+ break;
+ }
+
+ //Switch filter when F is pressed
+ case KeyEvent.VK_F:
+ {
+ if(!fp)
+ {
+ fp = true;
+ //Change filter
+ filter += 1;
+ if(filter > 2)
+ filter = 0;
+ }
+
+ break;
+ }
+
+ //Switch fog mode when G is pressed
+ case KeyEvent.VK_G:
+ {
+ if(!gp)
+ {
+ gp = true;
+ //Toggle fog
+ fogfilter += 1;
+ if(fogfilter > 2)
+ fogfilter = 0;
+
+ gl.glFogi(GL_FOG_MODE, fogMode[fogfilter]); //Fog Mode
+ }
+
+ break;
+ }
+
+ //Move cube back when user presses PG_UP
+ case KeyEvent.VK_PAGE_UP:
+ {
+ z -= 0.2f;
+ break;
+ }
+
+ //Move cube forwards when user presses PG_DOWN
+ case KeyEvent.VK_PAGE_DOWN:
+ {
+ z += 0.2f;
+ break;
+ }
+
+ //Increase X rotation speed when user presses UP
+ case KeyEvent.VK_UP:
+ {
+ xspeed += 0.2f;
+ break;
+ }
+
+ //Decrease X rotation speed when user presses DOWN
+ case KeyEvent.VK_DOWN:
+ {
+ xspeed -= 0.2f;
+ break;
+ }
+
+ //Increase Y rotation speed when user presses RIGHT
+ case KeyEvent.VK_RIGHT:
+ {
+ yspeed += 0.2f;
+ break;
+ }
+
+ //Decrease Y rotation speed when user presses LEFT
+ case KeyEvent.VK_LEFT:
+ {
+ yspeed -= 0.2f;
+ break;
+ }
+ }
+ }
+
+
+ /**
+ * void keyReleased(KeyEvent e)
+ *
+ * Invoked when a key has been released.
+ */
+ public void keyReleased(KeyEvent e)
+ {
+ switch(e.getKeyCode())
+ {
+ //Key has been released
+ case KeyEvent.VK_L:
+ {
+ lp = false;
+ break;
+ }
+
+ //Key has been released
+ case KeyEvent.VK_F:
+ {
+ fp = false;
+ break;
+ }
+
+ //Key has been released
+ case KeyEvent.VK_G:
+ {
+ gp = false;
+ break;
+ }
+ }
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ }
+}
diff --git a/demos/HodglimsNeHe/Lesson16_plugin13.html b/demos/HodglimsNeHe/Lesson16_plugin13.html
new file mode 100644
index 0000000..43441bc
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson16_plugin13.html
@@ -0,0 +1,82 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson16 Applet: Cool Looking Fog</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Cool Looking Fog</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana"><B><U>Keys</U></B></FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<B>L</B> - Lights ON/OFF<BR>
+<B>F</B> - Change texture filter<BR>
+<B>G</B> - Change fog mode<BR>
+<B>PG_UP</B> - Zoom out<BR>
+<B>PG_DOWN</B> - Zoom in<BR>
+<B>UP</B> - Rotate cube<BR>
+<B>DOWN</B> - Rotate cube<BR>
+<B>LEFT</B> - Rotate cube<BR>
+<B>RIGHT</B> - Rotate cube
+</FONT>
+</P>
+<P><FONT SIZE="1" FACE="Verdana"><B>Note:</B> You must click inside the applet window before using these keys.</FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = "400" HEIGHT = "400" codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "Lesson16.class" WIDTH = "400" HEIGHT = "400" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "Lesson16.class" WIDTH = "400" HEIGHT = "400"></XMP>
+<PARAM NAME = CODE VALUE = "Lesson16.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "Lesson16.class" WIDTH = "400" HEIGHT = "400">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson18.html b/demos/HodglimsNeHe/Lesson18.html
new file mode 100644
index 0000000..2cf8f5a
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson18.html
@@ -0,0 +1,50 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson18 Applet: Quadratics</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Quadratics</B></FONT><BR>
+Ported by <A HREF="MAILTO: [email protected]">Lapo Luchini</A>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<FONT SIZE="1" FACE="Verdana"><B><U>Keys</U></B></FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<B>L</B> - Lights ON/OFF<BR>
+<B>F</B> - Change texture filter<BR>
+<B>PG_UP</B> - Zoom out<BR>
+<B>PG_DOWN</B> - Zoom in<BR>
+<B>UP</B> - Rotate cube<BR>
+<B>DOWN</B> - Rotate cube<BR>
+<B>LEFT</B> - Rotate cube<BR>
+<B>RIGHT</B> - Rotate cube
+</FONT>
+</P>
+<P><FONT SIZE="1" FACE="Verdana"><B>Note:</B> You must click inside the applet window before using these keys.</FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<APPLET CODE="Lesson18.class" WIDTH="400" HEIGHT="400">
+</APPLET>
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson18.java b/demos/HodglimsNeHe/Lesson18.java
new file mode 100644
index 0000000..b63a627
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson18.java
@@ -0,0 +1,459 @@
+/**
+ * Lesson18.java
+ *
+ * by Lapo Luchini <[email protected]>
+ * Based on Lesson 7 by Darren Hodges
+ * Date: 23/08/2000
+ *
+ * Port of the NeHe OpenGL Tutorial (Lesson 18: "Quadratics")
+ * to Java using the GL4Java interface to OpenGL.
+ *
+ * Note: The MipMapping code is only available in GL4Java 2.1.2.1 and later!
+ *
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+
+//GL4Java classes
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.utils.textures.*;
+
+public class Lesson18 extends Applet
+{
+ //Our rendering canvas
+ //We are using GLAnimCanvas because we want the canvas
+ //to be constantly redrawn
+ renderCanvas canvas=null;
+
+ /**
+ * void init()
+ *
+ * Initialise the applet.
+ */
+ public void init() {
+ //We will use BorderLayout to layout the applet components
+ setLayout(new BorderLayout());
+
+ //Create our canvas and add it to the center of the applet
+ canvas=new renderCanvas(getSize().width, getSize().height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+ /**
+ * void start()
+ *
+ * Start the applet.
+ */
+ public void start() {
+ //Start animating the canvas
+ canvas.start();
+ }
+
+ /**
+ * void stop()
+ *
+ * Stop the applet.
+ */
+ public void stop() {
+ //Stop animating the canvas
+ canvas.stop();
+ }
+
+ /**
+ * void destroy()
+ *
+ * Destroy the applet.
+ */
+ public void destroy() {
+ //Stop animating the canvas
+ canvas.stop();
+ //Destroy the canvas
+ canvas.destroy();
+ }
+
+ private class renderCanvas extends GLAnimCanvas
+ implements KeyListener, MouseListener
+ {
+ boolean light = true; //Lighting ON/OFF
+ boolean lp = false; //L Pressed?
+ boolean fp = false; //F Pressed?
+ boolean sp = false; //Spacebar Pressed?
+
+ float xrot = 0.0f; //X Rotation
+ float yrot = 0.0f; //Y Rotation
+ float xspeed = 0.0f; //X Rotation Speed
+ float yspeed = 0.0f; //Y Rotation Speed
+
+ float z = -5.0f; //Depth Into The Screen
+
+ //Ambient light
+ float[] LightAmbient = { 0.5f, 0.5f, 0.5f, 1.0f };
+
+ //Diffuse light
+ float[] LightDiffuse = { 1.0f, 1.0f, 1.0f, 1.0f };
+
+ //Light position
+ float[] LightPosition = { 0.0f, 0.0f, 2.0f, 1.0f };
+
+ int filter = 0; //Which Filter To Use
+
+ int[] texture = new int[3]; //Storage for 3 textures
+
+ int part1; // Start Of Disc
+ int part2; // End Of Disc
+ int p1=0; // Increase 1
+ int p2=1; // Increase 2
+ int quadratic; // Storage For Our Quadratic Objects
+ int object=0; // Which Object To Draw
+
+ public renderCanvas(int w, int h) {
+ super(w, h);
+ //Registers this canvas to process keyboard events
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+ public void preInit() {
+ //We want double buffering
+ doubleBuffer = true;
+ //But we dont want stereo view
+ stereoView = false;
+ }
+
+ public void LoadTextures() {
+ PngTextureLoader texLoader=new PngTextureLoader(gl, glu);
+ // catch exception if executed by command-line
+ try {
+ texLoader.readTexture(getCodeBase(), "data/crate.png");
+ } catch(NullPointerException e) {
+ texLoader.readTexture("data/crate.png");
+ }
+ if(texLoader.isOk()) {
+ gl.glGenTextures(3, texture);
+ gl.glBindTexture(GL_TEXTURE_2D, texture[0]);
+
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ gl.glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(),
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+
+ //Create Linear Filtered Texture
+ gl.glBindTexture(GL_TEXTURE_2D, texture[1]);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ gl.glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(),
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+
+ //Create MipMapped Texture (Only with GL4Java 2.1.2.1 and later!)
+ gl.glBindTexture(GL_TEXTURE_2D, texture[2]);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
+
+ glu.gluBuild2DMipmaps(GL_TEXTURE_2D,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(), GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+ }
+ }
+
+ public void init() {
+ LoadTextures();
+ gl.glEnable(GL_TEXTURE_2D);
+
+ //This Will Clear The Background Color To Black
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ //Enables Clearing Of The Depth Buffer
+ gl.glClearDepth(1.0);
+ //The Type Of Depth Lesson18 To Do
+ gl.glDepthFunc(GL_LESS);
+ //Enables Depth Lesson18ing
+ gl.glEnable(GL_DEPTH_TEST);
+
+ //Enables Smooth Color Shading
+ gl.glShadeModel(GL_SMOOTH);
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0, (float)getSize().width / (float)getSize().height, 0.1, 100.0);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+
+ //Lights
+ gl.glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
+ gl.glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
+ gl.glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
+
+ //Enable light
+ gl.glEnable(GL_LIGHT1);
+ gl.glEnable(GL_LIGHTING);
+
+ quadratic=glu.gluNewQuadric(); // Create A Pointer To The Quadric Object ( NEW )
+ glu.gluQuadricNormals(quadratic, GLU_SMOOTH); // Create Smooth Normals ( NEW )
+ glu.gluQuadricTexture(quadratic, GL_TRUE); // Create Texture Coords ( NEW )
+ }
+
+ public void destroy() {
+ //Destroy the GLContext
+ cvsDispose();
+ }
+
+ public void reshape(int width, int height) {
+ //Reset The Current Viewport And Perspective Transformation
+ gl.glViewport(0, 0, width, height);
+
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0, getSize().width/(float)getSize().height, 0.1, 100.0);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+ private void DrawCube() {
+ gl.glBegin(GL_QUADS);
+ //Front Face
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Top Left Of The Texture and Quad
+ //Back Face
+ gl.glNormal3f(0.0f, 0.0f, -1.0f);
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Bottom Left Of The Texture and Quad
+ //Top Face
+ gl.glNormal3f(0.0f, 1.0f, 0.0f);
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ //Bottom Face
+ gl.glNormal3f(0.0f, -1.0f, 0.0f);
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ //Right face
+ gl.glNormal3f(1.0f, 0.0f, 0.0f);
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ //Left Face
+ gl.glNormal3f(-1.0f, 0.0f, 0.0f);
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glEnd();
+ }
+
+ public void display() {
+ //Clear The Screen And The Depth Buffer
+ gl.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ //Reset The View
+ gl.glLoadIdentity();
+
+ //Move into the screen
+ gl.glTranslatef(0.0f, 0.0f, z);
+
+ //Rotate On The X Axis
+ gl.glRotatef(xrot, 1.0f, 0.0f, 0.0f);
+ //Rotate On The Y Axis
+ gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);
+
+ gl.glBindTexture(GL_TEXTURE_2D, texture[filter]); // Select A Filtered Texture
+
+ switch(object) { // Check object To Find Out What To Draw
+ case 0: // Drawing Object 1
+ DrawCube(); // Draw Our Cube
+ break; // Done
+ case 1: // Drawing Object 2
+ gl.glTranslatef(0.0f,0.0f,-1.5f); // Center The Cylinder
+ glu.gluCylinder(quadratic,1.0f,1.0f,3.0f,32,32); // Draw Our Cylinder
+ break; // Done
+ case 2: // Drawing Object 3
+ glu.gluDisk(quadratic,0.5f,1.5f,32,32); // Draw A Disc (CD Shape)
+ break; // Done
+ case 3: // Drawing Object 4
+ glu.gluSphere(quadratic,1.3f,32,32); // Draw A Sphere
+ break; // Done
+ case 4: // Drawing Object 5
+ gl.glTranslatef(0.0f,0.0f,-1.5f); // Center The Cone
+ glu.gluCylinder(quadratic,1.0f,0.0f,3.0f,32,32); // A Cone With A Bottom Radius Of .5 And A Height Of 2
+ break; // Done
+ case 5: // Drawing Object 6
+ part1+=p1; // Increase Start Angle
+ part2+=p2; // Increase Sweep Angle
+ if(part1>359) { // 360 Degrees
+ p1=0; // Stop Increasing Start Angle
+ part1=0; // Set Start Angle To Zero
+ p2=1; // Start Increasing Sweep Angle
+ part2=0; // Start Sweep Angle At Zero
+ }
+ if(part2>359) { // 360 Degrees
+ p1=1; // Start Increasing Start Angle
+ p2=0; // Stop Increasing Sweep Angle
+ }
+ glu.gluPartialDisk(quadratic,0.5f,1.5f,32,32,part1,part2-part1); // A Disk Like The One Before
+ break; // Done
+ };
+ xrot+=xspeed; // Increase Rotation On X Axis
+ yrot+=yspeed; // Increase Rotation On Y Axis
+
+ //Swap buffers
+ glj.gljSwap();
+ }
+
+ public void keyTyped(KeyEvent e) {
+ //We are not handling any keyboard events yet
+ }
+ public void keyPressed(KeyEvent e) {
+ switch(e.getKeyCode()) {
+ //Switch ON/OFF light when L is pressed
+ case KeyEvent.VK_L:
+ if(!lp) {
+ lp = true;
+ //Toggle light
+ light = !light;
+
+ if(!light)
+ gl.glDisable(GL_LIGHTING);
+ else
+ gl.glEnable(GL_LIGHTING);
+ }
+
+ break;
+ //Switch filter when F is pressed
+ case KeyEvent.VK_F:
+ if(!fp) {
+ fp = true;
+ //Change filter
+ filter += 1;
+ if(filter > 2)
+ filter = 0;
+ }
+ break;
+ //Move cube back when user presses PG_UP
+ case KeyEvent.VK_PAGE_UP:
+ z -= 0.2f;
+ break;
+ //Move cube forwards when user presses PG_DOWN
+ case KeyEvent.VK_PAGE_DOWN:
+ z += 0.2f;
+ break;
+ //Increase X rotation speed when user presses UP
+ case KeyEvent.VK_UP:
+ xspeed += 0.2f;
+ break;
+ //Decrease X rotation speed when user presses DOWN
+ case KeyEvent.VK_DOWN:
+ xspeed -= 0.2f;
+ break;
+ //Increase Y rotation speed when user presses RIGHT
+ case KeyEvent.VK_RIGHT:
+ yspeed += 0.2f;
+ break;
+ //Decrease Y rotation speed when user presses LEFT
+ case KeyEvent.VK_LEFT:
+ yspeed -= 0.2f;
+ break;
+ //Switch filter when F is pressed
+ case KeyEvent.VK_SPACE:
+ if(!sp) {
+ sp = true;
+ //Change filter
+ object += 1;
+ if(object > 5)
+ object = 0;
+ }
+ break;
+ }
+ }
+ public void keyReleased(KeyEvent e) {
+ switch(e.getKeyCode()) {
+ //Key has been released
+ case KeyEvent.VK_L:
+ lp = false;
+ break;
+ //Key has been released
+ case KeyEvent.VK_F:
+ fp = false;
+ break;
+ case KeyEvent.VK_SPACE:
+ sp = false;
+ break;
+ }
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ }
+ static class MyAdapter extends WindowAdapter {
+ public void windowClosing(WindowEvent e) {
+ System.exit(0);
+ }
+ }
+ public static void main(String as[]) {
+ Frame f=new Frame("Lesson18");
+ Lesson18 a=new Lesson18();
+ a.init();
+ a.start();
+ f.add("Center", a);
+ f.setSize(400, 400);
+ f.show();
+ f.addWindowListener(new MyAdapter());
+ }
+}
diff --git a/demos/HodglimsNeHe/Lesson18_plugin13.html b/demos/HodglimsNeHe/Lesson18_plugin13.html
new file mode 100644
index 0000000..6c731ef
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson18_plugin13.html
@@ -0,0 +1,81 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson18 Applet: Quadratics</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Quadratics</B></FONT><BR>
+Ported by <A HREF="MAILTO: [email protected]">Lapo Luchini</A>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<FONT SIZE="1" FACE="Verdana"><B><U>Keys</U></B></FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<B>L</B> - Lights ON/OFF<BR>
+<B>F</B> - Change texture filter<BR>
+<B>PG_UP</B> - Zoom out<BR>
+<B>PG_DOWN</B> - Zoom in<BR>
+<B>UP</B> - Rotate cube<BR>
+<B>DOWN</B> - Rotate cube<BR>
+<B>LEFT</B> - Rotate cube<BR>
+<B>RIGHT</B> - Rotate cube
+</FONT>
+</P>
+<P><FONT SIZE="1" FACE="Verdana"><B>Note:</B> You must click inside the applet window before using these keys.</FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = "400" HEIGHT = "400" codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "Lesson18.class" WIDTH = "400" HEIGHT = "400" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "Lesson18.class" WIDTH = "400" HEIGHT = "400"></XMP>
+<PARAM NAME = CODE VALUE = "Lesson18.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "Lesson18.class" WIDTH = "400" HEIGHT = "400">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson1_plugin13.html b/demos/HodglimsNeHe/Lesson1_plugin13.html
new file mode 100644
index 0000000..02c7e26
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson1_plugin13.html
@@ -0,0 +1,66 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson1 Applet: Setting Up OpenGL In Windows</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Setting Up OpenGL In Windows</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = "400" HEIGHT = "400" codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "Lesson1.class" WIDTH = "400" HEIGHT = "400" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "Lesson1.class" WIDTH = "400" HEIGHT = "400"></XMP>
+<PARAM NAME = CODE VALUE = "Lesson1.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "Lesson1.class" WIDTH = "400" HEIGHT = "400">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson2.html b/demos/HodglimsNeHe/Lesson2.html
new file mode 100644
index 0000000..8589c39
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson2.html
@@ -0,0 +1,35 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson2 Applet: Your First Polygon</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Your First Polygon</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<APPLET CODE="Lesson2.class" WIDTH="400" HEIGHT="400">
+</APPLET>
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson2.java b/demos/HodglimsNeHe/Lesson2.java
new file mode 100644
index 0000000..8f6eb2c
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson2.java
@@ -0,0 +1,280 @@
+/**
+ * Lesson2.java
+ *
+ * Author: Darren Hodges
+ * Date: 16/12/1999
+ *
+ * Port of the NeHe OpenGL Tutorial (Lesson 2: "Your First Polygon")
+ * to Java using the GL4Java interface to OpenGL.
+ *
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+
+//GL4Java classes
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+
+
+public class Lesson2 extends Applet
+{
+ //Our rendering canvas
+ //We are using GLAnimCanvas because we want the canvas
+ //to be constantly redrawn
+ renderCanvas canvas = null;
+
+
+ /**
+ * void init()
+ *
+ * Initialise the applet.
+ */
+ public void init()
+ {
+ //We will use BorderLayout to layout the applet components
+ setLayout(new BorderLayout());
+
+ //Create our canvas and add it to the center of the applet
+ canvas = new renderCanvas(getSize().width, getSize().height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /**
+ * void start()
+ *
+ * Start the applet.
+ */
+ public void start()
+ {
+ //Start animating the canvas
+ canvas.start();
+ }
+
+
+ /**
+ * void stop()
+ *
+ * Stop the applet.
+ */
+ public void stop()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the applet.
+ */
+ public void destroy()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ //Destroy the canvas
+ canvas.destroy();
+ }
+
+
+
+ private class renderCanvas extends GLAnimCanvas
+ implements KeyListener, MouseListener
+ {
+ /**
+ * renderCanvas(int w, int h)
+ *
+ * Constructor.
+ */
+ public renderCanvas(int w, int h)
+ {
+ super(w, h);
+
+ //Registers this canvas to process keyboard events
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+
+ /**
+ * void preInit()
+ *
+ * Called just BEFORE the GL-Context is created.
+ */
+ public void preInit()
+ {
+ //We want double buffering
+ doubleBuffer = true;
+ //But we dont want stereo view
+ stereoView = false;
+ }
+
+
+ /**
+ * void init()
+ *
+ * Called just AFTER the GL-Context is created.
+ */
+ public void init()
+ {
+ //This Will Clear The Background Color To Black
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ //Enables Clearing Of The Depth Buffer
+ gl.glClearDepth(1.0);
+ //The Type Of Depth Test To Do
+ gl.glDepthFunc(GL_LESS);
+ //Enables Depth Testing
+ gl.glEnable(GL_DEPTH_TEST);
+
+ //Enables Smooth Color Shading
+ gl.glShadeModel(GL_SMOOTH);
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the canvas.
+ */
+ public void destroy()
+ {
+ //Destroy the GLContext
+ cvsDispose();
+ }
+
+
+ /**
+ * void reshape(int width, int height)
+ *
+ * Called after the first paint command.
+ */
+ public void reshape(int width, int height)
+ {
+ //Reset The Current Viewport And Perspective Transformation
+ gl.glViewport(0, 0, width, height);
+
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void display()
+ *
+ * Draw to the canvas.
+ */
+ public void display()
+ {
+ //Ensure GL is initialised correctly
+ if (glj.gljMakeCurrent(true) == false)
+ return;
+
+ //Clear The Screen And The Depth Buffer
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ //Reset The View
+ gl.glLoadIdentity();
+
+ //Move Left 1.5 Units And Into The Screen 8.0
+ gl.glTranslatef(-1.5f, 0.0f, -8.0f);
+
+ //Draw triangle
+ gl.glBegin(GL_POLYGON);
+ gl.glVertex3f(0.0f, 1.0f, 0.0f); //Top
+ gl.glVertex3f(1.0f, -1.0f, 0.0f); //Bottom Right
+ gl.glVertex3f(-1.0f, -1.0f, 0.0f); //Bottom Left
+ gl.glEnd();
+
+ //Move Right 3 Units
+ gl.glTranslatef(3.0f, 0.0f, 0.0f);
+
+ //Draw rectangle
+ gl.glBegin(GL_QUADS);
+ gl.glVertex3f(-1.0f, 1.0f, 0.0f); //Top Left
+ gl.glVertex3f(1.0f, 1.0f, 0.0f); //Top Right
+ gl.glVertex3f(1.0f, -1.0f, 0.0f); //Bottom Right
+ gl.glVertex3f(-1.0f, -1.0f, 0.0f); //Bottom Left
+ gl.glEnd();
+
+ //Swap buffers
+ glj.gljSwap();
+ }
+
+
+ /**
+ * void keyTyped(KeyEvent e)
+ *
+ * Invoked when a key has been typed. This event occurs when a key press is followed by a key release.
+ */
+ public void keyTyped(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+
+ /**
+ * void keyPressed(KeyEvent e)
+ *
+ * Invoked when a key has been pressed.
+ */
+ public void keyPressed(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+
+ /**
+ * void keyReleased(KeyEvent e)
+ *
+ * Invoked when a key has been released.
+ */
+ public void keyReleased(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ }
+}
diff --git a/demos/HodglimsNeHe/Lesson2_plugin13.html b/demos/HodglimsNeHe/Lesson2_plugin13.html
new file mode 100644
index 0000000..238a26e
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson2_plugin13.html
@@ -0,0 +1,66 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson2 Applet: Your First Polygon</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Your First Polygon</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = "400" HEIGHT = "400" codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "Lesson2.class" WIDTH = "400" HEIGHT = "400" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "Lesson2.class" WIDTH = "400" HEIGHT = "400"></XMP>
+<PARAM NAME = CODE VALUE = "Lesson2.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "Lesson2.class" WIDTH = "400" HEIGHT = "400">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson3.html b/demos/HodglimsNeHe/Lesson3.html
new file mode 100644
index 0000000..863c4e8
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson3.html
@@ -0,0 +1,35 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson3 Applet: Colors</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Colors</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<APPLET CODE="Lesson3.class" WIDTH="400" HEIGHT="400">
+</APPLET>
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson3.java b/demos/HodglimsNeHe/Lesson3.java
new file mode 100644
index 0000000..b5e3377
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson3.java
@@ -0,0 +1,284 @@
+/**
+ * Lesson3.java
+ *
+ * Author: Darren Hodges
+ * Date: 16/12/1999
+ *
+ * Port of the NeHe OpenGL Tutorial (Lesson 3: "Colors")
+ * to Java using the GL4Java interface to OpenGL.
+ *
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+
+//GL4Java classes
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+
+
+public class Lesson3 extends Applet
+{
+ //Our rendering canvas
+ //We are using GLAnimCanvas because we want the canvas
+ //to be constantly redrawn
+ renderCanvas canvas = null;
+
+
+ /**
+ * void init()
+ *
+ * Initialise the applet.
+ */
+ public void init()
+ {
+ //We will use BorderLayout to layout the applet components
+ setLayout(new BorderLayout());
+
+ //Create our canvas and add it to the center of the applet
+ canvas = new renderCanvas(getSize().width, getSize().height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /**
+ * void start()
+ *
+ * Start the applet.
+ */
+ public void start()
+ {
+ //Start animating the canvas
+ canvas.start();
+ }
+
+
+ /**
+ * void stop()
+ *
+ * Stop the applet.
+ */
+ public void stop()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the applet.
+ */
+ public void destroy()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ //Destroy the canvas
+ canvas.destroy();
+ }
+
+
+
+ private class renderCanvas extends GLAnimCanvas
+ implements KeyListener, MouseListener
+ {
+ /**
+ * renderCanvas(int w, int h)
+ *
+ * Constructor.
+ */
+ public renderCanvas(int w, int h)
+ {
+ super(w, h);
+
+ //Registers this canvas to process keyboard events
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+
+ /**
+ * void preInit()
+ *
+ * Called just BEFORE the GL-Context is created.
+ */
+ public void preInit()
+ {
+ //We want double buffering
+ doubleBuffer = true;
+ //But we dont want stereo view
+ stereoView = false;
+ }
+
+
+ /**
+ * void init()
+ *
+ * Called just AFTER the GL-Context is created.
+ */
+ public void init()
+ {
+ //This Will Clear The Background Color To Black
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ //Enables Clearing Of The Depth Buffer
+ gl.glClearDepth(1.0);
+ //The Type Of Depth Test To Do
+ gl.glDepthFunc(GL_LESS);
+ //Enables Depth Testing
+ gl.glEnable(GL_DEPTH_TEST);
+
+ //Enables Smooth Color Shading
+ gl.glShadeModel(GL_SMOOTH);
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the canvas.
+ */
+ public void destroy()
+ {
+ //Destroy the GLContext
+ cvsDispose();
+ }
+
+
+ /**
+ * void reshape(int width, int height)
+ *
+ * Called after the first paint command.
+ */
+ public void reshape(int width, int height)
+ {
+ //Reset The Current Viewport And Perspective Transformation
+ gl.glViewport(0, 0, width, height);
+
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void display()
+ *
+ * Draw to the canvas.
+ */
+ public void display()
+ {
+ //Ensure GL is initialised correctly
+ if (glj.gljMakeCurrent(true) == false)
+ return;
+
+ //Clear The Screen And The Depth Buffer
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ //Reset The View
+ gl.glLoadIdentity();
+
+ //Move Left 1.5 Units And Into The Screen 8.0
+ gl.glTranslatef(-1.5f, 0.0f, -8.0f);
+
+ //Draw triangle
+ gl.glBegin(GL_POLYGON);
+ gl.glColor3f(1.0f, 0.0f, 0.0f); //Set The Color To Red
+ gl.glVertex3f(0.0f, 1.0f, 0.0f); //Top
+ gl.glColor3f(0.0f, 1.0f, 0.0f); //Set The Color To Green
+ gl.glVertex3f(-1.0f, -1.0f, 0.0f); //Bottom Left
+ gl.glColor3f(0.0f, 0.0f, 1.0f); //Set The Color To Blue
+ gl.glVertex3f(1.0f, -1.0f, 0.0f); //Bottom Right
+ gl.glEnd();
+
+ //Move Right 3 Units
+ gl.glTranslatef(3.0f, 0.0f, 0.0f);
+
+ //Draw rectangle
+ gl.glBegin(GL_QUADS);
+ gl.glColor3f(0.5f, 0.5f, 1.0f); //Set The Color To Blue One Time Only
+ gl.glVertex3f(-1.0f, 1.0f, 0.0f); //Top Left
+ gl.glVertex3f(1.0f, 1.0f, 0.0f); //Top Right
+ gl.glVertex3f(1.0f, -1.0f, 0.0f); //Bottom Right
+ gl.glVertex3f(-1.0f, -1.0f, 0.0f); //Bottom Left
+ gl.glEnd();
+
+ //Swap buffers
+ glj.gljSwap();
+ }
+
+
+ /**
+ * void keyTyped(KeyEvent e)
+ *
+ * Invoked when a key has been typed. This event occurs when a key press is followed by a key release.
+ */
+ public void keyTyped(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+
+ /**
+ * void keyPressed(KeyEvent e)
+ *
+ * Invoked when a key has been pressed.
+ */
+ public void keyPressed(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+
+ /**
+ * void keyReleased(KeyEvent e)
+ *
+ * Invoked when a key has been released.
+ */
+ public void keyReleased(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ }
+}
diff --git a/demos/HodglimsNeHe/Lesson3_plugin13.html b/demos/HodglimsNeHe/Lesson3_plugin13.html
new file mode 100644
index 0000000..8c7c414
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson3_plugin13.html
@@ -0,0 +1,66 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson3 Applet: Colors</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Colors</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = "400" HEIGHT = "400" codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "Lesson3.class" WIDTH = "400" HEIGHT = "400" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "Lesson3.class" WIDTH = "400" HEIGHT = "400"></XMP>
+<PARAM NAME = CODE VALUE = "Lesson3.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "Lesson3.class" WIDTH = "400" HEIGHT = "400">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson4.html b/demos/HodglimsNeHe/Lesson4.html
new file mode 100644
index 0000000..04a1ddc
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson4.html
@@ -0,0 +1,35 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson4 Applet: Rotation</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Rotation</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<APPLET CODE="Lesson4.class" WIDTH="400" HEIGHT="400">
+</APPLET>
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson4.java b/demos/HodglimsNeHe/Lesson4.java
new file mode 100644
index 0000000..ada7dd5
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson4.java
@@ -0,0 +1,304 @@
+/**
+ * Lesson4.java
+ *
+ * Author: Darren Hodges
+ * Date: 16/12/1999
+ *
+ * Port of the NeHe OpenGL Tutorial (Lesson 4: "Rotation")
+ * to Java using the GL4Java interface to OpenGL.
+ *
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+
+//GL4Java classes
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+
+
+public class Lesson4 extends Applet
+{
+ //Our rendering canvas
+ //We are using GLAnimCanvas because we want the canvas
+ //to be constantly redrawn
+ renderCanvas canvas = null;
+
+
+ /**
+ * void init()
+ *
+ * Initialise the applet.
+ */
+ public void init()
+ {
+ //We will use BorderLayout to layout the applet components
+ setLayout(new BorderLayout());
+
+ //Create our canvas and add it to the center of the applet
+ canvas = new renderCanvas(getSize().width, getSize().height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /**
+ * void start()
+ *
+ * Start the applet.
+ */
+ public void start()
+ {
+ //Start animating the canvas
+ canvas.start();
+ }
+
+
+ /**
+ * void stop()
+ *
+ * Stop the applet.
+ */
+ public void stop()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the applet.
+ */
+ public void destroy()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ //Destroy the canvas
+ canvas.destroy();
+ }
+
+
+
+ private class renderCanvas extends GLAnimCanvas
+ implements KeyListener, MouseListener
+ {
+ //Angle For The Triangle
+ float rtri = 0.0f;
+ //Angle For The Quad
+ float rquad = 0.0f;
+
+
+ /**
+ * renderCanvas(int w, int h)
+ *
+ * Constructor.
+ */
+ public renderCanvas(int w, int h)
+ {
+ super(w, h);
+
+ //Registers this canvas to process keyboard events
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+
+ /**
+ * void preInit()
+ *
+ * Called just BEFORE the GL-Context is created.
+ */
+ public void preInit()
+ {
+ //We want double buffering
+ doubleBuffer = true;
+ //But we dont want stereo view
+ stereoView = false;
+ }
+
+
+ /**
+ * void init()
+ *
+ * Called just AFTER the GL-Context is created.
+ */
+ public void init()
+ {
+ //This Will Clear The Background Color To Black
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ //Enables Clearing Of The Depth Buffer
+ gl.glClearDepth(1.0);
+ //The Type Of Depth Test To Do
+ gl.glDepthFunc(GL_LESS);
+ //Enables Depth Testing
+ gl.glEnable(GL_DEPTH_TEST);
+
+ //Enables Smooth Color Shading
+ gl.glShadeModel(GL_SMOOTH);
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the canvas.
+ */
+ public void destroy()
+ {
+ //Destroy the GLContext
+ cvsDispose();
+ }
+
+
+ /**
+ * void reshape(int width, int height)
+ *
+ * Called after the first paint command.
+ */
+ public void reshape(int width, int height)
+ {
+ //Reset The Current Viewport And Perspective Transformation
+ gl.glViewport(0, 0, width, height);
+
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void display()
+ *
+ * Draw to the canvas.
+ */
+ public void display()
+ {
+ //Ensure GL is initialised correctly
+ if (glj.gljMakeCurrent(true) == false)
+ return;
+
+ //Clear The Screen And The Depth Buffer
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ //Reset The View
+ gl.glLoadIdentity();
+
+ //Move Left 1.5 Units And Into The Screen 8.0
+ gl.glTranslatef(-1.5f, 0.0f, -8.0f);
+
+ //Rotate The Triangle On The Y axis
+ gl.glRotatef(rtri, 0.0f, 1.0f, 0.0f);
+
+ //Draw triangle
+ gl.glBegin(GL_POLYGON);
+ gl.glColor3f(1.0f, 0.0f, 0.0f); //Set The Color To Red
+ gl.glVertex3f(0.0f, 1.0f, 0.0f); //Top
+ gl.glColor3f(0.0f, 1.0f, 0.0f); //Set The Color To Green
+ gl.glVertex3f(-1.0f, -1.0f, 0.0f); //Bottom Left
+ gl.glColor3f(0.0f,0.0f,1.0f); //Set The Color To Blue
+ gl.glVertex3f(1.0f, -1.0f, 0.0f); //Bottom Right
+ gl.glEnd();
+
+ //Reset The View
+ gl.glLoadIdentity();
+
+ //Move right and into the screen
+ gl.glTranslatef(1.5f, 0.0f, -8.0f);
+
+ //Rotate The Quad On The X axis
+ gl.glRotatef(rquad, 1.0f, 0.0f, 0.0f);
+
+ //Draw rectangle
+ gl.glBegin(GL_QUADS);
+ gl.glColor3f(0.5f, 0.5f, 1.0f); //Set The Color To Blue One Time Only
+ gl.glVertex3f(-1.0f, 1.0f, 0.0f); //Top Left
+ gl.glVertex3f(1.0f, 1.0f, 0.0f); //Top Right
+ gl.glVertex3f(1.0f, -1.0f, 0.0f); //Bottom Right
+ gl.glVertex3f(-1.0f, -1.0f, 0.0f); //Bottom Left
+ gl.glEnd();
+
+ //Increase The Rotation Variable For The Triangle
+ rtri += 0.2f;
+ //Decrease The Rotation Variable For The Quad
+ rquad -= 0.15f;
+
+ //Swap buffers
+ glj.gljSwap();
+ }
+
+
+ /**
+ * void keyTyped(KeyEvent e)
+ *
+ * Invoked when a key has been typed. This event occurs when a key press is followed by a key release.
+ */
+ public void keyTyped(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+
+ /**
+ * void keyPressed(KeyEvent e)
+ *
+ * Invoked when a key has been pressed.
+ */
+ public void keyPressed(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+
+ /**
+ * void keyReleased(KeyEvent e)
+ *
+ * Invoked when a key has been released.
+ */
+ public void keyReleased(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ }
+}
diff --git a/demos/HodglimsNeHe/Lesson4_plugin13.html b/demos/HodglimsNeHe/Lesson4_plugin13.html
new file mode 100644
index 0000000..045a94d
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson4_plugin13.html
@@ -0,0 +1,66 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson4 Applet: Rotation</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Rotation</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = "400" HEIGHT = "400" codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "Lesson4.class" WIDTH = "400" HEIGHT = "400" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "Lesson4.class" WIDTH = "400" HEIGHT = "400"></XMP>
+<PARAM NAME = CODE VALUE = "Lesson4.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "Lesson4.class" WIDTH = "400" HEIGHT = "400">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson5.html b/demos/HodglimsNeHe/Lesson5.html
new file mode 100644
index 0000000..7ab275b
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson5.html
@@ -0,0 +1,35 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson5 Applet: Solid Objects</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Solid Objects</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<APPLET CODE="Lesson5.class" WIDTH="400" HEIGHT="400">
+</APPLET>
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson5.java b/demos/HodglimsNeHe/Lesson5.java
new file mode 100644
index 0000000..026ecb3
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson5.java
@@ -0,0 +1,355 @@
+/**
+ * Lesson5.java
+ *
+ * Author: Darren Hodges
+ * Date: 16/12/1999
+ *
+ * Port of the NeHe OpenGL Tutorial (Lesson 5: "Solid Objects")
+ * to Java using the GL4Java interface to OpenGL.
+ *
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+
+//GL4Java classes
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+
+
+public class Lesson5 extends Applet
+{
+ //Our rendering canvas
+ //We are using GLAnimCanvas because we want the canvas
+ //to be constantly redrawn
+ renderCanvas canvas = null;
+
+
+ /**
+ * void init()
+ *
+ * Initialise the applet.
+ */
+ public void init()
+ {
+ //We will use BorderLayout to layout the applet components
+ setLayout(new BorderLayout());
+
+ //Create our canvas and add it to the center of the applet
+ canvas = new renderCanvas(getSize().width, getSize().height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /**
+ * void start()
+ *
+ * Start the applet.
+ */
+ public void start()
+ {
+ //Start animating the canvas
+ canvas.start();
+ }
+
+
+ /**
+ * void stop()
+ *
+ * Stop the applet.
+ */
+ public void stop()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the applet.
+ */
+ public void destroy()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ //Destroy the canvas
+ canvas.destroy();
+ }
+
+
+
+ private class renderCanvas extends GLAnimCanvas
+ implements KeyListener, MouseListener
+ {
+ //Angle For The Pyramid
+ float rtri = 0.0f;
+ //Angle For The Cube
+ float rquad = 0.0f;
+
+
+ /**
+ * renderCanvas(int w, int h)
+ *
+ * Constructor.
+ */
+ public renderCanvas(int w, int h)
+ {
+ super(w, h);
+
+ //Registers this canvas to process keyboard events
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+
+ /**
+ * void preInit()
+ *
+ * Called just BEFORE the GL-Context is created.
+ */
+ public void preInit()
+ {
+ //We want double buffering
+ doubleBuffer = true;
+ //But we dont want stereo view
+ stereoView = false;
+ }
+
+
+ /**
+ * void init()
+ *
+ * Called just AFTER the GL-Context is created.
+ */
+ public void init()
+ {
+ //This Will Clear The Background Color To Black
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ //Enables Clearing Of The Depth Buffer
+ gl.glClearDepth(1.0);
+ //The Type Of Depth Test To Do
+ gl.glDepthFunc(GL_LESS);
+ //Enables Depth Testing
+ gl.glEnable(GL_DEPTH_TEST);
+
+ //Enables Smooth Color Shading
+ gl.glShadeModel(GL_SMOOTH);
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the canvas.
+ */
+ public void destroy()
+ {
+ //Destroy the GLContext
+ cvsDispose();
+ }
+
+
+ /**
+ * void reshape(int width, int height)
+ *
+ * Called after the first paint command.
+ */
+ public void reshape(int width, int height)
+ {
+ //Reset The Current Viewport And Perspective Transformation
+ gl.glViewport(0, 0, width, height);
+
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void display()
+ *
+ * Draw to the canvas.
+ */
+ public void display()
+ {
+ //Ensure GL is initialised correctly
+ if (glj.gljMakeCurrent(true) == false)
+ return;
+
+ //Clear The Screen And The Depth Buffer
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ //Reset The View
+ gl.glLoadIdentity();
+
+ //Move Left 1.5 Units And Into The Screen 8.0
+ gl.glTranslatef(-1.5f, 0.0f, -8.0f);
+
+ //Rotate The Pyramid On Its Y axis
+ gl.glRotatef(rtri, 0.0f, 1.0f, 0.0f);
+
+ //Draw pyramid
+ gl.glBegin(GL_POLYGON);
+ gl.glColor3f(1.0f, 0.0f, 0.0f); //Red
+ gl.glVertex3f(0.0f, 1.0f, 0.0f); //Top Of Triangle (Front)
+ gl.glColor3f(0.0f, 1.0f, 0.0f); //Green
+ gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Left Of Triangle (Front)
+ gl.glColor3f(0.0f, 0.0f, 1.0f); //Blue
+ gl.glVertex3f(1.0f, -1.0f, 1.0f); //Right Of Triangle (Front)
+
+ gl.glColor3f(1.0f, 0.0f, 0.0f); //Red
+ gl.glVertex3f(0.0f, 1.0f, 0.0f); //Top Of Triangle (Right)
+ gl.glColor3f(0.0f, 0.0f, 1.0f); //Blue
+ gl.glVertex3f(1.0f, -1.0f, 1.0f); //Left Of Triangle (Right)
+ gl.glColor3f(0.0f, 1.0f, 0.0f); //Green
+ gl.glVertex3f(1.0f, -1.0f, -1.0f); //Right Of Triangle (Right)
+
+ gl.glColor3f(1.0f,0.0f,0.0f); //Red
+ gl.glVertex3f(0.0f, 1.0f, 0.0f); //Top Of Triangle (Back)
+ gl.glColor3f(0.0f, 1.0f, 0.0f); //Green
+ gl.glVertex3f(1.0f, -1.0f, -1.0f); //Left Of Triangle (Back)
+ gl.glColor3f(0.0f, 0.0f, 1.0f); //Blue
+ gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Right Of Triangle (Back)
+
+ gl.glColor3f(1.0f, 0.0f, 0.0f); //Red
+ gl.glVertex3f(0.0f, 1.0f, 0.0f); //Top Of Triangle (Left)
+ gl.glColor3f(0.0f, 0.0f, 1.0f); //Blue
+ gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Left Of Triangle (Left)
+ gl.glColor3f(0.0f, 1.0f, 0.0f); //Green
+ gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Right Of Triangle (Left)
+ gl.glEnd();
+
+ //Reset The View
+ gl.glLoadIdentity();
+
+ //Move right and into the screen
+ gl.glTranslatef(1.5f, 0.0f, -8.0f);
+
+ //Rotate The Cube On X, Y & Z
+ gl.glRotatef(rquad, 1.0f, 1.0f, 1.0f);
+
+ //Draw cube
+ gl.glBegin(GL_QUADS);
+ gl.glColor3f(0.0f, 1.0f, 0.0f); //Set The Color To Blue
+ gl.glVertex3f(1.0f, 1.0f, -1.0f); //Top Right Of The Quad (Top)
+ gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Left Of The Quad (Top)
+ gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Bottom Left Of The Quad (Top)
+ gl.glVertex3f(1.0f, 1.0f, 1.0f); //Bottom Right Of The Quad (Top)
+
+ gl.glColor3f(1.0f, 0.5f, 0.0f); //Set The Color To Orange
+ gl.glVertex3f(1.0f, -1.0f, 1.0f); //Top Right Of The Quad (Bottom)
+ gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Top Left Of The Quad (Bottom)
+ gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Bottom Left Of The Quad (Bottom)
+ gl.glVertex3f(1.0f, -1.0f, -1.0f); //Bottom Right Of The Quad (Bottom)
+
+ gl.glColor3f(1.0f, 0.0f, 0.0f); //Set The Color To Red
+ gl.glVertex3f(1.0f, 1.0f, 1.0f); //Top Right Of The Quad (Front)
+ gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Top Left Of The Quad (Front)
+ gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Left Of The Quad (Front)
+ gl.glVertex3f(1.0f, -1.0f, 1.0f); //Bottom Right Of The Quad (Front)
+
+ gl.glColor3f(1.0f, 1.0f, 0.0f); //Set The Color To Yellow
+ gl.glVertex3f(1.0f, -1.0f, -1.0f); //Top Right Of The Quad (Back)
+ gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Top Left Of The Quad (Back)
+ gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Bottom Left Of The Quad (Back)
+ gl.glVertex3f(1.0f, 1.0f, -1.0f); //Bottom Right Of The Quad (Back)
+
+ gl.glColor3f(0.0f, 0.0f, 1.0f); //Set The Color To Blue
+ gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Top Right Of The Quad (Left)
+ gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Left Of The Quad (Left)
+ gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Bottom Left Of The Quad (Left)
+ gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Right Of The Quad (Left)
+
+ gl.glColor3f(1.0f, 0.0f, 1.0f); //Set The Color To Violet
+ gl.glVertex3f(1.0f, 1.0f, -1.0f); //Top Right Of The Quad (Right)
+ gl.glVertex3f(1.0f, 1.0f, 1.0f); //Top Left Of The Quad (Right)
+ gl.glVertex3f(1.0f, -1.0f, 1.0f); //Bottom Left Of The Quad (Right)
+ gl.glVertex3f(1.0f, -1.0f, -1.0f); //Bottom Right Of The Quad (Right)
+ gl.glEnd();
+
+ //Increase The Rotation Variable For The Pyramid
+ rtri += 0.2f;
+ //Decrease The Rotation Variable For The Cube
+ rquad -= 0.15f;
+
+ //Swap buffers
+ glj.gljSwap();
+ }
+
+
+ /**
+ * void keyTyped(KeyEvent e)
+ *
+ * Invoked when a key has been typed. This event occurs when a key press is followed by a key release.
+ */
+ public void keyTyped(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+
+ /**
+ * void keyPressed(KeyEvent e)
+ *
+ * Invoked when a key has been pressed.
+ */
+ public void keyPressed(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+
+ /**
+ * void keyReleased(KeyEvent e)
+ *
+ * Invoked when a key has been released.
+ */
+ public void keyReleased(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ }
+}
diff --git a/demos/HodglimsNeHe/Lesson5_plugin13.html b/demos/HodglimsNeHe/Lesson5_plugin13.html
new file mode 100644
index 0000000..4e79716
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson5_plugin13.html
@@ -0,0 +1,66 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson5 Applet: Solid Objects</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Solid Objects</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = "400" HEIGHT = "400" codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "Lesson5.class" WIDTH = "400" HEIGHT = "400" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "Lesson5.class" WIDTH = "400" HEIGHT = "400"></XMP>
+<PARAM NAME = CODE VALUE = "Lesson5.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "Lesson5.class" WIDTH = "400" HEIGHT = "400">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson6.html b/demos/HodglimsNeHe/Lesson6.html
new file mode 100644
index 0000000..b3a6032
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson6.html
@@ -0,0 +1,35 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson6 Applet: Texture Mapping</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Texture Mapping</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<APPLET CODE="Lesson6.class" WIDTH="400" HEIGHT="400">
+</APPLET>
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson6.java b/demos/HodglimsNeHe/Lesson6.java
new file mode 100644
index 0000000..ae85d76
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson6.java
@@ -0,0 +1,357 @@
+/**
+ * Lesson6.java
+ *
+ * Author: Darren Hodges
+ * Date: 16/12/1999
+ *
+ * Port of the NeHe OpenGL Tutorial (Lesson 6: "Texture Mapping")
+ * to Java using the GL4Java interface to OpenGL.
+ *
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+
+//GL4Java classes
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.utils.textures.*;
+
+
+public class Lesson6 extends Applet
+{
+ //Our rendering canvas
+ //We are using GLAnimCanvas because we want the canvas
+ //to be constantly redrawn
+ renderCanvas canvas = null;
+
+
+ /**
+ * void init()
+ *
+ * Initialise the applet.
+ */
+ public void init()
+ {
+ //We will use BorderLayout to layout the applet components
+ setLayout(new BorderLayout());
+
+ //Create our canvas and add it to the center of the applet
+ canvas = new renderCanvas(getSize().width, getSize().height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /**
+ * void start()
+ *
+ * Start the applet.
+ */
+ public void start()
+ {
+ //Start animating the canvas
+ canvas.start();
+ }
+
+
+ /**
+ * void stop()
+ *
+ * Stop the applet.
+ */
+ public void stop()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the applet.
+ */
+ public void destroy()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ //Destroy the canvas
+ canvas.destroy();
+ }
+
+
+
+ private class renderCanvas extends GLAnimCanvas
+ implements KeyListener, MouseListener
+ {
+ float xrot = 0.0f; //X Rotation
+ float yrot = 0.0f; //Y Rotation
+ float zrot = 0.0f; //Z Rotation
+
+ int[] texture = new int[1]; //Storage for one texture
+
+
+ /**
+ * renderCanvas(int w, int h)
+ *
+ * Constructor.
+ */
+ public renderCanvas(int w, int h)
+ {
+ super(w, h);
+
+ //Registers this canvas to process keyboard events
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+
+ /**
+ * void preInit()
+ *
+ * Called just BEFORE the GL-Context is created.
+ */
+ public void preInit()
+ {
+ //We want double buffering
+ doubleBuffer = true;
+ //But we dont want stereo view
+ stereoView = false;
+ }
+
+
+ /**
+ * void LoadGLTextures()
+ *
+ * Load textures.
+ */
+ public void LoadGLTextures()
+ {
+ PngTextureLoader texLoader = new PngTextureLoader(gl, glu);
+ texLoader.readTexture(getCodeBase(), "data/nehe.png");
+
+ if(texLoader.isOk())
+ {
+ //Create Texture
+ gl.glGenTextures(1, texture);
+ gl.glBindTexture(GL_TEXTURE_2D, texture[0]);
+
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ gl.glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(),
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+ }
+ }
+
+
+ /**
+ * void init()
+ *
+ * Called just AFTER the GL-Context is created.
+ */
+ public void init()
+ {
+ //Load The Texture(s)
+ LoadGLTextures();
+ //Enable Texture Mapping
+ gl.glEnable(GL_TEXTURE_2D);
+
+ //This Will Clear The Background Color To Black
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ //Enables Clearing Of The Depth Buffer
+ gl.glClearDepth(1.0);
+ //The Type Of Depth Test To Do
+ gl.glDepthFunc(GL_LESS);
+ //Enables Depth Testing
+ gl.glEnable(GL_DEPTH_TEST);
+
+ //Enables Smooth Color Shading
+ gl.glShadeModel(GL_SMOOTH);
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the canvas.
+ */
+ public void destroy()
+ {
+ //Destroy the GLContext
+ cvsDispose();
+ }
+
+
+ /**
+ * void reshape(int width, int height)
+ *
+ * Called after the first paint command.
+ */
+ public void reshape(int width, int height)
+ {
+ //Reset The Current Viewport And Perspective Transformation
+ gl.glViewport(0, 0, width, height);
+
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void display()
+ *
+ * Draw to the canvas.
+ */
+ public void display()
+ {
+ //Ensure GL is initialised correctly
+ if (glj.gljMakeCurrent(true) == false)
+ return;
+
+ //Clear The Screen And The Depth Buffer
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ //Reset The View
+ gl.glLoadIdentity();
+
+ //Move into the screen
+ gl.glTranslatef(0.0f, 0.0f, -8.0f);
+
+ //Rotate On The X Axis
+ gl.glRotatef(xrot,1.0f, 0.0f, 0.0f);
+ //Rotate On The Y Axis
+ gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);
+ //Rotate On The Z Axis
+ gl.glRotatef(zrot, 0.0f, 0.0f, 1.0f);
+
+ //Select texture
+ gl.glBindTexture(GL_TEXTURE_2D, texture[0]);
+
+ gl.glBegin(GL_QUADS);
+ //Front Face
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Top Left Of The Texture and Quad
+ //Back Face
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Bottom Left Of The Texture and Quad
+ //Top Face
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ //Bottom Face
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ //Right face
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ //Left Face
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glEnd();
+
+ //X Axis Rotation
+ xrot += 0.3f;
+ //Y Axis Rotation
+ yrot += 0.2f;
+ //Z Axis Rotation
+ zrot += 0.4f;
+
+ //Swap buffers
+ glj.gljSwap();
+ }
+
+
+ /**
+ * void keyTyped(KeyEvent e)
+ *
+ * Invoked when a key has been typed. This event occurs when a key press is followed by a key release.
+ */
+ public void keyTyped(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+
+ /**
+ * void keyPressed(KeyEvent e)
+ *
+ * Invoked when a key has been pressed.
+ */
+ public void keyPressed(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+
+ /**
+ * void keyReleased(KeyEvent e)
+ *
+ * Invoked when a key has been released.
+ */
+ public void keyReleased(KeyEvent e)
+ {
+ //We are not handling any keyboard events yet
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ }
+}
diff --git a/demos/HodglimsNeHe/Lesson6_plugin13.html b/demos/HodglimsNeHe/Lesson6_plugin13.html
new file mode 100644
index 0000000..46bfd1d
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson6_plugin13.html
@@ -0,0 +1,66 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson6 Applet: Texture Mapping</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Texture Mapping</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = "400" HEIGHT = "400" codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "Lesson6.class" WIDTH = "400" HEIGHT = "400" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "Lesson6.class" WIDTH = "400" HEIGHT = "400"></XMP>
+<PARAM NAME = CODE VALUE = "Lesson6.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "Lesson6.class" WIDTH = "400" HEIGHT = "400">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson7.html b/demos/HodglimsNeHe/Lesson7.html
new file mode 100644
index 0000000..2a69b88
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson7.html
@@ -0,0 +1,50 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson7 Applet: Texture Filters, Lighting & Keyboard Control</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Texture Filters, Lighting & Keyboard Control</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana"><B><U>Keys</U></B></FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<B>L</B> - Lights ON/OFF<BR>
+<B>F</B> - Change texture filter<BR>
+<B>PG_UP</B> - Zoom out<BR>
+<B>PG_DOWN</B> - Zoom in<BR>
+<B>UP</B> - Rotate cube<BR>
+<B>DOWN</B> - Rotate cube<BR>
+<B>LEFT</B> - Rotate cube<BR>
+<B>RIGHT</B> - Rotate cube
+</FONT>
+</P>
+<P><FONT SIZE="1" FACE="Verdana"><B>Note:</B> You must click inside the applet window before using these keys.</FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<APPLET CODE="Lesson7.class" WIDTH="400" HEIGHT="400">
+</APPLET>
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson7.java b/demos/HodglimsNeHe/Lesson7.java
new file mode 100644
index 0000000..d6f65f4
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson7.java
@@ -0,0 +1,504 @@
+/**
+ * Lesson7.java
+ *
+ * Author: Darren Hodges
+ * Date: 17/12/1999
+ *
+ * Port of the NeHe OpenGL Tutorial (Lesson 7: "Texture Filters, Lighting & Keyboard Control")
+ * to Java using the GL4Java interface to OpenGL.
+ *
+ * Note: The MipMapping code is only available in GL4Java 2.1.2.1 and later!
+ *
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+
+//GL4Java classes
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.utils.textures.*;
+
+
+public class Lesson7 extends Applet
+{
+ //Our rendering canvas
+ //We are using GLAnimCanvas because we want the canvas
+ //to be constantly redrawn
+ renderCanvas canvas = null;
+
+
+ /**
+ * void init()
+ *
+ * Initialise the applet.
+ */
+ public void init()
+ {
+ //We will use BorderLayout to layout the applet components
+ setLayout(new BorderLayout());
+
+ //Create our canvas and add it to the center of the applet
+ canvas = new renderCanvas(getSize().width, getSize().height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /**
+ * void start()
+ *
+ * Start the applet.
+ */
+ public void start()
+ {
+ //Start animating the canvas
+ canvas.start();
+ }
+
+
+ /**
+ * void stop()
+ *
+ * Stop the applet.
+ */
+ public void stop()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the applet.
+ */
+ public void destroy()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ //Destroy the canvas
+ canvas.destroy();
+ }
+
+
+
+ private class renderCanvas extends GLAnimCanvas
+ implements KeyListener, MouseListener
+ {
+ boolean light = true; //Lighting ON/OFF
+ boolean lp = false; //L Pressed?
+ boolean fp = false; //F Pressed?
+
+ float xrot = 0.0f; //X Rotation
+ float yrot = 0.0f; //Y Rotation
+ float xspeed = 0.0f; //X Rotation Speed
+ float yspeed = 0.0f; //Y Rotation Speed
+
+ float z = -8.0f; //Depth Into The Screen
+
+ //Ambient light
+ float[] LightAmbient = { 0.5f, 0.5f, 0.5f, 1.0f };
+
+ //Diffuse light
+ float[] LightDiffuse = { 1.0f, 1.0f, 1.0f, 1.0f };
+
+ //Light position
+ float[] LightPosition = { 0.0f, 0.0f, 2.0f, 1.0f };
+
+ int filter = 0; //Which Filter To Use
+
+ int[] texture = new int[3]; //Storage for 3 textures
+
+
+ /**
+ * renderCanvas(int w, int h)
+ *
+ * Constructor.
+ */
+ public renderCanvas(int w, int h)
+ {
+ super(w, h);
+
+ //Registers this canvas to process keyboard events
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+
+ /**
+ * void preInit()
+ *
+ * Called just BEFORE the GL-Context is created.
+ */
+ public void preInit()
+ {
+ //We want double buffering
+ doubleBuffer = true;
+ //But we dont want stereo view
+ stereoView = false;
+ }
+
+
+ /**
+ * void LoadGLTextures()
+ *
+ * Load textures.
+ */
+ public void LoadGLTextures()
+ {
+ PngTextureLoader texLoader = new PngTextureLoader(gl, glu);
+ texLoader.readTexture(getCodeBase(), "data/crate.png");
+
+ if(texLoader.isOk())
+ {
+ //Create Nearest Filtered Texture
+ gl.glGenTextures(3, texture);
+ gl.glBindTexture(GL_TEXTURE_2D, texture[0]);
+
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ gl.glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(),
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+
+ //Create Linear Filtered Texture
+ gl.glBindTexture(GL_TEXTURE_2D, texture[1]);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ gl.glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(),
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+
+ //Create MipMapped Texture (Only with GL4Java 2.1.2.1 and later!)
+ gl.glBindTexture(GL_TEXTURE_2D, texture[2]);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
+
+ glu.gluBuild2DMipmaps(GL_TEXTURE_2D,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(), GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+ }
+ }
+
+
+ /**
+ * void init()
+ *
+ * Called just AFTER the GL-Context is created.
+ */
+ public void init()
+ {
+ //Load The Texture(s)
+ LoadGLTextures();
+ //Enable Texture Mapping
+ gl.glEnable(GL_TEXTURE_2D);
+
+ //This Will Clear The Background Color To Black
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ //Enables Clearing Of The Depth Buffer
+ gl.glClearDepth(1.0);
+ //The Type Of Depth Test To Do
+ gl.glDepthFunc(GL_LESS);
+ //Enables Depth Testing
+ gl.glEnable(GL_DEPTH_TEST);
+
+ //Enables Smooth Color Shading
+ gl.glShadeModel(GL_SMOOTH);
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+
+ //Lights
+ gl.glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
+ gl.glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
+ gl.glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
+
+ //Enable light
+ gl.glEnable(GL_LIGHT1);
+ gl.glEnable(GL_LIGHTING);
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the canvas.
+ */
+ public void destroy()
+ {
+ //Destroy the GLContext
+ cvsDispose();
+ }
+
+
+ /**
+ * void reshape(int width, int height)
+ *
+ * Called after the first paint command.
+ */
+ public void reshape(int width, int height)
+ {
+ //Reset The Current Viewport And Perspective Transformation
+ gl.glViewport(0, 0, width, height);
+
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void display()
+ *
+ * Draw to the canvas.
+ */
+ public void display()
+ {
+ //Ensure GL is initialised correctly
+ if (glj.gljMakeCurrent(true) == false)
+ return;
+
+ //Clear The Screen And The Depth Buffer
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ //Reset The View
+ gl.glLoadIdentity();
+
+ //Move into the screen
+ gl.glTranslatef(0.0f, 0.0f, z);
+
+ //Rotate On The X Axis
+ gl.glRotatef(xrot,1.0f, 0.0f, 0.0f);
+ //Rotate On The Y Axis
+ gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);
+
+ //Select texture
+ gl.glBindTexture(GL_TEXTURE_2D, texture[filter]);
+
+ gl.glBegin(GL_QUADS);
+ //Front Face
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Top Left Of The Texture and Quad
+ //Back Face
+ gl.glNormal3f(0.0f, 0.0f, -1.0f);
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Bottom Left Of The Texture and Quad
+ //Top Face
+ gl.glNormal3f(0.0f, 1.0f, 0.0f);
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ //Bottom Face
+ gl.glNormal3f(0.0f, -1.0f, 0.0f);
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ //Right face
+ gl.glNormal3f(1.0f, 0.0f, 0.0f);
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ //Left Face
+ gl.glNormal3f(-1.0f, 0.0f, 0.0f);
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glEnd();
+
+ //X Axis Rotation
+ xrot += xspeed;
+ //Y Axis Rotation
+ yrot += yspeed;
+
+ //Swap buffers
+ glj.gljSwap();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+
+ /**
+ * void keyTyped(KeyEvent e)
+ *
+ * Invoked when a key has been typed. This event occurs when a key press is followed by a key release.
+ */
+ public void keyTyped(KeyEvent e)
+ {
+ }
+
+
+ /**
+ * void keyPressed(KeyEvent e)
+ *
+ * Invoked when a key has been pressed.
+ */
+ public void keyPressed(KeyEvent e)
+ {
+ switch(e.getKeyCode())
+ {
+ //Switch ON/OFF light when L is pressed
+ case KeyEvent.VK_L:
+ {
+ if(!lp)
+ {
+ lp = true;
+ //Toggle light
+ light = !light;
+
+ if(!light)
+ gl.glDisable(GL_LIGHTING);
+ else
+ gl.glEnable(GL_LIGHTING);
+ }
+
+ break;
+ }
+
+ //Switch filter when F is pressed
+ case KeyEvent.VK_F:
+ {
+ if(!fp)
+ {
+ fp = true;
+ //Change filter
+ filter += 1;
+ if(filter > 2)
+ filter = 0;
+ }
+
+ break;
+ }
+
+ //Move cube back when user presses PG_UP
+ case KeyEvent.VK_PAGE_UP:
+ {
+ z -= 0.2f;
+ break;
+ }
+
+ //Move cube forwards when user presses PG_DOWN
+ case KeyEvent.VK_PAGE_DOWN:
+ {
+ z += 0.2f;
+ break;
+ }
+
+ //Increase X rotation speed when user presses UP
+ case KeyEvent.VK_UP:
+ {
+ xspeed += 0.2f;
+ break;
+ }
+
+ //Decrease X rotation speed when user presses DOWN
+ case KeyEvent.VK_DOWN:
+ {
+ xspeed -= 0.2f;
+ break;
+ }
+
+ //Increase Y rotation speed when user presses RIGHT
+ case KeyEvent.VK_RIGHT:
+ {
+ yspeed += 0.2f;
+ break;
+ }
+
+ //Decrease Y rotation speed when user presses LEFT
+ case KeyEvent.VK_LEFT:
+ {
+ yspeed -= 0.2f;
+ break;
+ }
+ }
+ }
+
+
+ /**
+ * void keyReleased(KeyEvent e)
+ *
+ * Invoked when a key has been released.
+ */
+ public void keyReleased(KeyEvent e)
+ {
+ switch(e.getKeyCode())
+ {
+ //Key has been released
+ case KeyEvent.VK_L:
+ {
+ lp = false;
+ break;
+ }
+
+ //Key has been released
+ case KeyEvent.VK_F:
+ {
+ fp = false;
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/demos/HodglimsNeHe/Lesson7_plugin13.html b/demos/HodglimsNeHe/Lesson7_plugin13.html
new file mode 100644
index 0000000..81d1e43
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson7_plugin13.html
@@ -0,0 +1,81 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson7 Applet: Texture Filters, Lighting & Keyboard Control</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Texture Filters, Lighting & Keyboard Control</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana"><B><U>Keys</U></B></FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<B>L</B> - Lights ON/OFF<BR>
+<B>F</B> - Change texture filter<BR>
+<B>PG_UP</B> - Zoom out<BR>
+<B>PG_DOWN</B> - Zoom in<BR>
+<B>UP</B> - Rotate cube<BR>
+<B>DOWN</B> - Rotate cube<BR>
+<B>LEFT</B> - Rotate cube<BR>
+<B>RIGHT</B> - Rotate cube
+</FONT>
+</P>
+<P><FONT SIZE="1" FACE="Verdana"><B>Note:</B> You must click inside the applet window before using these keys.</FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = "400" HEIGHT = "400" codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "Lesson7.class" WIDTH = "400" HEIGHT = "400" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "Lesson7.class" WIDTH = "400" HEIGHT = "400"></XMP>
+<PARAM NAME = CODE VALUE = "Lesson7.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "Lesson7.class" WIDTH = "400" HEIGHT = "400">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson8.html b/demos/HodglimsNeHe/Lesson8.html
new file mode 100644
index 0000000..dd21ea2
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson8.html
@@ -0,0 +1,51 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson8 Applet: Blending</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Blending</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana"><B><U>Keys</U></B></FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<B>L</B> - Lights ON/OFF<BR>
+<B>F</B> - Change texture filter<BR>
+<B>B</B> - Blending ON/OFF<BR>
+<B>PG_UP</B> - Zoom out<BR>
+<B>PG_DOWN</B> - Zoom in<BR>
+<B>UP</B> - Rotate cube<BR>
+<B>DOWN</B> - Rotate cube<BR>
+<B>LEFT</B> - Rotate cube<BR>
+<B>RIGHT</B> - Rotate cube
+</FONT>
+</P>
+<P><FONT SIZE="1" FACE="Verdana"><B>Note:</B> You must click inside the applet window before using these keys.</FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<APPLET CODE="Lesson8.class" WIDTH="400" HEIGHT="400">
+</APPLET>
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson8.java b/demos/HodglimsNeHe/Lesson8.java
new file mode 100644
index 0000000..f8735d5
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson8.java
@@ -0,0 +1,545 @@
+/**
+ * Lesson8.java
+ *
+ * Author: Darren Hodges
+ * Date: 21/12/1999
+ *
+ * Port of the NeHe OpenGL Tutorial (Lesson 8: "Blending")
+ * to Java using the GL4Java interface to OpenGL.
+ *
+ * Note: The MipMapping code is only available in GL4Java 2.1.2.1 and later!
+ *
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+
+//GL4Java classes
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.utils.textures.*;
+
+
+public class Lesson8 extends Applet
+{
+ //Our rendering canvas
+ //We are using GLAnimCanvas because we want the canvas
+ //to be constantly redrawn
+ renderCanvas canvas = null;
+
+
+ /**
+ * void init()
+ *
+ * Initialise the applet.
+ */
+ public void init()
+ {
+ //We will use BorderLayout to layout the applet components
+ setLayout(new BorderLayout());
+
+ //Create our canvas and add it to the center of the applet
+ canvas = new renderCanvas(getSize().width, getSize().height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /**
+ * void start()
+ *
+ * Start the applet.
+ */
+ public void start()
+ {
+ //Start animating the canvas
+ canvas.start();
+ }
+
+
+ /**
+ * void stop()
+ *
+ * Stop the applet.
+ */
+ public void stop()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the applet.
+ */
+ public void destroy()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ //Destroy the canvas
+ canvas.destroy();
+ }
+
+
+
+ private class renderCanvas extends GLAnimCanvas
+ implements KeyListener, MouseListener
+ {
+ boolean light = true; //Lighting ON/OFF
+ boolean lp = false; //L Pressed?
+ boolean fp = false; //F Pressed?
+ boolean blend = true; //Blending ON/OFF
+ boolean bp = false; //B Pressed?
+
+ float xrot = 0.0f; //X Rotation
+ float yrot = 0.0f; //Y Rotation
+ float xspeed = 0.0f; //X Rotation Speed
+ float yspeed = 0.0f; //Y Rotation Speed
+
+ float z = -8.0f; //Depth Into The Screen
+
+ //Ambient light
+ float[] LightAmbient = { 0.5f, 0.5f, 0.5f, 1.0f };
+
+ //Diffuse light
+ float[] LightDiffuse = { 1.0f, 1.0f, 1.0f, 1.0f };
+
+ //Light position
+ float[] LightPosition = { 0.0f, 0.0f, 2.0f, 1.0f };
+
+ int filter = 0; //Which Filter To Use
+
+ int[] texture = new int[3]; //Storage for 3 textures
+
+
+ /**
+ * renderCanvas(int w, int h)
+ *
+ * Constructor.
+ */
+ public renderCanvas(int w, int h)
+ {
+ super(w, h);
+
+ //Registers this canvas to process keyboard events
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+
+ /**
+ * void preInit()
+ *
+ * Called just BEFORE the GL-Context is created.
+ */
+ public void preInit()
+ {
+ //We want double buffering
+ doubleBuffer = true;
+ //But we dont want stereo view
+ stereoView = false;
+ }
+
+
+ /**
+ * void LoadGLTextures()
+ *
+ * Load textures.
+ */
+ public void LoadGLTextures()
+ {
+ PngTextureLoader texLoader = new PngTextureLoader(gl, glu);
+ texLoader.readTexture(getCodeBase(), "data/glass.png");
+
+ //Full Brightness, 50% Alpha
+ gl.glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
+ //Blending Function For Translucency Based On Source Alpha Value
+ gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+
+ if(texLoader.isOk())
+ {
+ //Create Nearest Filtered Texture
+ gl.glGenTextures(3, texture);
+ gl.glBindTexture(GL_TEXTURE_2D, texture[0]);
+
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ gl.glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(),
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+
+ //Create Linear Filtered Texture
+ gl.glBindTexture(GL_TEXTURE_2D, texture[1]);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ gl.glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(),
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+
+
+ //Create MipMapped Texture (Only with GL4Java 2.1.2.1 and later!)
+ gl.glBindTexture(GL_TEXTURE_2D, texture[2]);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
+
+ glu.gluBuild2DMipmaps(GL_TEXTURE_2D,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(),
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+ }
+ }
+
+
+ /**
+ * void init()
+ *
+ * Called just AFTER the GL-Context is created.
+ */
+ public void init()
+ {
+ //Load The Texture(s)
+ LoadGLTextures();
+ //Enable Texture Mapping
+ gl.glEnable(GL_TEXTURE_2D);
+
+ //This Will Clear The Background Color To Black
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ //Enables Clearing Of The Depth Buffer
+ gl.glClearDepth(1.0);
+ //The Type Of Depth Test To Do
+ gl.glDepthFunc(GL_LESS);
+ //Enables Depth Testing
+ gl.glEnable(GL_DEPTH_TEST);
+
+ //Enables Smooth Color Shading
+ gl.glShadeModel(GL_SMOOTH);
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+
+ //Lights
+ gl.glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
+ gl.glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
+ gl.glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
+
+ //Enable light
+ gl.glEnable(GL_LIGHT1);
+ gl.glEnable(GL_LIGHTING);
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the canvas.
+ */
+ public void destroy()
+ {
+ //Destroy the GLContext
+ cvsDispose();
+ }
+
+
+ /**
+ * void reshape(int width, int height)
+ *
+ * Called after the first paint command.
+ */
+ public void reshape(int width, int height)
+ {
+ //Reset The Current Viewport And Perspective Transformation
+ gl.glViewport(0, 0, width, height);
+
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void display()
+ *
+ * Draw to the canvas.
+ */
+ public void display()
+ {
+ //Ensure GL is initialised correctly
+ if (glj.gljMakeCurrent(true) == false)
+ return;
+
+ //Clear The Screen And The Depth Buffer
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ //Reset The View
+ gl.glLoadIdentity();
+
+ //Move into the screen
+ gl.glTranslatef(0.0f, 0.0f, z);
+
+ //Rotate On The X Axis
+ gl.glRotatef(xrot,1.0f, 0.0f, 0.0f);
+ //Rotate On The Y Axis
+ gl.glRotatef(yrot, 0.0f, 1.0f, 0.0f);
+
+ //Select texture
+ gl.glBindTexture(GL_TEXTURE_2D, texture[filter]);
+
+ gl.glBegin(GL_QUADS);
+ //Front Face
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Top Left Of The Texture and Quad
+ //Back Face
+ gl.glNormal3f(0.0f, 0.0f, -1.0f);
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Bottom Left Of The Texture and Quad
+ //Top Face
+ gl.glNormal3f(0.0f, 1.0f, 0.0f);
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ //Bottom Face
+ gl.glNormal3f(0.0f, -1.0f, 0.0f);
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ //Right face
+ gl.glNormal3f(1.0f, 0.0f, 0.0f);
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, -1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, -1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f( 1.0f, 1.0f, 1.0f); //Top Left Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f( 1.0f, -1.0f, 1.0f); //Bottom Left Of The Texture and Quad
+ //Left Face
+ gl.glNormal3f(-1.0f, 0.0f, 0.0f);
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, -1.0f); //Bottom Left Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 1.0f); //Bottom Right Of The Texture and Quad
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 1.0f); //Top Right Of The Texture and Quad
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, -1.0f); //Top Left Of The Texture and Quad
+ gl.glEnd();
+
+ //X Axis Rotation
+ xrot += xspeed;
+ //Y Axis Rotation
+ yrot += yspeed;
+
+ //Swap buffers
+ glj.gljSwap();
+ }
+
+
+ /**
+ * void keyTyped(KeyEvent e)
+ *
+ * Invoked when a key has been typed. This event occurs when a key press is followed by a key release.
+ */
+ public void keyTyped(KeyEvent e)
+ {
+ }
+
+
+ /**
+ * void keyPressed(KeyEvent e)
+ *
+ * Invoked when a key has been pressed.
+ */
+ public void keyPressed(KeyEvent e)
+ {
+ switch(e.getKeyCode())
+ {
+ //Switch ON/OFF light when L is pressed
+ case KeyEvent.VK_L:
+ {
+ if(!lp)
+ {
+ lp = true;
+ //Toggle light
+ light = !light;
+
+ if(!light)
+ gl.glDisable(GL_LIGHTING);
+ else
+ gl.glEnable(GL_LIGHTING);
+ }
+
+ break;
+ }
+
+ //Switch filter when F is pressed
+ case KeyEvent.VK_F:
+ {
+ if(!fp)
+ {
+ fp = true;
+ //Change filter
+ filter += 1;
+ if(filter > 2)
+ filter = 0;
+ }
+
+ break;
+ }
+
+ //Switch blending when B is pressed
+ case KeyEvent.VK_B:
+ {
+ if(!bp)
+ {
+ bp = true;
+ //Toggle blending
+ blend = !blend;
+
+ if(blend)
+ {
+ gl.glEnable(GL_BLEND); //Turn Blending On
+ gl.glDisable(GL_DEPTH_TEST); //Turn Depth Testing Off
+ }
+ else
+ {
+ gl.glDisable(GL_BLEND); //Turn Blending Off
+ gl.glEnable(GL_DEPTH_TEST); //Turn Depth Testing On
+ }
+ }
+
+ break;
+ }
+
+ //Move cube back when user presses PG_UP
+ case KeyEvent.VK_PAGE_UP:
+ {
+ z -= 0.2f;
+ break;
+ }
+
+ //Move cube forwards when user presses PG_DOWN
+ case KeyEvent.VK_PAGE_DOWN:
+ {
+ z += 0.2f;
+ break;
+ }
+
+ //Increase X rotation speed when user presses UP
+ case KeyEvent.VK_UP:
+ {
+ xspeed += 0.2f;
+ break;
+ }
+
+ //Decrease X rotation speed when user presses DOWN
+ case KeyEvent.VK_DOWN:
+ {
+ xspeed -= 0.2f;
+ break;
+ }
+
+ //Increase Y rotation speed when user presses RIGHT
+ case KeyEvent.VK_RIGHT:
+ {
+ yspeed += 0.2f;
+ break;
+ }
+
+ //Decrease Y rotation speed when user presses LEFT
+ case KeyEvent.VK_LEFT:
+ {
+ yspeed -= 0.2f;
+ break;
+ }
+ }
+ }
+
+
+ /**
+ * void keyReleased(KeyEvent e)
+ *
+ * Invoked when a key has been released.
+ */
+ public void keyReleased(KeyEvent e)
+ {
+ switch(e.getKeyCode())
+ {
+ //Key has been released
+ case KeyEvent.VK_L:
+ {
+ lp = false;
+ break;
+ }
+
+ //Key has been released
+ case KeyEvent.VK_F:
+ {
+ fp = false;
+ break;
+ }
+
+ //Key has been released
+ case KeyEvent.VK_B:
+ {
+ bp = false;
+ break;
+ }
+ }
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ }
+}
diff --git a/demos/HodglimsNeHe/Lesson8_plugin13.html b/demos/HodglimsNeHe/Lesson8_plugin13.html
new file mode 100644
index 0000000..e774d49
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson8_plugin13.html
@@ -0,0 +1,82 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson8 Applet: Blending</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Blending</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana"><B><U>Keys</U></B></FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<B>L</B> - Lights ON/OFF<BR>
+<B>F</B> - Change texture filter<BR>
+<B>B</B> - Blending ON/OFF<BR>
+<B>PG_UP</B> - Zoom out<BR>
+<B>PG_DOWN</B> - Zoom in<BR>
+<B>UP</B> - Rotate cube<BR>
+<B>DOWN</B> - Rotate cube<BR>
+<B>LEFT</B> - Rotate cube<BR>
+<B>RIGHT</B> - Rotate cube
+</FONT>
+</P>
+<P><FONT SIZE="1" FACE="Verdana"><B>Note:</B> You must click inside the applet window before using these keys.</FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = "400" HEIGHT = "400" codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "Lesson8.class" WIDTH = "400" HEIGHT = "400" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "Lesson8.class" WIDTH = "400" HEIGHT = "400"></XMP>
+<PARAM NAME = CODE VALUE = "Lesson8.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "Lesson8.class" WIDTH = "400" HEIGHT = "400">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson9.html b/demos/HodglimsNeHe/Lesson9.html
new file mode 100644
index 0000000..2c7b6bb
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson9.html
@@ -0,0 +1,47 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson9 Applet: Moving Bitmaps In 3D Space</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Moving Bitmaps In 3D Space</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana"><B><U>Keys</U></B></FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<B>T</B> - Twinkle ON/OFF<BR>
+<B>PG_UP</B> - Zoom out<BR>
+<B>PG_DOWN</B> - Zoom in<BR>
+<B>UP</B> - Rotate up<BR>
+<B>DOWN</B> - Rotate down
+</FONT>
+</P>
+<P><FONT SIZE="1" FACE="Verdana"><B>Note:</B> You must click inside the applet window before using these keys.</FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<APPLET CODE="Lesson9.class" WIDTH="400" HEIGHT="400">
+</APPLET>
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/Lesson9.java b/demos/HodglimsNeHe/Lesson9.java
new file mode 100644
index 0000000..4c4a92d
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson9.java
@@ -0,0 +1,451 @@
+/**
+ * Lesson9.java
+ *
+ * Author: Darren Hodges
+ * Date: 21/12/1999
+ *
+ * Port of the NeHe OpenGL Tutorial (Lesson 9: "Moving Bitmaps In 3D Space")
+ * to Java using the GL4Java interface to OpenGL.
+ *
+ */
+
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+
+//GL4Java classes
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.utils.textures.*;
+
+
+public class Lesson9 extends Applet
+{
+ //Our rendering canvas
+ //We are using GLAnimCanvas because we want the canvas
+ //to be constantly redrawn
+ renderCanvas canvas = null;
+
+
+ /**
+ * void init()
+ *
+ * Initialise the applet.
+ */
+ public void init()
+ {
+ //We will use BorderLayout to layout the applet components
+ setLayout(new BorderLayout());
+
+ //Create our canvas and add it to the center of the applet
+ canvas = new renderCanvas(getSize().width, getSize().height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /**
+ * void start()
+ *
+ * Start the applet.
+ */
+ public void start()
+ {
+ //Start animating the canvas
+ canvas.start();
+ }
+
+
+ /**
+ * void stop()
+ *
+ * Stop the applet.
+ */
+ public void stop()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the applet.
+ */
+ public void destroy()
+ {
+ //Stop animating the canvas
+ canvas.stop();
+ //Destroy the canvas
+ canvas.destroy();
+ }
+
+
+
+ private class renderCanvas extends GLAnimCanvas
+ implements KeyListener, MouseListener
+ {
+ boolean twinkle = true; //Twinkling stars
+ boolean tp = false; //T Pressed?
+ final int NUM = 50; //NUMber of stars to draw
+
+ Star[] star = new Star[NUM]; //Array of stars
+
+ float zoom = -15.0f; //Viewing Distance Away From Stars
+ float tilt = 90.0f; //Tilt The View
+ float spin = 0.0f; //Spin Twinkling Stars
+
+ int loop = 0; //General loop Variable
+
+ int[] texture = new int[1]; //Storage For One Texture
+
+
+ /**
+ * renderCanvas(int w, int h)
+ *
+ * Constructor.
+ */
+ public renderCanvas(int w, int h)
+ {
+ super(w, h);
+
+ //Registers this canvas to process keyboard events
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+
+ /**
+ * void preInit()
+ *
+ * Called just BEFORE the GL-Context is created.
+ */
+ public void preInit()
+ {
+ //We want double buffering
+ doubleBuffer = true;
+ //But we dont want stereo view
+ stereoView = false;
+ }
+
+
+ /**
+ * void LoadGLTextures()
+ *
+ * Load textures.
+ */
+ public void LoadGLTextures()
+ {
+ PngTextureLoader texLoader = new PngTextureLoader(gl, glu);
+ texLoader.readTexture(getCodeBase(), "data/star.png");
+
+ if(texLoader.isOk())
+ {
+ //Create Texture
+ gl.glGenTextures(1, texture);
+ gl.glBindTexture(GL_TEXTURE_2D, texture[0]);
+
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ gl.glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ 3,
+ texLoader.getImageWidth(),
+ texLoader.getImageHeight(),
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ texLoader.getTexture());
+ }
+ }
+
+
+ /**
+ * void init()
+ *
+ * Called just AFTER the GL-Context is created.
+ */
+ public void init()
+ {
+ //Load The Texture(s)
+ LoadGLTextures();
+ //Enable Texture Mapping
+ gl.glEnable(GL_TEXTURE_2D);
+
+ //This Will Clear The Background Color To Black
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ //Enables Clearing Of The Depth Buffer
+ gl.glClearDepth(1.0);
+
+ //Enables Smooth Color Shading
+ gl.glShadeModel(GL_SMOOTH);
+
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+
+ //Set The Blending Function For Translucency
+ gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ //Enable Blending
+ gl.glEnable(GL_BLEND);
+
+ //Create A Loop That Goes Through All The Stars
+ for(loop = 0; loop < NUM; loop++)
+ {
+ star[loop] = new Star();
+ star[loop].angle = 0.0f; //Start All The Stars At Angle Zero
+ star[loop].dist = ((float)(loop) / NUM) * 5.0f; //Calculate Distance From The Center
+ star[loop].r = (byte)(256 * Math.random()); //Give star[loop] A Random Red Intensity
+ star[loop].g = (byte)(256 * Math.random()); //Give star[loop] A Random Green Intensity
+ star[loop].b = (byte)(256 * Math.random()); //Give star[loop] A Random Blue Intensity
+ }
+ }
+
+
+ /**
+ * void destroy()
+ *
+ * Destroy the canvas.
+ */
+ public void destroy()
+ {
+ //Destroy the GLContext
+ cvsDispose();
+ }
+
+
+ /**
+ * void reshape(int width, int height)
+ *
+ * Called after the first paint command.
+ */
+ public void reshape(int width, int height)
+ {
+ //Reset The Current Viewport And Perspective Transformation
+ gl.glViewport(0, 0, width, height);
+
+ //Select The Projection Matrix
+ gl.glMatrixMode(GL_PROJECTION);
+ //Reset The Projection Matrix
+ gl.glLoadIdentity();
+ //Calculate The Aspect Ratio Of The Window
+ glu.gluPerspective(45.0f, (float)getSize().width / (float)getSize().height, 0.1f, 100.0f);
+ //Select The Modelview Matrix
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+
+ /**
+ * void display()
+ *
+ * Draw to the canvas.
+ */
+ public void display()
+ {
+ //Ensure GL is initialised correctly
+ if (glj.gljMakeCurrent(true) == false)
+ return;
+
+ //Clear The Screen And The Depth Buffer
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ //Select Our Texture
+ gl.glBindTexture(GL_TEXTURE_2D, texture[0]);
+
+ //Loop Through All The Stars
+ for(loop = 0; loop < NUM; loop++)
+ {
+ gl.glLoadIdentity(); //Reset The View Before We Draw Each Star
+ gl.glTranslatef(0.0f, 0.0f, zoom); //Zoom Into The Screen (Using The Value In 'zoom')
+ gl.glRotatef(tilt, 1.0f, 0.0f, 0.0f); //Tilt The View (Using The Value In 'tilt')
+ gl.glRotatef(star[loop].angle, 0.0f, 1.0f, 0.0f); //Rotate To The Current Stars Angle
+ gl.glTranslatef(star[loop].dist, 0.0f, 0.0f); //Move Forward On The X Plane
+ gl.glRotatef(-star[loop].angle, 0.0f, 1.0f, 0.0f); //Cancel The Current Stars Angle
+ gl.glRotatef(-tilt, 1.0f, 0.0f, 0.0f); //Cancel The Screen Tilt
+
+ //Twinkling Stars Enabled
+ if(twinkle)
+ {
+ //Assign A Color Using Bytes
+ gl.glColor4ub(star[(NUM - loop) - 1].r, star[(NUM - loop) - 1].g, star[(NUM - loop) - 1].b, (byte)255);
+ gl.glBegin(GL_QUADS); //Begin Drawing The Textured Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 0.0f);
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(1.0f, -1.0f, 0.0f);
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(1.0f, 1.0f, 0.0f);
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 0.0f);
+ gl.glEnd(); //Done Drawing The Textured Quad
+ }
+
+ gl. glRotatef(spin,0.0f,0.0f,1.0f); //Rotate The Star On The Z Axis
+ //Assign A Color Using Bytes
+ gl.glColor4ub(star[loop].r, star[loop].g, star[loop].b, (byte)255);
+ gl.glBegin(GL_QUADS); //Begin Drawing The Textured Quad
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, -1.0f, 0.0f);
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f(1.0f,-1.0f, 0.0f);
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f(1.0f, 1.0f, 0.0f);
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 1.0f, 0.0f);
+ gl.glEnd(); //Done Drawing The Textured Quad
+
+ spin += 0.01f; //Used To Spin The Stars
+ star[loop].angle += (float)(loop / (float)NUM); //Changes The Angle Of A Star
+ star[loop].dist -= 0.01f; //Changes The Distance Of A Star
+
+ //Is The Star In The Middle Yet?
+ if(star[loop].dist < 0.0f)
+ {
+ star[loop].dist += 5.0f; //Move The Star 5 Units From The Center
+ star[loop].r = (byte)(256 * Math.random()); //Give It A New Red Value
+ star[loop].g = (byte)(256 * Math.random()); //Give It A New Green Value
+ star[loop].b = (byte)(256 * Math.random()); //Give It A New Blue Value
+ }
+ }
+
+ //Swap buffers
+ glj.gljSwap();
+ }
+
+
+ /**
+ * void keyTyped(KeyEvent e)
+ *
+ * Invoked when a key has been typed. This event occurs when a key press is followed by a key release.
+ */
+ public void keyTyped(KeyEvent e)
+ {
+ }
+
+
+ /**
+ * void keyPressed(KeyEvent e)
+ *
+ * Invoked when a key has been pressed.
+ */
+ public void keyPressed(KeyEvent e)
+ {
+ switch(e.getKeyCode())
+ {
+ //Switch ON/OFF twinkle when T is pressed
+ case KeyEvent.VK_T:
+ {
+ if(!tp)
+ {
+ tp = true;
+ //Toggle twinkle
+ twinkle = !twinkle;
+ }
+
+ break;
+ }
+
+ //Tilt screen up when user presses UP
+ case KeyEvent.VK_UP:
+ {
+ //Tilt The Screen Up
+ tilt -= 0.5f;
+ break;
+ }
+
+ //Tilt screen down when user presses DOWN
+ case KeyEvent.VK_DOWN:
+ {
+ //Tilt The Screen Down
+ tilt += 0.5f;
+ break;
+ }
+
+ //Zoom out when user presses PG_UP
+ case KeyEvent.VK_PAGE_UP:
+ {
+ //Zoom out
+ zoom -= 0.2f;
+ break;
+ }
+
+ //Zoom in when user presses PG_DOWN
+ case KeyEvent.VK_PAGE_DOWN:
+ {
+ //Zoom in
+ zoom += 0.2f;
+ break;
+ }
+ }
+ }
+
+
+ /**
+ * void keyReleased(KeyEvent e)
+ *
+ * Invoked when a key has been released.
+ */
+ public void keyReleased(KeyEvent e)
+ {
+ switch(e.getKeyCode())
+ {
+ //Key has been released
+ case KeyEvent.VK_T:
+ {
+ tp = false;
+ break;
+ }
+ }
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ }
+
+
+
+ public class Star
+ {
+ byte r, g, b; //Stars colour
+ float dist; //Stars distance from center
+ float angle; //Stars current angle
+
+
+ /**
+ * Star()
+ *
+ * Constructor.
+ */
+ public Star()
+ {
+ r = g = b = 0;
+ dist = angle = 0.0f;
+ }
+ }
+}
diff --git a/demos/HodglimsNeHe/Lesson9_plugin13.html b/demos/HodglimsNeHe/Lesson9_plugin13.html
new file mode 100644
index 0000000..18b6f52
--- /dev/null
+++ b/demos/HodglimsNeHe/Lesson9_plugin13.html
@@ -0,0 +1,78 @@
+<HTML>
+<HEAD>
+<TITLE>Lesson9 Applet: Moving Bitmaps In 3D Space</TITLE>
+<STYLE TYPE="text/css">
+<!--
+A:link { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:visited { COLOR: #9C9AB1; TEXT-DECORATION: none }
+A:active { color: Yellow; TEXT-DECORATION: none }
+A:hover { color: Yellow; TEXT-DECORATION: none }
+-->
+</STYLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<CENTER>
+<P>
+<FONT SIZE="2" FACE="Verdana"><B>Moving Bitmaps In 3D Space</B></FONT>
+</P>
+<TABLE WIDTH="100%">
+<TR>
+<TD WIDTH="30%" ALIGN="LEFT" VALIGN="TOP">
+<P>
+<FONT SIZE="1" FACE="Verdana"><B><U>Keys</U></B></FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<B>T</B> - Twinkle ON/OFF<BR>
+<B>PG_UP</B> - Zoom out<BR>
+<B>PG_DOWN</B> - Zoom in<BR>
+<B>UP</B> - Rotate up<BR>
+<B>DOWN</B> - Rotate down
+</FONT>
+</P>
+<P><FONT SIZE="1" FACE="Verdana"><B>Note:</B> You must click inside the applet window before using these keys.</FONT></P>
+<P>
+<FONT SIZE="1" FACE="Verdana">
+<A HREF="index.html">Go back</A>
+</FONT>
+</P>
+</TD>
+<TD WIDTH="70%" ALIGN="CENTER" VALIGN="TOP">
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = "400" HEIGHT = "400" codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "Lesson9.class" WIDTH = "400" HEIGHT = "400" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "Lesson9.class" WIDTH = "400" HEIGHT = "400"></XMP>
+<PARAM NAME = CODE VALUE = "Lesson9.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "Lesson9.class" WIDTH = "400" HEIGHT = "400">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+</TD>
+</TR>
+</TABLE>
+</CENTER>
+</BODY>
+</HTML>
diff --git a/demos/HodglimsNeHe/data/Star.png b/demos/HodglimsNeHe/data/Star.png
new file mode 100644
index 0000000..e933c74
--- /dev/null
+++ b/demos/HodglimsNeHe/data/Star.png
Binary files differ
diff --git a/demos/HodglimsNeHe/data/crate.png b/demos/HodglimsNeHe/data/crate.png
new file mode 100644
index 0000000..41d120f
--- /dev/null
+++ b/demos/HodglimsNeHe/data/crate.png
Binary files differ
diff --git a/demos/HodglimsNeHe/data/cube.png b/demos/HodglimsNeHe/data/cube.png
new file mode 100644
index 0000000..40d08ac
--- /dev/null
+++ b/demos/HodglimsNeHe/data/cube.png
Binary files differ
diff --git a/demos/HodglimsNeHe/data/glass.png b/demos/HodglimsNeHe/data/glass.png
new file mode 100644
index 0000000..8fd87b1
--- /dev/null
+++ b/demos/HodglimsNeHe/data/glass.png
Binary files differ
diff --git a/demos/HodglimsNeHe/data/nehe.png b/demos/HodglimsNeHe/data/nehe.png
new file mode 100644
index 0000000..0cbdc4d
--- /dev/null
+++ b/demos/HodglimsNeHe/data/nehe.png
Binary files differ
diff --git a/demos/HodglimsNeHe/data/tim.png b/demos/HodglimsNeHe/data/tim.png
new file mode 100644
index 0000000..e1922d6
--- /dev/null
+++ b/demos/HodglimsNeHe/data/tim.png
Binary files differ
diff --git a/demos/HodglimsNeHe/index.html b/demos/HodglimsNeHe/index.html
new file mode 100644
index 0000000..88ac1fb
--- /dev/null
+++ b/demos/HodglimsNeHe/index.html
@@ -0,0 +1,38 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Ron Cemer & Sven Goethel">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Misc Demos</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<p>Here are the
+<a href="http://nehe.gamedev.net/opengl.asp">NeHe OpenGL Tutorial Demos</a>
+originally ported by
+<a href="http://dev.knowledgeassociates.com/Hodglim/nehe/nehe.shtml">Hodglim</a>
+for <B> GL4Java >= 2.4.0.0: </B> <br>
+<br>
+This demos have added <I>requestFocus()</I> statements,
+especially for the events: <I>mouseEntered</I> and <I>mouseClicked</I> !<br>
+<br>
+<p><a href="index_plugin13.html">To use the Java2 Plug-In (Java2, JRE, Plug-In 1.3), click here !</a><br>
+<br>
+<br>
+ <p>&nbsp;<a href="Lesson1.html">Lesson 1</a> : Lesson 1 - Setting Up OpenGL In Windows
+ <p>&nbsp;<a href="Lesson2.html">Lesson 2</a> : Lesson 2 - Your First Polygon
+ <p>&nbsp;<a href="Lesson3.html">Lesson 3</a> : Lesson 3 - Colors
+ <p>&nbsp;<a href="Lesson4.html">Lesson 4</a> : Lesson 4 - Rotation
+ <p>&nbsp;<a href="Lesson5.html">Lesson 5</a> : Lesson 5 - Solid Objects
+ <p>&nbsp;<a href="Lesson6.html">Lesson 6</a> : Lesson 6 - Texture Mapping
+ <p>&nbsp;<a href="Lesson7.html">Lesson 7</a> : Lesson 7 - Texture Filters, Lighting & Keyboard Control
+ <p>&nbsp;<a href="Lesson8.html">Lesson 8</a> : Lesson 8 - Blending
+ <p>&nbsp;<a href="Lesson9.html">Lesson 9</a> : Lesson 9 - Moving Bitmaps In 3D Space
+<p>&nbsp;<a href="Lesson11.html">Lesson 11</a> : Lesson 11 - OpenGL Flag Effect
+<p>&nbsp;<a href="Lesson12.html">Lesson 12</a> : Lesson 12 - Display Lists
+<p>&nbsp;<a href="Lesson16.html">Lesson 16</a> : Lesson 16 - Cool Looking Fog
+<p>&nbsp;<a href="Lesson18.html">Lesson 18</a> : Lesson 18 - Quadratics
+<br>
+<br>
+</body>
+</html>
diff --git a/demos/HodglimsNeHe/index_plugin13.html b/demos/HodglimsNeHe/index_plugin13.html
new file mode 100644
index 0000000..754940c
--- /dev/null
+++ b/demos/HodglimsNeHe/index_plugin13.html
@@ -0,0 +1,41 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Ron Cemer & Sven Goethel">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Misc Demos</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<p>Here are the
+<a href="http://nehe.gamedev.net/opengl.asp">NeHe OpenGL Tutorial Demos</a>
+originally ported by
+<a href="http://dev.knowledgeassociates.com/Hodglim/nehe/nehe.shtml">Hodglim</a>
+for <B> GL4Java >= 2.4.0.0: </B> <br>
+<br>
+This demos have added <I>requestFocus()</I> statements,
+especially for the events: <I>mouseEntered</I> and <I>mouseClicked</I> !<br>
+<br>
+<hr>
+<br>&nbsp;
+<a href="../../Installer/java.policy">The Java2 (sdk, jre, plugin 1.3) policy file example to give GL4Java the necessary permissions (Click here) !</a>
+<br>&nbsp;
+<hr>
+<br>
+ <p>&nbsp;<a href="Lesson1_plugin13.html">Lesson 1</a> : Lesson 1 - Setting Up OpenGL In Windows
+ <p>&nbsp;<a href="Lesson2_plugin13.html">Lesson 2</a> : Lesson 2 - Your First Polygon
+ <p>&nbsp;<a href="Lesson3_plugin13.html">Lesson 3</a> : Lesson 3 - Colors
+ <p>&nbsp;<a href="Lesson4_plugin13.html">Lesson 4</a> : Lesson 4 - Rotation
+ <p>&nbsp;<a href="Lesson5_plugin13.html">Lesson 5</a> : Lesson 5 - Solid Objects
+ <p>&nbsp;<a href="Lesson6_plugin13.html">Lesson 6</a> : Lesson 6 - Texture Mapping
+ <p>&nbsp;<a href="Lesson7_plugin13.html">Lesson 7</a> : Lesson 7 - Texture Filters, Lighting & Keyboard Control
+ <p>&nbsp;<a href="Lesson8_plugin13.html">Lesson 8</a> : Lesson 8 - Blending
+ <p>&nbsp;<a href="Lesson9_plugin13.html">Lesson 9</a> : Lesson 9 - Moving Bitmaps In 3D Space
+<p>&nbsp;<a href="Lesson11_plugin13.html">Lesson 11</a> : Lesson 11 - OpenGL Flag Effect
+<p>&nbsp;<a href="Lesson12_plugin13.html">Lesson 12</a> : Lesson 12 - Display Lists
+<p>&nbsp;<a href="Lesson16_plugin13.html">Lesson 16</a> : Lesson 16 - Cool Looking Fog
+<p>&nbsp;<a href="Lesson18_plugin13.html">Lesson 18</a> : Lesson 18 - Quadratics
+<br>
+<br>
+</body>
+</html>
diff --git a/demos/Java2Applet.bat b/demos/Java2Applet.bat
new file mode 100755
index 0000000..d43b97d
--- /dev/null
+++ b/demos/Java2Applet.bat
@@ -0,0 +1 @@
+appletviewer.exe -J-Djava.security.policy=gl4java.policy glLogoCvsApplet.html
diff --git a/demos/Java2AppletB.bat b/demos/Java2AppletB.bat
new file mode 100755
index 0000000..be9d7a4
--- /dev/null
+++ b/demos/Java2AppletB.bat
@@ -0,0 +1 @@
+appletviewer.exe -J-Djava.security.policy=gl4java.policy glOlympicCvsApplet.html
diff --git a/demos/Java2AppletC.bat b/demos/Java2AppletC.bat
new file mode 100755
index 0000000..cd2c22e
--- /dev/null
+++ b/demos/Java2AppletC.bat
@@ -0,0 +1 @@
+appletviewer.exe -J-Djava.security.policy=gl4java.policy testTextPPM1.html
diff --git a/demos/MiscDemos/DrawColoredPrimitives.html b/demos/MiscDemos/DrawColoredPrimitives.html
new file mode 100644
index 0000000..a812c94
--- /dev/null
+++ b/demos/MiscDemos/DrawColoredPrimitives.html
@@ -0,0 +1,14 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<applet code="DrawColoredPrimitives.class" width=500 height=300>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/DrawColoredPrimitives.java b/demos/MiscDemos/DrawColoredPrimitives.java
new file mode 100755
index 0000000..0e6725b
--- /dev/null
+++ b/demos/MiscDemos/DrawColoredPrimitives.java
@@ -0,0 +1,142 @@
+/**
+ * @(#) DrawColoredPrimitives.java
+ * @(#) author: Joe Zimmerman (converted to Java by Sven Goethel)
+ */
+
+/* This program is free software under the license of LGPL */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class DrawColoredPrimitives extends SimpleGLAnimApplet1
+{
+
+ public void init(int w, int h)
+ {
+ super.init();
+ canvas = new gldemo(w, h);
+ add("Center", canvas);
+ }
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new gldemo(d.width, d.height);
+ add("Center", canvas);
+ }
+
+ public static void main( String args[] ) {
+ DrawColoredPrimitives applet =
+ new DrawColoredPrimitives();
+
+ Frame f = new Frame("DrawColoredPrimitives");
+
+ f.addWindowListener( new WindowAdapter()
+ {
+ public void windowClosed(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ public void windowClosing(WindowEvent e)
+ {
+ windowClosed(e);
+ }
+ }
+ );
+
+ f.setLayout(new BorderLayout());
+ f.add("Center", applet);
+ applet.init(500,300);
+ applet.start();
+ Dimension ps = applet.getPreferredSize();
+ f.setBounds(-100,-100,99,99);
+ f.setVisible(true);
+ f.setVisible(false);
+ Insets i = f.getInsets();
+ f.setBounds(0,0,
+ ps.width+i.left+i.right,
+ ps.height+i.top+i.bottom);
+ f.setVisible(true);
+ }
+
+ private class gldemo extends GLAnimCanvas
+ {
+ float rotate;
+
+ float LightAmbient[] = { 0.75f, 0.75f, 0.75f, 1.5f};
+ float LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 0.9f};
+ float LightSpecular[] = { 0.8f, 0.8f, 0.8f, 1.0f};
+
+ public gldemo(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ reshape(getSize().width, getSize().height);
+
+ gl.glEnable(GL_LIGHT0);
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, LightSpecular);
+
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective(45, (float)width/(float)height, 1, 700);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glViewport(0,0,width,height);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+
+ gl.glColor4f(1, 1, 1, 1);
+
+ rotate++;
+
+ gl.glTranslatef(0, 0, -5);
+ gl.glRotatef(rotate, 0, 1, 0);
+ gl.glBegin(GL_POLYGON);
+ gl.glNormal3f( 1, 0, 0);
+ gl.glColor4f(1, 0, 0, 1); gl.glVertex3f( 0, 1, 0);
+ gl.glColor4f(0, 1, 0, 1); gl.glVertex3f(-1, -1, 0);
+ gl.glColor4f(0, 0, 1, 1); gl.glVertex3f( 1, -1, 0);
+ gl.glEnd();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+ }
+}
diff --git a/demos/MiscDemos/DrawColoredPrimitives2.html b/demos/MiscDemos/DrawColoredPrimitives2.html
new file mode 100644
index 0000000..6881a77
--- /dev/null
+++ b/demos/MiscDemos/DrawColoredPrimitives2.html
@@ -0,0 +1,16 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Press the Right-Mouse Button for a Menu !
+<br>
+<hr>
+<applet code="DrawColoredPrimitives2.class" width=500 height=300>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/DrawColoredPrimitives2.java b/demos/MiscDemos/DrawColoredPrimitives2.java
new file mode 100644
index 0000000..fad8668
--- /dev/null
+++ b/demos/MiscDemos/DrawColoredPrimitives2.java
@@ -0,0 +1,302 @@
+/**
+ * @(#) DrawColoredPrimitives2.java
+ * @(#) author: Joe Zimmerman (converted to Java by Sven Goethel)
+ */
+
+/* This program is free software under the license of LGPL */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class DrawColoredPrimitives2 extends SimpleGLAnimApplet1
+{
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new gldemo(d.width, d.height);
+ add("Center", canvas);
+ }
+
+ public static void main( String args[] ) {
+ DrawColoredPrimitives2 applet =
+ new DrawColoredPrimitives2();
+
+ Frame f = new Frame("DrawColoredPrimitives2");
+
+ f.addWindowListener( new WindowAdapter()
+ {
+ public void windowClosed(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ public void windowClosing(WindowEvent e)
+ {
+ windowClosed(e);
+ }
+ }
+ );
+
+ f.setLayout(new BorderLayout());
+ f.add("Center", applet);
+ applet.setSize(500,300);
+ applet.init();
+ applet.start();
+ Dimension ps = applet.getPreferredSize();
+ f.setBounds(-100,-100,99,99);
+ f.setVisible(true);
+ f.setVisible(false);
+ Insets i = f.getInsets();
+ f.setBounds(0,0,
+ ps.width+i.left+i.right,
+ ps.height+i.top+i.bottom);
+ f.setVisible(true);
+ }
+
+ private class gldemo extends GLAnimCanvas
+ implements MouseListener, ActionListener
+ {
+ private PopupMenu menu = null;
+ private boolean menu_showing = false;
+ private boolean save_suspended = false;
+ private final String VIEW_FRONT = "View Front";
+ private final String VIEW_TOP = "View Top";
+ private final String VIEW_BOTTOM = "View Bottom";
+
+ final float M_PI = 3.14159265f;
+ final float M_PI_2 = 1.57079632f;
+ float rotate;
+ float rotationStep = 1;
+ int view = 0; /* 0 = front, 1 = top, 2 = bottom */
+
+ float LightAmbient[] = { 0.75f, 0.75f, 0.75f, 1.5f};
+ float LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 0.9f};
+ float LightSpecular[] = { 0.8f, 0.8f, 0.8f, 1.0f};
+
+ public gldemo(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ reshape(getSize().width, getSize().height);
+
+ gl.glEnable(GL_LIGHT0);
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, LightSpecular);
+
+ glj.gljCheckGL();
+
+ menu = new PopupMenu("Options");
+ menu.add(VIEW_FRONT);
+ menu.add(VIEW_TOP);
+ menu.add(VIEW_BOTTOM);
+ menu.addActionListener(this);
+ add(menu);
+
+ addMouseListener(this);
+ }
+
+ public void doCleanup()
+ {
+ removeMouseListener(this);
+ menu.removeActionListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective(45, (float)width/(float)height, 1, 700);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glViewport(0,0,width,height);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+
+ gl.glTranslatef(0, 0, -5);
+
+ if(view==1)
+ {
+ gl.glRotatef(90f, 1, 0, 0);
+ } else if(view==2)
+ {
+ gl.glRotatef(-90f, 1, 0, 0);
+ }
+
+ gl.glColor4f(1, 1, 1, 1);
+
+ rotate+=rotationStep;
+ if(rotate>=180.0f || rotate<=0.0f)
+ rotationStep*=-1.0f;
+
+ gl.glRotatef(rotate, 0, 1, 0);
+
+
+ gl.glBegin(GL_POLYGON);
+ gl.glNormal3f( 1, 0, 0);
+
+ // top vertex
+ gl.glColor4f(1, 0, 0, 1); gl.glVertex3f( 0, 1, 0);
+ // bottom left vertex
+ gl.glColor4f(0, 1, 0, 1); gl.glVertex3f(-1, -1, 1);
+ // bottom right vertex
+ gl.glColor4f(0, 0, 1, 1); gl.glVertex3f( 1, -1, 1);
+ gl.glEnd();
+
+ gl.glBegin(GL_POLYGON);
+ gl.glNormal3f( 1, 0, 0);
+
+ // top vertex
+ gl.glColor4f(1, 0, 0, 1); gl.glVertex3f( 0, 1, 0);
+ // bottom left vertex
+ gl.glColor4f(0, 1, 0, 1); gl.glVertex3f( 1, -1, -1);
+ // bottom right vertex
+ gl.glColor4f(0, 0, 1, 1); gl.glVertex3f( 1, -1, 1);
+ gl.glEnd();
+
+ gl.glBegin(GL_POLYGON);
+ gl.glNormal3f( 1, 0, 0);
+
+ // top vertex
+ gl.glColor4f(1, 0, 0, 1); gl.glVertex3f( 0, 1, 0);
+ // bottom left vertex
+ gl.glColor4f(0, 1, 0, 1); gl.glVertex3f( 1, -1, -1);
+ // bottom right vertex
+ gl.glColor4f(0, 0, 1, 1); gl.glVertex3f(-1, -1, -1);
+ gl.glEnd();
+
+ gl.glBegin(GL_POLYGON);
+ gl.glNormal3f( 1, 0, 0);
+
+ // top vertex
+ gl.glColor4f(1, 0, 0, 1); gl.glVertex3f( 0, 1, 0);
+ // bottom left vertex
+ gl.glColor4f(0, 1, 0, 1); gl.glVertex3f(-1, -1, 1);
+ // bottom right vertex
+ gl.glColor4f(0, 0, 1, 1); gl.glVertex3f(-1, -1, -1);
+ gl.glEnd();
+
+
+ // bottom square polygon
+ gl.glBegin(GL_POLYGON);
+ gl.glNormal3f( 1, 0, 0);
+
+ gl.glColor4f(0, 0, 1, 1); gl.glVertex3f( 1, -1, 1);
+ gl.glColor4f(0, 1, 0, 1); gl.glVertex3f(-1, -1, 1);
+ gl.glColor4f(0, 0, 1, 1); gl.glVertex3f(-1, -1, -1);
+ gl.glColor4f(0, 1, 0, 1); gl.glVertex3f( 1, -1, -1);
+ gl.glEnd();
+
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered(MouseEvent evt)
+ {
+ }
+
+ public void mouseExited(MouseEvent evt)
+ {
+ }
+
+ public void mousePressed(MouseEvent evt)
+ {
+ if (!menu_showing)
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ menu_showing = true;
+ save_suspended = isSuspended();
+ if (!save_suspended)
+ {
+ setSuspended(true);
+ repaint(100);
+ try
+ {
+ Thread.currentThread().sleep(200);
+ }
+ catch (Exception e)
+ { }
+ }
+ menu.show(this,evt.getX(),evt.getY());
+ }
+ else
+ {
+ // Must be left button.
+ if (isSuspended()) repaint();
+ }
+ }
+ else
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+
+ public void mouseReleased(MouseEvent evt)
+ {
+ }
+
+ public void mouseClicked(MouseEvent evt)
+ {
+ }
+
+ // Method required for the implementation of ActionListener
+ public void actionPerformed(ActionEvent evt)
+ {
+ String c = evt.getActionCommand();
+ if (c.equals(VIEW_FRONT))
+ {
+ view=0;
+ }
+ else if (c.equals(VIEW_TOP))
+ {
+ view=1;
+ }
+ else if (c.equals(VIEW_BOTTOM))
+ {
+ view=2;
+ }
+ if (menu_showing)
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+
+
+
+ }
+}
diff --git a/demos/MiscDemos/DrawColoredPrimitives2_plugin13.html b/demos/MiscDemos/DrawColoredPrimitives2_plugin13.html
new file mode 100644
index 0000000..ba23c36
--- /dev/null
+++ b/demos/MiscDemos/DrawColoredPrimitives2_plugin13.html
@@ -0,0 +1,48 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Press the Right-Mouse Button for a Menu !
+<br>
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 500 HEIGHT = 300 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "DrawColoredPrimitives2.class" WIDTH = 500 HEIGHT = 300 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "DrawColoredPrimitives2.class" WIDTH = 500 HEIGHT = 300></XMP>
+<PARAM NAME = CODE VALUE = "DrawColoredPrimitives2.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "DrawColoredPrimitives2.class" WIDTH = 500 HEIGHT = 300>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/DrawColoredPrimitives_plugin13.html b/demos/MiscDemos/DrawColoredPrimitives_plugin13.html
new file mode 100644
index 0000000..101fd55
--- /dev/null
+++ b/demos/MiscDemos/DrawColoredPrimitives_plugin13.html
@@ -0,0 +1,46 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 500 HEIGHT = 300 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "DrawColoredPrimitives.class" WIDTH = 500 HEIGHT = 300 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "DrawColoredPrimitives.class" WIDTH = 500 HEIGHT = 300></XMP>
+<PARAM NAME = CODE VALUE = "DrawColoredPrimitives.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "DrawColoredPrimitives.class" WIDTH = 500 HEIGHT = 300>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/GLImageViewerCanvas.java b/demos/MiscDemos/GLImageViewerCanvas.java
new file mode 100755
index 0000000..320242c
--- /dev/null
+++ b/demos/MiscDemos/GLImageViewerCanvas.java
@@ -0,0 +1,126 @@
+import gl4java.*;
+import gl4java.awt.*;
+import gl4java.utils.textures.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.net.*;
+
+public class GLImageViewerCanvas extends Frame
+ implements ActionListener, ItemListener
+{
+ GLImageCanvas glImageCanvas = null;
+
+ private Choice fileTypeChoice = null;
+ private Button loadButton = null;
+ private Button saveButton = null;
+ private Button normalButton = null;
+ private Checkbox aspectCheck = null;
+
+ public GLImageViewerCanvas(String title)
+ {
+ super(title);
+ setSize(500, 300);
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+
+ addWindowListener( new WindowAdapter()
+ {
+ public void windowClosed(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ public void windowClosing(WindowEvent e)
+ {
+ windowClosed(e);
+ }
+ }
+ );
+
+ Panel filePanel = new Panel();
+ filePanel.setLayout(new FlowLayout(FlowLayout.CENTER));
+
+ fileTypeChoice = new Choice();
+ fileTypeChoice.add("any");
+ fileTypeChoice.add("tga");
+ fileTypeChoice.add("png");
+ fileTypeChoice.add("ppm");
+ filePanel.add(fileTypeChoice);
+
+ loadButton = new Button("load..");
+ loadButton.addActionListener(this);
+ filePanel.add(loadButton);
+
+ saveButton = new Button("save..");
+ saveButton.addActionListener(this);
+ filePanel.add(saveButton);
+
+ normalButton = new Button("normal");
+ normalButton.addActionListener(this);
+ filePanel.add(normalButton);
+
+ aspectCheck = new Checkbox("aspect", true);
+ aspectCheck.addItemListener(this);
+ filePanel.add(aspectCheck);
+ add("North", filePanel);
+
+ glImageCanvas = new GLImageCanvas(d.width, d.height);
+ glImageCanvas.setName("GLImageCanvas");
+ glImageCanvas.setKeepAspectRatio(aspectCheck.getState());
+ add("Center", glImageCanvas);
+
+ pack();
+ setVisible(true);
+ }
+
+ public void actionPerformed(ActionEvent e)
+ {
+ Object src = e.getSource();
+ if(src.equals(loadButton))
+ {
+ FileDialog fd = new FileDialog(this,"Bitmap Load Menu",
+ FileDialog.LOAD);
+ fd.show();
+ String fname = fd.getDirectory() + fd.getFile() ;
+ fname = fname.replace('\\','/');
+ fname = fname.trim();
+
+ setTitle(fname);
+ glImageCanvas.loadTexture(fname,
+ fileTypeChoice.getSelectedItem() );
+ repaint();
+ } else if(src.equals(saveButton))
+ {
+ FileDialog fd = new FileDialog(this,"TGA-Image Save Menu",
+ FileDialog.SAVE);
+ fd.show();
+ String fname = fd.getDirectory() + fd.getFile() ;
+ fname = fname.replace('\\','/');
+ fname = fname.trim();
+
+ setTitle(fname);
+ glImageCanvas.snapshot( new TGATextureGrabber(glImageCanvas.gl),
+ fname);
+ repaint();
+ } else if(src.equals(normalButton))
+ {
+ glImageCanvas.setOriginalSize();
+ }
+ }
+
+ public void itemStateChanged(ItemEvent e)
+ {
+ if(aspectCheck.equals(e.getItemSelectable()))
+ {
+ glImageCanvas.setKeepAspectRatio(aspectCheck.getState());
+ }
+ }
+
+ public static void main( String args[] )
+ {
+ GLContext.gljNativeDebug = true;
+ GLContext.gljClassDebug = true;
+ GLImageViewerCanvas applet =
+ new GLImageViewerCanvas("GLImageViewerCanvas");
+ }
+}
diff --git a/demos/MiscDemos/GLImageViewerWorld.java b/demos/MiscDemos/GLImageViewerWorld.java
new file mode 100755
index 0000000..f00bd06
--- /dev/null
+++ b/demos/MiscDemos/GLImageViewerWorld.java
@@ -0,0 +1,112 @@
+import gl4java.*;
+import gl4java.awt.*;
+import gl4java.utils.textures.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.net.*;
+
+public class GLImageViewerWorld extends Frame
+ implements ActionListener
+{
+ GLImageWorld1 glImageCanvas = null;
+
+ private Choice fileTypeChoice = null;
+ private Button loadButton = null;
+ private Button saveButton = null;
+ private Button normalButton = null;
+
+ public GLImageViewerWorld(String title)
+ {
+ super(title);
+ setSize(500, 300);
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+
+ addWindowListener( new WindowAdapter()
+ {
+ public void windowClosed(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ public void windowClosing(WindowEvent e)
+ {
+ windowClosed(e);
+ }
+ }
+ );
+
+ Panel filePanel = new Panel();
+ filePanel.setLayout(new FlowLayout(FlowLayout.CENTER));
+
+ fileTypeChoice = new Choice();
+ fileTypeChoice.add("any");
+ fileTypeChoice.add("tga");
+ fileTypeChoice.add("png");
+ fileTypeChoice.add("ppm");
+ filePanel.add(fileTypeChoice);
+
+ loadButton = new Button("load..");
+ loadButton.addActionListener(this);
+ filePanel.add(loadButton);
+
+ saveButton = new Button("save..");
+ saveButton.addActionListener(this);
+ filePanel.add(saveButton);
+
+ normalButton = new Button("normal");
+ normalButton.addActionListener(this);
+ filePanel.add(normalButton);
+
+ add("North", filePanel);
+
+ glImageCanvas = new GLImageWorld1(d.width, d.height);
+ glImageCanvas.setName("GLImageWorld1");
+ add("Center", glImageCanvas);
+
+ pack();
+ setVisible(true);
+ }
+
+ public void actionPerformed(ActionEvent e)
+ {
+ Object src = e.getSource();
+ if(src.equals(loadButton))
+ {
+ FileDialog fd = new FileDialog(this,"Bitmap Load Menu",
+ FileDialog.LOAD);
+ fd.show();
+ String fname = fd.getDirectory() + fd.getFile() ;
+ fname = fname.replace('\\','/');
+ fname = fname.trim();
+
+ setTitle(fname);
+ glImageCanvas.loadTexture(fname,
+ fileTypeChoice.getSelectedItem() );
+ repaint();
+ } else if(src.equals(saveButton))
+ {
+ FileDialog fd = new FileDialog(this,"TGA-Image Save Menu",
+ FileDialog.SAVE);
+ fd.show();
+ String fname = fd.getDirectory() + fd.getFile() ;
+ fname = fname.replace('\\','/');
+ fname = fname.trim();
+
+ setTitle(fname);
+ glImageCanvas.snapshot( new TGATextureGrabber(glImageCanvas.gl),
+ fname);
+ repaint();
+ } else if(src.equals(normalButton))
+ {
+ glImageCanvas.setOriginalPerspective();
+ }
+ }
+
+ public static void main( String args[] )
+ {
+ GLImageViewerWorld applet =
+ new GLImageViewerWorld("GLImageViewerWorld");
+ }
+}
+
diff --git a/demos/MiscDemos/GLImageWorld1.java b/demos/MiscDemos/GLImageWorld1.java
new file mode 100755
index 0000000..6ac78f5
--- /dev/null
+++ b/demos/MiscDemos/GLImageWorld1.java
@@ -0,0 +1,456 @@
+import gl4java.*;
+import gl4java.awt.*;
+import gl4java.utils.textures.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.net.*;
+
+public class GLImageWorld1 extends GLCanvas
+ implements MouseListener,MouseMotionListener
+{
+ float []mPosObjTrans;
+ float []mPosObjRot;
+
+ Point mousePoint;
+ Point oldMousePoint;
+ boolean mouseMoveFlag;
+
+
+ TextureGrabber textGrab4Snapshot = null;
+ String textGrab4SnapshotFName = null;
+
+ TextureLoader txtLoader = null;
+ int texName[] = {0};
+
+ public GLImageWorld1 (int w, int h)
+ {
+ super(w, h);
+ }
+
+ /**
+ * Creates a snapshot (save texture/image) of the current
+ * GL-Context !
+ *
+ * The snapshot itself is created delayed,
+ * so no return value is avaiable.
+ * Because this is a non critical path, I hope its enough !
+ *
+ * @param tg The TextureGrabber
+ * @param fname The filename
+ * @see TextureGrabber
+ */
+ public void snapshot(TextureGrabber tg, String fname)
+ {
+ textGrab4Snapshot=tg;
+ textGrab4SnapshotFName=fname;
+ repaint();
+ }
+
+ public void setOriginalPerspective()
+ {
+ setOriginalPerspective(true);
+ }
+
+ private void setOriginalPerspective(boolean fetchGL)
+ {
+ for(int i=0;i<16;i++)
+ mPosObjTrans[i]=0f;
+ mPosObjTrans[0]=mPosObjTrans[5]=mPosObjTrans[10]=mPosObjTrans[15]=1f;
+ for(int i=0;i<16;i++)
+ mPosObjRot[i]=0f;
+ mPosObjRot[0]=mPosObjRot[5]=mPosObjRot[10]=mPosObjRot[15]=1f;
+
+ if(fetchGL)
+ {
+ if( glj.gljMakeCurrent() == false )
+ System.out.println("problem in use() method");
+ }
+
+ TranlateObj(0f,0f,-10f);
+ SetCamera();
+
+ if(fetchGL)
+ {
+ glj.gljCheckGL();
+ glj.gljFree();
+ repaint();
+ }
+ }
+
+ public void preInit()
+ {
+ // createOwnWindow = true;
+ }
+
+ public void init()
+ {
+ gl.glEnable(GL_TEXTURE_2D);
+
+ gl.glGenTextures(1,texName);
+ gl.glBindTexture(GL_TEXTURE_2D,texName[0]);
+
+ //gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
+ //gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
+ //gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ //gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+ gl.glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ // cameraMatrix init
+ mPosObjTrans=new float[16];
+ mPosObjRot=new float[16];
+
+ setOriginalPerspective(false);
+
+ gl.glShadeModel (GL_SMOOTH);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ gl.glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
+ gl.glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glj.gljCheckGL();
+
+ addMouseListener(this);
+ addMouseMotionListener(this);
+ mouseMoveFlag=false;
+
+ reshape(getSize().width, getSize().height);
+ }
+
+ /**
+ * These variables are very important
+ * to respect the texture-size ratio !
+ */
+ float texMaxPosX = 1f;
+ float texMaxPosY = 1f;
+
+ public boolean loadTexture(String name, String type)
+ {
+ boolean ok = true;
+
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return false;
+ }
+
+ // texture laden
+ if(type.equals("png"))
+ txtLoader = new PngTextureLoader(gl, glu);
+ else if(type.equals("ppm"))
+ txtLoader = new PPMAsciiTextureLoader(gl, glu);
+ else if(type.equals("tga"))
+ txtLoader = new TGATextureLoader(gl, glu);
+ else if(type.equals("any"))
+ txtLoader = new AWTTextureLoader(this, gl, glu);
+ else {
+ System.out.println("Imagetype: "+type+" is currently not supported !");
+ ok = false;
+ }
+
+ if(ok)
+ {
+ try {
+ txtLoader.readTexture(name);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ if(ok && txtLoader.isOk())
+ {
+ gl.glEnable(GL_TEXTURE_2D);
+
+ txtLoader.texImage2DScaled4BestSize();
+
+ texMaxPosX = 1f;
+ texMaxPosY = 1f;
+ float texAspect = txtLoader.getTextureWidth()/
+ txtLoader.getTextureHeight();
+
+ if(txtLoader.getTextureWidth()>txtLoader.getTextureHeight())
+ texMaxPosY = 1f/texAspect;
+ else
+ texMaxPosX = texAspect;
+ System.out.println("texture succesfully loaded !");
+ System.out.println("texture: "+txtLoader);
+ }
+ glj.gljCheckGL();
+ glj.gljFree();
+ if(ok)
+ repaint();
+ return ok;
+ }
+
+ public void display()
+ {
+ int i;
+
+ /* Standard GL4Java Init */
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ // just render it
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ SetCamera();
+
+ DrawScene();
+
+ if(textGrab4Snapshot!=null)
+ {
+ textGrab4Snapshot.grabPixels(GL_BACK,
+ 0, 0, cvsGetWidth(), cvsGetHeight());
+ if(textGrab4SnapshotFName!=null)
+ textGrab4Snapshot.write2File(textGrab4SnapshotFName);
+
+ textGrab4Snapshot =null;
+ textGrab4SnapshotFName=null;
+ }
+
+ /* For your animation dutys ;-) */
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void reshape(int w, int h)
+ {
+ gl.glMatrixMode (GL_MODELVIEW);
+ gl.glViewport (0, 0, w, h);
+ gl.glLoadIdentity();
+ SetCamera();
+ }
+
+
+ public void drawGrid(float x0, float y0,
+ float width, float height, float step)
+ {
+ float i,j;
+
+ /* draw grid */
+ gl.glBegin(GL_LINES);
+ for(i=x0;i<width;i+=step)
+ for(j=y0;j<height;j+=step)
+ {
+ if(i==0f && j==0f)
+ gl.glColor3f (1f,0f,0f);
+ else
+ gl.glColor3f (0.6f,0.5f,0.5f);
+ gl.glVertex2f(0f,j);
+ gl.glVertex2f(width,j);
+ gl.glVertex2f(i,height);
+ gl.glVertex2f(i,0f);
+ }
+ gl.glEnd();
+ }
+
+ void DrawScene()
+ {
+ gl.glMatrixMode (GL_MODELVIEW);
+ gl.glLoadIdentity ();
+
+ // kamera setzen
+ gl.glLoadMatrixf(mPosObjTrans);
+ gl.glMultMatrixf(mPosObjRot);
+
+ gl.glPushMatrix();
+ gl.glDisable(GL_TEXTURE_2D);
+ drawGrid(0f, 0f, 10f, 10f, 0.5f);
+ gl.glPopMatrix();
+
+ // obj zeichnen
+
+ gl.glPushMatrix();
+ gl.glScalef(2f,2f,2f);
+ gl.glColor3f(1f,0f,0f);
+ gl.glDisable(GL_TEXTURE_2D);
+ DrawObj();
+ gl.glPopMatrix();
+
+ if(texName[0]!=0)
+ gl.glEnable(GL_TEXTURE_2D);
+
+ gl.glEnable(GL_BLEND);
+ gl.glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+
+ gl.glColor3f(1f,1f,1f);
+
+ gl.glPushMatrix();
+ gl.glScalef(3f,3f,3f);
+ gl.glTranslatef(-1f,0f,1f);
+ DrawObj();
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glScalef(3f,3f,3f);
+ gl.glTranslatef(1f,0f,1f);
+ DrawObj();
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glScalef(3f,3f,3f);
+ gl.glTranslatef(-2f,1f,1f);
+ Billboard();
+ DrawObj();
+ gl.glPopMatrix();
+
+ gl.glDisable(GL_BLEND);
+ }
+
+ void DrawObj()
+ {
+ gl.glPushMatrix();
+ gl.glBegin(GL_QUADS);
+ gl.glNormal3f(0f,0f,1f);
+ gl.glTexCoord2f(0f,0f);
+ gl.glVertex3f(0f,0f,0f);
+
+ gl.glNormal3f(0f,0f,1f);
+ gl.glTexCoord2f(0f,1f);
+ gl.glVertex3f(0f,texMaxPosY,0f);
+
+ gl.glNormal3f(0f,0f,1f);
+ gl.glTexCoord2f(1f,1f);
+ gl.glVertex3f(texMaxPosX,texMaxPosY,0f);
+
+ gl.glNormal3f(0f,0f,1f);
+ gl.glTexCoord2f(1f,0f);
+ gl.glVertex3f(texMaxPosX,0f,0f);
+ gl.glEnd();
+ gl.glPopMatrix();
+ }
+
+ float winaspect = 1f;
+ float imgaspect = 1f;
+ float imgwidth = 1f;
+ float imgheight = 1f;
+
+ void SetCamera()
+ {
+ Dimension dim=getSize();
+ float aspect=(float)dim.width/(float)dim.height;
+
+ gl.glMatrixMode (GL_PROJECTION);
+ gl.glLoadIdentity ();
+ glu.gluPerspective(60f,aspect,.01,100);
+ }
+
+ void RotateObj(float degree,
+ float axisX,
+ float axisY,
+ float axisZ)
+ {
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ gl.glMatrixMode (GL_MODELVIEW);
+ gl.glLoadIdentity ();
+
+ // kamera setzen
+ gl.glRotatef(degree,axisX,axisY,axisZ);
+ gl.glMultMatrixf(mPosObjRot);
+ gl.glGetFloatv(GL_MODELVIEW_MATRIX,mPosObjRot);
+
+ repaint();
+ }
+
+ void TranlateObj(float x,float y,float z)
+ {
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ gl.glMatrixMode (GL_MODELVIEW);
+ gl.glLoadIdentity ();
+
+ // kamera setzen
+ gl.glLoadMatrixf(mPosObjTrans);
+ gl.glTranslatef(x,y,z);
+ gl.glGetFloatv(GL_MODELVIEW_MATRIX,mPosObjTrans);
+
+ repaint();
+ }
+
+ // entfernt rotationen aus aktueller matrix
+ double Billboard()
+ {
+ float[] mat=new float[16];
+
+ gl.glGetFloatv(GL_MODELVIEW_MATRIX,mat);
+ mat[0] = mat[5] = mat[10] = 1;
+ mat[1] = mat[2] = mat[4] = mat[6] = mat[8] = mat[9] = 0;
+ gl.glLoadMatrixf(mat);
+
+ return mat[14];
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ if(mouseMoveFlag==false)
+ { // start drag
+ mouseMoveFlag=true;
+ mousePoint=evt.getPoint();
+ }
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ mouseMoveFlag=false;
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ }
+
+ public void mouseDragged(MouseEvent e)
+ {
+ if(mouseMoveFlag==true)
+ {
+ oldMousePoint=new Point(mousePoint);
+ mousePoint=e.getPoint();
+
+ Point dif=new Point(mousePoint.x-oldMousePoint.x,
+ mousePoint.y-oldMousePoint.y);
+
+ if(e.isShiftDown()==true)
+ TranlateObj((float)dif.x/6.0f,(float)dif.y/-6.0f,0f);
+ else if(e.isAltDown()==true)
+ {
+ TranlateObj(0f,0f,(float)dif.y/6.0f);
+ RotateObj(dif.x,0f,0f,1f);
+ }
+ else
+ {
+ RotateObj(dif.x,0f,1f,0f);
+ RotateObj(dif.y,1f,0f,0f);
+ }
+ }
+ }
+ public void mouseMoved(MouseEvent e)
+ {
+ }
+
+
+}
+
diff --git a/demos/MiscDemos/PerformanceCheck.sh b/demos/MiscDemos/PerformanceCheck.sh
new file mode 100755
index 0000000..5934e9d
--- /dev/null
+++ b/demos/MiscDemos/PerformanceCheck.sh
@@ -0,0 +1,56 @@
+#! /bin/sh
+
+#
+# Prerequisites:
+#
+# - Unix Shell Environment, e.g. A Unix :-), cygwin32, ...
+#
+# - The native gears executabel in your PATH environment
+#
+# - The Shell Setup scripts for all your installed java1.1.X-java2 JVM's
+# under ./PerformanceEtc/profile.jdk* !!!
+# Here you have to setup the PATH, CLASSPATH well !
+#
+
+if [ -z "$1" -o -z "$2" ] ; then
+ echo usage: $0 \<nativeprog and java class\> \<logfilename\>
+ echo e.g.: $0 gears gl4j2.4.1-linux-xf68-4.0.1-tdfx-gears.log
+ exit 1
+fi
+
+testdelay=40s
+
+tstprog=$1
+logfile=$2
+rm -f $logfile
+
+echo >> $logfile
+echo =============================================== >> $logfile
+echo >> $logfile
+echo using native $tstprog >> $logfile
+($tstprog -info >> $logfile 2>&1) &
+sleep $testdelay && kill -15 $!
+sleep 5s
+echo >> $logfile
+echo >> $logfile
+
+for i in ./PerformanceEtc/profile.jdk* ; do
+ echo >> $logfile
+ echo =============================================== >> $logfile
+ echo >> $logfile
+ echo using $tstprog on $i >> $logfile
+ echo >> $logfile
+ . $i
+ if [ -z "$(echo $i | grep ibm)" ] ; then
+ java -version >> $logfile 2>&1
+ else
+ java -fullversion >> $logfile 2>&1
+ fi
+ echo JAVA_COMPILER $JAVA_COMPILER >> $logfile
+ echo >> $logfile
+ ( java $tstprog -perftest >> $logfile 2>&1) &
+ sleep $testdelay && kill -15 $!
+ sleep 5s
+ echo >> $logfile
+ echo >> $logfile
+done
diff --git a/demos/MiscDemos/PerformanceEtc/profile.jdk1.2-sun b/demos/MiscDemos/PerformanceEtc/profile.jdk1.2-sun
new file mode 100644
index 0000000..6483b1e
--- /dev/null
+++ b/demos/MiscDemos/PerformanceEtc/profile.jdk1.2-sun
@@ -0,0 +1,48 @@
+
+export NS_JAVA=
+# export DYN_JAVA=true # some motif bugs are there :-(
+export DYN_JAVA=
+
+export JAVA_HOME=/usr/local/lib/jdk1.2-sun
+export JDK_HOME=$JAVA_HOME
+
+export JAVA_COMPILER=javacomp
+
+THREADS_FLAG=native
+export THREADS_FLAG
+
+CLASSPATH=.
+
+#
+# 1st the PATH for classes
+#
+for i in /usr/local/projects/java \
+ $HOME/lib/classes \
+ /usr/local/lib-java \
+ ; do
+ test -e $i && CLASSPATH=$CLASSPATH:$i
+done
+
+#
+# 2nd the JAR/ZIP-Archives for classes
+#
+for i in $HOME/lib/classes/*.jar \
+ /usr/local/lib-java/*.jar \
+ ; do
+ test -e $i && CLASSPATH=$CLASSPATH:$i
+done
+export CLASSPATH
+
+#
+# Be sure to respect, that the latter directory in this
+# for-loop is the first entry in the PATH env-var !!!!!
+#
+for i in /usr/local/lib-java/JavaCC/bin \
+ /usr/local/lib-java/bin \
+ /usr/local/lib-java/JSDK/bin \
+ $JAVA_HOME/bin \
+ ; do
+ test -e $i && PATH=$i:$PATH
+done
+export PATH
+
diff --git a/demos/MiscDemos/PerformanceEtc/profile.jdk1.3-ibm b/demos/MiscDemos/PerformanceEtc/profile.jdk1.3-ibm
new file mode 100644
index 0000000..841718d
--- /dev/null
+++ b/demos/MiscDemos/PerformanceEtc/profile.jdk1.3-ibm
@@ -0,0 +1,52 @@
+
+export NS_JAVA=
+# export DYN_JAVA=true # some motif bugs are there :-(
+export DYN_JAVA=
+
+export JAVA_HOME=/usr/local/lib/jdk1.3-ibm
+export JDK_HOME=$JAVA_HOME
+
+export JAVA_COMPILER=jitc
+#unset JAVA_COMPILER
+
+export HOTJAVA_HOME=/usr/local/lib-java/HotJava
+export SWING_HOME=
+
+THREADS_FLAG=native
+export THREADS_FLAG
+
+CLASSPATH=.
+
+#
+# 1st the PATH for classes
+#
+for i in /usr/local/projects/java \
+ $HOME/lib/classes \
+ /usr/local/lib-java \
+ ; do
+ test -e $i && CLASSPATH=$CLASSPATH:$i
+done
+
+#
+# 2nd the JAR/ZIP-Archives for classes
+#
+for i in $HOME/lib/classes/*.jar \
+ /usr/local/lib-java/*.jar \
+ ; do
+ test -e $i && CLASSPATH=$CLASSPATH:$i
+done
+export CLASSPATH
+
+#
+# Be sure to respect, that the latter directory in this
+# for-loop is the first entry in the PATH env-var !!!!!
+#
+for i in /usr/local/lib-java/JavaCC/bin \
+ /usr/local/lib-java/bin \
+ /usr/local/lib-java/JSDK/bin \
+ $JAVA_HOME/bin \
+ ; do
+ test -e $i && PATH=$i:$PATH
+done
+export PATH
+
diff --git a/demos/MiscDemos/PerformanceEtc/profile.jdk1.3-sun b/demos/MiscDemos/PerformanceEtc/profile.jdk1.3-sun
new file mode 100644
index 0000000..752c6fe
--- /dev/null
+++ b/demos/MiscDemos/PerformanceEtc/profile.jdk1.3-sun
@@ -0,0 +1,52 @@
+
+export NS_JAVA=
+# export DYN_JAVA=true # some motif bugs are there :-(
+export DYN_JAVA=
+
+export JAVA_HOME=/usr/local/lib/jdk1.3-sun
+export JDK_HOME=$JAVA_HOME
+
+unset JAVA_COMPILER
+export TYA_LOGFILE=
+
+export HOTJAVA_HOME=/usr/local/lib-java/HotJava
+export SWING_HOME=
+
+THREADS_FLAG=native
+export THREADS_FLAG
+
+CLASSPATH=.
+
+#
+# 1st the PATH for classes
+#
+for i in /usr/local/projects/java \
+ $HOME/lib/classes \
+ /usr/local/lib-java \
+ ; do
+ test -e $i && CLASSPATH=$CLASSPATH:$i
+done
+
+#
+# 2nd the JAR/ZIP-Archives for classes
+#
+for i in $HOME/lib/classes/*.jar \
+ /usr/local/lib-java/*.jar \
+ ; do
+ test -e $i && CLASSPATH=$CLASSPATH:$i
+done
+export CLASSPATH
+
+#
+# Be sure to respect, that the latter directory in this
+# for-loop is the first entry in the PATH env-var !!!!!
+#
+for i in /usr/local/lib-java/JavaCC/bin \
+ /usr/local/lib-java/bin \
+ /usr/local/lib-java/JSDK/bin \
+ $JAVA_HOME/bin \
+ ; do
+ test -e $i && PATH=$i:$PATH
+done
+export PATH
+
diff --git a/demos/MiscDemos/PerformanceEtc/profile.jdk118-ibm b/demos/MiscDemos/PerformanceEtc/profile.jdk118-ibm
new file mode 100644
index 0000000..925684a
--- /dev/null
+++ b/demos/MiscDemos/PerformanceEtc/profile.jdk118-ibm
@@ -0,0 +1,48 @@
+
+export NS_JAVA=
+# export DYN_JAVA=true # some motif bugs are there :-(
+export DYN_JAVA=
+
+export JAVA_HOME=/usr/local/lib/jdk118-ibm
+export JDK_HOME=$JAVA_HOME
+
+export JAVA_COMPILER=jitc
+
+THREADS_FLAG=native
+export THREADS_FLAG
+
+CLASSPATH=$JAVA_HOME/lib/classes.zip:.
+
+#
+# 1st the PATH for classes
+#
+for i in /usr/local/projects/java \
+ $HOME/lib/classes \
+ /usr/local/lib-java \
+ ; do
+ test -e $i && CLASSPATH=$CLASSPATH:$i
+done
+
+#
+# 2nd the JAR/ZIP-Archives for classes
+#
+for i in $HOME/lib/classes/*.jar \
+ /usr/local/lib-java/*.jar \
+ ; do
+ test -e $i && CLASSPATH=$CLASSPATH:$i
+done
+export CLASSPATH
+
+#
+# Be sure to respect, that the latter directory in this
+# for-loop is the first entry in the PATH env-var !!!!!
+#
+for i in /usr/local/lib-java/JavaCC/bin \
+ /usr/local/lib-java/bin \
+ $JAVA_HOME/bin \
+ ; do
+ test -e $i && PATH=$i:$PATH
+done
+export PATH
+
+
diff --git a/demos/MiscDemos/PerformanceEtc/profile.jdk118_v1 b/demos/MiscDemos/PerformanceEtc/profile.jdk118_v1
new file mode 100644
index 0000000..f36395a
--- /dev/null
+++ b/demos/MiscDemos/PerformanceEtc/profile.jdk118_v1
@@ -0,0 +1,50 @@
+
+export NS_JAVA=
+# export DYN_JAVA=true # some motif bugs are there :-(
+export DYN_JAVA=
+
+export JAVA_HOME=/usr/local/lib/jdk118_v1
+export JDK_HOME=$JAVA_HOME
+
+export JAVA_COMPILER=tya
+export TYA_LOGFILE=/var/log/tya.log
+
+THREADS_FLAG=native
+export THREADS_FLAG
+
+CLASSPATH=$JAVA_HOME/lib/classes.zip:.
+
+#
+# 1st the PATH for classes
+#
+for i in /usr/local/projects/java \
+ $HOME/lib/classes \
+ /usr/local/lib-java \
+ ; do
+ test -e $i && CLASSPATH=$CLASSPATH:$i
+done
+
+#
+# 2nd the JAR/ZIP-Archives for classes
+#
+for i in $HOME/lib/classes/*.jar \
+ /usr/local/lib-java/*.jar \
+ ; do
+ test -e $i && CLASSPATH=$CLASSPATH:$i
+done
+export CLASSPATH
+
+#
+# Be sure to respect, that the latter directory in this
+# for-loop is the first entry in the PATH env-var !!!!!
+#
+for i in /usr/local/lib-java/JavaCC/bin \
+ /usr/local/lib-java/bin \
+ /usr/local/lib-java/JSDK/bin \
+ $JAVA_HOME/bin \
+ ; do
+ test -e $i && PATH=$i:$PATH
+done
+export PATH
+
+
diff --git a/demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-ppc-500mhz-xf68-4.0.1-DRI-soft.log b/demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-ppc-500mhz-xf68-4.0.1-DRI-soft.log
new file mode 100644
index 0000000..cc0831c
--- /dev/null
+++ b/demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-ppc-500mhz-xf68-4.0.1-DRI-soft.log
@@ -0,0 +1,82 @@
+
+===============================================
+
+using native gears
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk118
+
+dirname: too many arguments
+Try `dirname --help' for more information.
+java version "1.1.8"
+JAVA_COMPILER mwjit
+
+dirname: too many arguments
+Try `dirname --help' for more information.
+libmwjit.so: cannot open shared object file: No such file or directory (libmwjit.so)
+Warning: JIT compiler "mwjit" not found. Will use interpreter.
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2 Mesa 3.3 beta
+GL RENDERER: Mesa GLX Indirect
+GL VENDOR : Precision Insight, Inc.
+453 frames in 5.004 seconds = 90.5275779376499 FPS
+455 frames in 5.001 seconds = 90.98180363927214 FPS
+454 frames in 5.003 seconds = 90.74555266839896 FPS
+456 frames in 5.009 seconds = 91.03613495707725 FPS
+454 frames in 5.003 seconds = 90.74555266839896 FPS
+456 frames in 5.01 seconds = 91.0179640718563 FPS
+453 frames in 5.005 seconds = 90.5094905094905 FPS
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk122
+
+java version "1.2.2"
+Classic VM (build Linux_JDK_1.2.2_FCS, native threads, nojit)
+JAVA_COMPILER
+
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2 Mesa 3.3 beta
+GL RENDERER: Mesa GLX Indirect
+GL VENDOR : Precision Insight, Inc.
+450 frames in 5.007 seconds = 89.87417615338526 FPS
+450 frames in 5.009 seconds = 89.83829107606309 FPS
+452 frames in 5.007 seconds = 90.2736169362892 FPS
+454 frames in 5.009 seconds = 90.63685366340586 FPS
+452 frames in 5.002 seconds = 90.36385445821672 FPS
+454 frames in 5.005 seconds = 90.70929070929071 FPS
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk13
+
+java version "1.3.0beta"
+Java(TM) 2 Runtime Environment, Standard Edition (build Blackdown-1.3.0beta-b02)
+Classic VM (build Blackdown-1.3.0beta-b02, native threads, nojit)
+JAVA_COMPILER
+
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2 Mesa 3.3 beta
+GL RENDERER: Mesa GLX Indirect
+GL VENDOR : Precision Insight, Inc.
+447 frames in 5.007 seconds = 89.27501497902936 FPS
+449 frames in 5.01 seconds = 89.62075848303394 FPS
+450 frames in 5.005 seconds = 89.91008991008991 FPS
+451 frames in 5.002 seconds = 90.16393442622952 FPS
+450 frames in 5.005 seconds = 89.91008991008991 FPS
+452 frames in 5.009 seconds = 90.23757236973447 FPS
+
+
diff --git a/demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-x86-350mhz-Mesa321-soft-gears.log b/demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-x86-350mhz-Mesa321-soft-gears.log
new file mode 100644
index 0000000..91f2e6f
--- /dev/null
+++ b/demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-x86-350mhz-Mesa321-soft-gears.log
@@ -0,0 +1,130 @@
+
+===============================================
+
+using native gears
+GL_RENDERER = Mesa X11
+GL_VERSION = 1.2 Mesa 3.2.1
+GL_VENDOR = Brian Paul
+GL_EXTENSIONS = GL_EXT_blend_color GL_EXT_blend_minmax GL_EXT_blend_logic_op GL_EXT_blend_subtract GL_EXT_packed_pixels GL_EXT_paletted_texture GL_EXT_point_parameters GL_EXT_polygon_offset GL_EXT_vertex_array GL_EXT_texture_object GL_EXT_texture3D GL_MESA_window_pos GL_MESA_resize_buffers GL_EXT_shared_texture_palette GL_EXT_rescale_normal GL_EXT_abgr GL_SGIS_texture_edge_clamp GL_EXT_stencil_wrap GL_INGR_blend_func_separate GL_ARB_multitexture GL_NV_texgen_reflection GL_PGI_misc_hints GL_EXT_compiled_vertex_array GL_EXT_clip_volume_hint
+492 frames in 5.004 seconds = 98.3213 FPS
+510 frames in 5.007 seconds = 101.857 FPS
+510 frames in 5.007 seconds = 101.857 FPS
+510 frames in 5.007 seconds = 101.857 FPS
+510 frames in 5.006 seconds = 101.878 FPS
+510 frames in 5.006 seconds = 101.878 FPS
+510 frames in 5.007 seconds = 101.857 FPS
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk118-ibm
+
+java full version "JDK 1.1.8 IBM build l118-19991221 (JIT enabled: jitc)"
+JAVA_COMPILER jitc
+
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+Xt error: attempt to add non-widget child "dsm" to parent "MToolkit app" which supports only widgets
+SIGABRT received at bfffdc98 in /lib/libpthread.so.0. Processing terminated
+Writing stack trace to javacore4308.txt ... OK
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk118_v1
+
+java version "1.1.8"
+JAVA_COMPILER tya
+
+ TYA 1.5 (for J117 / Linux). Copyright (c) 1997,98,99 The TYA Team
+ Contact The TYA Team via Albrecht Kleine <[email protected]>
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2 Mesa 3.2.1
+GL RENDERER: Mesa X11
+GL VENDOR : Brian Paul
+500 frames in 5.003 seconds = 99.94003597841295 FPS
+501 frames in 5.004 seconds = 100.11990407673862 FPS
+502 frames in 5.009 seconds = 100.21960471151925 FPS
+502 frames in 5.01 seconds = 100.1996007984032 FPS
+502 frames in 5.008 seconds = 100.23961661341853 FPS
+502 frames in 5.009 seconds = 100.21960471151925 FPS
+502 frames in 5.004 seconds = 100.3197442046363 FPS
+502 frames in 5.007 seconds = 100.25963650888757 FPS
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk1.2-sun
+
+java version "1.2.2"
+Classic VM (build 1.2.2_006, native threads, javacomp)
+JAVA_COMPILER javacomp
+
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2 Mesa 3.2.1
+GL RENDERER: Mesa X11
+GL VENDOR : Brian Paul
+499 frames in 5.007 seconds = 99.66047533453167 FPS
+501 frames in 5.006 seconds = 100.07990411506192 FPS
+502 frames in 5.003 seconds = 100.3397961223266 FPS
+501 frames in 5.0 seconds = 100.2 FPS
+502 frames in 5.008 seconds = 100.23961661341853 FPS
+502 frames in 5.003 seconds = 100.3397961223266 FPS
+501 frames in 5.009 seconds = 100.01996406468356 FPS
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk1.3-ibm
+
+java full version "J2RE 1.3.0 IBM build cxdev-20000502"
+JAVA_COMPILER jitc
+
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2 Mesa 3.2.1
+GL RENDERER: Mesa X11
+GL VENDOR : Brian Paul
+498 frames in 5.005 seconds = 99.5004995004995 FPS
+500 frames in 5.0 seconds = 100.0 FPS
+500 frames in 5.0 seconds = 100.0 FPS
+501 frames in 5.009 seconds = 100.01996406468356 FPS
+497 frames in 5.0 seconds = 99.4 FPS
+504 frames in 5.001 seconds = 100.77984403119376 FPS
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk1.3-sun
+
+java version "1.3.0beta_refresh"
+Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0beta_refresh-b09)
+Java HotSpot(TM) Client VM (build 1.3.0beta-b07, mixed mode)
+JAVA_COMPILER
+
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2 Mesa 3.2.1
+GL RENDERER: Mesa X11
+GL VENDOR : Brian Paul
+498 frames in 5.0 seconds = 99.6 FPS
+499 frames in 5.007 seconds = 99.66047533453167 FPS
+500 frames in 5.0 seconds = 100.0 FPS
+498 frames in 5.007 seconds = 99.46075494307969 FPS
+501 frames in 5.0 seconds = 100.2 FPS
+501 frames in 5.0 seconds = 100.2 FPS
+500 frames in 5.008 seconds = 99.84025559105432 FPS
+
+
diff --git a/demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-x86-350mhz-xf68-4.0.1-DRI-soft-gears.log b/demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-x86-350mhz-xf68-4.0.1-DRI-soft-gears.log
new file mode 100644
index 0000000..355b563
--- /dev/null
+++ b/demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-x86-350mhz-xf68-4.0.1-DRI-soft-gears.log
@@ -0,0 +1,137 @@
+
+===============================================
+
+using native gears
+GL_RENDERER = Mesa GLX Indirect
+GL_VERSION = 1.2 Mesa 3.3 beta
+GL_VENDOR = Precision Insight, Inc.
+GL_EXTENSIONS = GL_EXT_abgr GL_EXT_blend_color GL_EXT_blend_minmax GL_EXT_blend_subtract
+455 frames in 5.002 seconds = 90.9636 FPS
+464 frames in 5.003 seconds = 92.7444 FPS
+471 frames in 5.01 seconds = 94.012 FPS
+471 frames in 5.008 seconds = 94.0495 FPS
+471 frames in 5.009 seconds = 94.0307 FPS
+471 frames in 5.008 seconds = 94.0495 FPS
+470 frames in 5.002 seconds = 93.9624 FPS
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk118-ibm
+
+java full version "JDK 1.1.8 IBM build l118-19991221 (JIT enabled: jitc)"
+JAVA_COMPILER jitc
+
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2 Mesa 3.3 beta
+GL RENDERER: Mesa GLX Indirect
+GL VENDOR : Precision Insight, Inc.
+446 frames in 5.004 seconds = 89.12869704236611 FPS
+445 frames in 5.006 seconds = 88.89332800639232 FPS
+455 frames in 5.004 seconds = 90.92725819344525 FPS
+455 frames in 5.003 seconds = 90.94543274035578 FPS
+455 frames in 5.002 seconds = 90.96361455417833 FPS
+455 frames in 5.002 seconds = 90.96361455417833 FPS
+454 frames in 5.005 seconds = 90.70929070929071 FPS
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk118_v1
+
+java version "1.1.8"
+JAVA_COMPILER tya
+
+ TYA 1.5 (for J117 / Linux). Copyright (c) 1997,98,99 The TYA Team
+ Contact The TYA Team via Albrecht Kleine <[email protected]>
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2 Mesa 3.3 beta
+GL RENDERER: Mesa GLX Indirect
+GL VENDOR : Precision Insight, Inc.
+461 frames in 5.0 seconds = 92.2 FPS
+462 frames in 5.005 seconds = 92.3076923076923 FPS
+463 frames in 5.008 seconds = 92.4520766773163 FPS
+463 frames in 5.007 seconds = 92.47054124226084 FPS
+463 frames in 5.008 seconds = 92.4520766773163 FPS
+463 frames in 5.007 seconds = 92.47054124226084 FPS
+462 frames in 5.01 seconds = 92.21556886227545 FPS
+462 frames in 5.002 seconds = 92.36305477808877 FPS
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk1.2-sun
+
+java version "1.2.2"
+Classic VM (build 1.2.2_006, native threads, javacomp)
+JAVA_COMPILER javacomp
+
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2 Mesa 3.3 beta
+GL RENDERER: Mesa GLX Indirect
+GL VENDOR : Precision Insight, Inc.
+461 frames in 5.004 seconds = 92.12629896083135 FPS
+463 frames in 5.008 seconds = 92.4520766773163 FPS
+464 frames in 5.007 seconds = 92.67026163371281 FPS
+464 frames in 5.005 seconds = 92.70729270729271 FPS
+464 frames in 5.006 seconds = 92.6887734718338 FPS
+464 frames in 5.008 seconds = 92.65175718849841 FPS
+462 frames in 5.001 seconds = 92.38152369526094 FPS
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk1.3-ibm
+
+java full version "J2RE 1.3.0 IBM build cxdev-20000502"
+JAVA_COMPILER jitc
+
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2 Mesa 3.3 beta
+GL RENDERER: Mesa GLX Indirect
+GL VENDOR : Precision Insight, Inc.
+456 frames in 5.006 seconds = 91.09069117059528 FPS
+459 frames in 5.006 seconds = 91.68997203355973 FPS
+459 frames in 5.005 seconds = 91.70829170829171 FPS
+459 frames in 5.003 seconds = 91.74495302818309 FPS
+455 frames in 5.009 seconds = 90.83649431024156 FPS
+462 frames in 5.0 seconds = 92.4 FPS
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk1.3-sun
+
+java version "1.3.0beta_refresh"
+Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0beta_refresh-b09)
+Java HotSpot(TM) Client VM (build 1.3.0beta-b07, mixed mode)
+JAVA_COMPILER
+
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2 Mesa 3.3 beta
+GL RENDERER: Mesa GLX Indirect
+GL VENDOR : Precision Insight, Inc.
+462 frames in 5.009 seconds = 92.23397883809143 FPS
+461 frames in 5.007 seconds = 92.07110045935691 FPS
+463 frames in 5.005 seconds = 92.50749250749251 FPS
+462 frames in 5.007 seconds = 92.27082085080887 FPS
+466 frames in 5.005 seconds = 93.10689310689311 FPS
+466 frames in 5.004 seconds = 93.12549960031976 FPS
+464 frames in 5.005 seconds = 92.70729270729271 FPS
+
+
diff --git a/demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-x86-350mhz-xf68-4.0.1-NVidia-GForce256-gears.log b/demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-x86-350mhz-xf68-4.0.1-NVidia-GForce256-gears.log
new file mode 100644
index 0000000..e21c362
--- /dev/null
+++ b/demos/MiscDemos/PerformanceLogs/gl4j2.4.1-linux-x86-350mhz-xf68-4.0.1-NVidia-GForce256-gears.log
@@ -0,0 +1,131 @@
+
+===============================================
+
+using native gears
+GL_RENDERER = GeForce 256/AGP
+GL_VERSION = 1.2.1
+GL_VENDOR = NVIDIA Corporation
+GL_EXTENSIONS = GL_ARB_multitexture GL_ARB_texture_compression GL_ARB_texture_cube_map GL_ARB_texture_env_add GL_ARB_transpose_matrix GL_EXT_abgr GL_EXT_bgra GL_EXT_blend_color GL_EXT_blend_minmax GL_EXT_blend_subtract GL_EXT_compiled_vertex_array GL_EXT_fog_coord GL_EXT_packed_pixels GL_EXT_paletted_texture GL_EXT_point_parameters GL_EXT_rescale_normal GL_EXT_secondary_color GL_EXT_separate_specular_color GL_EXT_shared_texture_palette GL_EXT_stencil_wrap GL_EXT_texture_compression_s3tc GL_EXT_texture_edge_clamp GL_EXT_texture_env_add GL_EXT_texture_env_combine GL_EXT_texture_cube_map GL_EXT_texture_filter_anisotropic GL_EXT_texture_lod GL_EXT_texture_lod_bias GL_EXT_texture_object GL_EXT_vertex_array GL_EXT_vertex_weighting GL_KTX_buffer_region GL_NV_blend_square GL_NV_fence GL_NV_fog_distance GL_NV_light_max_exponent GL_NV_register_combiners GL_NV_texgen_emboss GL_NV_texgen_reflection GL_NV_texture_env_combine4 GL_NV_vertex_array_range GL_S3_s3tc GL_SGIS_multitexture GL_SGIS_texture_lod
+5380 frames in 5 seconds = 1076 FPS
+5452 frames in 5 seconds = 1090.4 FPS
+5496 frames in 5 seconds = 1099.2 FPS
+5495 frames in 5 seconds = 1099 FPS
+5496 frames in 5 seconds = 1099.2 FPS
+5496 frames in 5 seconds = 1099.2 FPS
+5494 frames in 5 seconds = 1098.8 FPS
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk118-ibm
+
+java full version "JDK 1.1.8 IBM build l118-19991221 (JIT enabled: jitc)"
+JAVA_COMPILER jitc
+
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2.1
+GL RENDERER: GeForce 256/AGP
+GL VENDOR : NVIDIA Corporation
+4969 frames in 5.0 seconds = 993.8 FPS
+4937 frames in 5.0 seconds = 987.4 FPS
+5065 frames in 5.0 seconds = 1013.0 FPS
+5062 frames in 5.0 seconds = 1012.4 FPS
+5066 frames in 5.0 seconds = 1013.2 FPS
+5062 frames in 5.0 seconds = 1012.4 FPS
+5053 frames in 5.0 seconds = 1010.6 FPS
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk118_v1
+
+java version "1.1.8"
+JAVA_COMPILER tya
+
+ TYA 1.5 (for J117 / Linux). Copyright (c) 1997,98,99 The TYA Team
+ Contact The TYA Team via Albrecht Kleine <[email protected]>
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2.1
+GL RENDERER: GeForce 256/AGP
+GL VENDOR : NVIDIA Corporation
+5132 frames in 5.0 seconds = 1026.4 FPS
+5174 frames in 5.0 seconds = 1034.8 FPS
+5180 frames in 5.0 seconds = 1036.0 FPS
+5180 frames in 5.0 seconds = 1036.0 FPS
+5179 frames in 5.0 seconds = 1035.8 FPS
+5179 frames in 5.0 seconds = 1035.8 FPS
+5166 frames in 5.0 seconds = 1033.2 FPS
+5179 frames in 5.0 seconds = 1035.8 FPS
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk1.2-sun
+
+java version "1.2.2"
+Classic VM (build 1.2.2_006, native threads, javacomp)
+JAVA_COMPILER javacomp
+
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2.1
+GL RENDERER: GeForce 256/AGP
+GL VENDOR : NVIDIA Corporation
+5112 frames in 5.0 seconds = 1022.4 FPS
+5168 frames in 5.0 seconds = 1033.6 FPS
+5176 frames in 5.0 seconds = 1035.2 FPS
+5178 frames in 5.0 seconds = 1035.6 FPS
+5177 frames in 5.0 seconds = 1035.4 FPS
+5178 frames in 5.0 seconds = 1035.6 FPS
+5168 frames in 5.0 seconds = 1033.6 FPS
+
+
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk1.3-ibm
+
+java full version "J2RE 1.3.0 IBM build cxdev-20000502"
+JAVA_COMPILER jitc
+
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2.1
+GL RENDERER: GeForce 256/AGP
+GL VENDOR : NVIDIA Corporation
+5079 frames in 5.0 seconds = 1015.8 FPS
+5229 frames in 5.0 seconds = 1045.8 FPS
+5230 frames in 5.0 seconds = 1046.0 FPS
+
+===============================================
+
+using gears on ./PerformanceEtc/profile.jdk1.3-sun
+
+java version "1.3.0beta_refresh"
+Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0beta_refresh-b09)
+Java HotSpot(TM) Client VM (build 1.3.0beta-b07, mixed mode)
+JAVA_COMPILER
+
+loading libs(gl, glu): null, null: true
+useFpsSleep: false
+useRepaint: false
+GL VERSION : 1.2.1
+GL RENDERER: GeForce 256/AGP
+GL VENDOR : NVIDIA Corporation
+4894 frames in 5.0 seconds = 978.8 FPS
+5043 frames in 5.0 seconds = 1008.6 FPS
+5063 frames in 5.0 seconds = 1012.6 FPS
+5065 frames in 5.0 seconds = 1013.0 FPS
+5065 frames in 5.0 seconds = 1013.0 FPS
+5064 frames in 5.0 seconds = 1012.8 FPS
+
+
diff --git a/demos/MiscDemos/PerformanceLogs/index.html b/demos/MiscDemos/PerformanceLogs/index.html
new file mode 100644
index 0000000..20ebe96
--- /dev/null
+++ b/demos/MiscDemos/PerformanceLogs/index.html
@@ -0,0 +1,15 @@
+<HEAD>
+<TITLE></TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<H1></H1>
+<HR><PRE>
+<IMG SRC="/icons/back.gif" ALT="[DIR]"> <A HREF="..">Parent Directory</A>
+<IMG SRC="/icons/compressed.gif" ALT="[ ]"> <A HREF="gl4j2.4.1-linux-ppc-500mhz-xf68-4.0.1-DRI-soft.log">gl4j2.4.1-linux-ppc-500mhz-xf68-4.0.1-DRI-soft.log</A> (4 kBytes)
+<IMG SRC="/icons/compressed.gif" ALT="[ ]"> <A HREF="gl4j2.4.1-linux-x86-350mhz-Mesa321-soft-gears.log">gl4j2.4.1-linux-x86-350mhz-Mesa321-soft-gears.log</A> (8 kBytes)
+<IMG SRC="/icons/compressed.gif" ALT="[ ]"> <A HREF="gl4j2.4.1-linux-x86-350mhz-xf68-4.0.1-DRI-soft-gears.log">gl4j2.4.1-linux-x86-350mhz-xf68-4.0.1-DRI-soft-gears.log</A> (8 kBytes)
+<IMG SRC="/icons/compressed.gif" ALT="[ ]"> <A HREF="gl4j2.4.1-linux-x86-350mhz-xf68-4.0.1-NVidia-GForce256-gears.log">gl4j2.4.1-linux-x86-350mhz-xf68-4.0.1-NVidia-GForce256-gears.log</A> (8 kBytes)
+</PRE><HR>
+<PRE>
+<PRE>
+</BODY>
diff --git a/demos/MiscDemos/SharedGLTest.java b/demos/MiscDemos/SharedGLTest.java
new file mode 100644
index 0000000..1377b20
--- /dev/null
+++ b/demos/MiscDemos/SharedGLTest.java
@@ -0,0 +1,73 @@
+import java.awt.*;
+import gl4java.*;
+import gl4java.awt.*;
+
+public class SharedGLTest extends Frame {
+ public static void main(String[] args) {
+ SharedGLTest t1 = new SharedGLTest();
+ t1.setVisible(true);
+
+ do { // Wait until t1 is fully created and displayed.
+ if(t1.getGLContext() != null) break;
+ }
+ while(true);
+
+ SharedGLTest t2 = new SharedGLTest(t1.getGLContext());
+ t2.setVisible(true);
+ }
+
+ public SharedGLTest() { this(null); }
+ public SharedGLTest(GLContext shareWith) {
+ super();
+ setBounds(50, 0, 200, 200);
+ c = new MyCanvas(100, 100, shareWith);
+ add(c);
+ }
+
+ private MyCanvas c;
+ public GLContext getGLContext() { return c.getGLContext(); }
+
+ private class MyCanvas extends GLCanvas {
+
+ public MyCanvas(int w, int h) {
+ super(w, h);
+ }
+
+ public MyCanvas(int w, int h, GLContext shareWith) {
+ super(w, h);
+ sharedGLContext = shareWith;
+ }
+
+ public void display() {
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ GLFunc gl = glj.getGLFunc();
+ buildCallList(gl); // Really build something only once.
+ gl.glCallList(callList);
+
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+ }
+ private static int callList;
+ private static boolean alreadyDone;
+ private static void buildCallList(GLFunc gl) { // Build only one call list for both GLCanvas.
+ if(alreadyDone) return;
+ alreadyDone = true;
+
+ callList = gl.glGenLists(1);
+
+ gl.glNewList(callList, gl.GL_COMPILE);
+ gl.glClearColor(1f, 0f, 0f, 1f);
+ gl.glClear(gl.GL_COLOR_BUFFER_BIT); // Clear the GLCanvas with red.
+ gl.glEndList();
+ }
+}
+
+
+
diff --git a/demos/MiscDemos/SharedGLTest2.html b/demos/MiscDemos/SharedGLTest2.html
new file mode 100644
index 0000000..802e43b
--- /dev/null
+++ b/demos/MiscDemos/SharedGLTest2.html
@@ -0,0 +1,13 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<applet code="SharedGLTest2.class" width=200 height=400>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
diff --git a/demos/MiscDemos/SharedGLTest2.java b/demos/MiscDemos/SharedGLTest2.java
new file mode 100755
index 0000000..e1dcb23
--- /dev/null
+++ b/demos/MiscDemos/SharedGLTest2.java
@@ -0,0 +1,144 @@
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import gl4java.*;
+import gl4java.awt.*;
+
+public class SharedGLTest2 extends Applet
+ implements MouseListener
+{
+
+ MyCanvas canvas = null;
+ Button addButton = null;
+ int canvasNumber = 0;
+ Panel pAllCvs = null;
+ Dimension d = null;
+
+ public void init()
+ {
+ d = getSize();
+ setLayout(new BorderLayout());
+ addButton = new Button ("add gl");
+ addButton.addMouseListener(this);
+ add("South", addButton);
+
+ pAllCvs = new Panel();
+ pAllCvs.setLayout(new GridLayout(4,1));
+ add("Center", pAllCvs);
+
+ canvas = new MyCanvas (d.width/2, d.height/2, null);
+ pAllCvs.add(canvas);
+ canvasNumber=1;
+ }
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("SharedGLTest2");
+
+ SharedGLTest2 applet = new SharedGLTest2();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+ public void start()
+ {
+ }
+
+
+ public void stop()
+ {
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+
+ if( canvas!=null && comp.equals(addButton) )
+ {
+ if(canvasNumber<4)
+ {
+ MyCanvas _canvas =
+ new MyCanvas (d.width/2,d.height/2,canvas.getGLContext());
+ pAllCvs.add(_canvas);
+ canvasNumber++;
+ pAllCvs.invalidate();
+ pAllCvs.validate();
+ if(canvasNumber==4)
+ addButton.setEnabled(false);
+ }
+ }
+ }
+
+ private static int callList=0;
+
+ protected class MyCanvas extends GLCanvas
+ {
+ public MyCanvas(int w, int h, GLContext shareWith)
+ {
+ super(w, h);
+ sharedGLContext = shareWith;
+ }
+
+ public void init()
+ {
+ if(sharedGLContext==null && callList==0)
+ {
+ buildCallList(); // Really build something only once.
+ }
+ }
+
+ public void display()
+ {
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ if(callList!=0)
+ gl.glCallList(callList);
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ /**
+ * Build only one call list for both GLCanvas.
+ */
+ protected void buildCallList()
+ {
+ callList = gl.glGenLists(1);
+
+ gl.glNewList(callList, gl.GL_COMPILE);
+ gl.glClearColor(1f, 0f, 0f, 1f);
+ gl.glClear(gl.GL_COLOR_BUFFER_BIT); // Clear the GLCanvas with red.
+ gl.glEndList();
+ }
+ }
+
+}
+
diff --git a/demos/MiscDemos/SharedGLTest2_plugin13.html b/demos/MiscDemos/SharedGLTest2_plugin13.html
new file mode 100644
index 0000000..75bb289
--- /dev/null
+++ b/demos/MiscDemos/SharedGLTest2_plugin13.html
@@ -0,0 +1,45 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 200 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "SharedGLTest2.class" WIDTH = 200 HEIGHT = 400 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "SharedGLTest2.class" WIDTH = 200 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "SharedGLTest2.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "SharedGLTest2.class" WIDTH = 200 HEIGHT = 400>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
diff --git a/demos/MiscDemos/TriangleRotate.html b/demos/MiscDemos/TriangleRotate.html
new file mode 100644
index 0000000..5dad555
--- /dev/null
+++ b/demos/MiscDemos/TriangleRotate.html
@@ -0,0 +1,14 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<applet code="TriangleRotate.class" width=500 height=300>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/TriangleRotate.java b/demos/MiscDemos/TriangleRotate.java
new file mode 100755
index 0000000..c2d93f7
--- /dev/null
+++ b/demos/MiscDemos/TriangleRotate.java
@@ -0,0 +1,139 @@
+/**
+ * @(#) TriangleRotate.java
+ * @(#) author: Joe Zimmerman (converted to Java by Sven Goethel)
+ */
+
+/* This program is free software under the license of LGPL */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class TriangleRotate extends SimpleGLAnimApplet1
+{
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new gldemo(d.width, d.height);
+ add("Center", canvas);
+ }
+
+ public static void main( String args[] ) {
+ GLContext.gljNativeDebug = true;
+ GLContext.gljClassDebug = true;
+ TriangleRotate applet =
+ new TriangleRotate();
+
+ Frame f = new Frame("TriangleRotate");
+
+ f.addWindowListener( new WindowAdapter()
+ {
+ public void windowClosed(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ public void windowClosing(WindowEvent e)
+ {
+ windowClosed(e);
+ }
+ }
+ );
+
+ f.setLayout(new BorderLayout());
+ f.add("Center", applet);
+ applet.setSize(500,300);
+ applet.init();
+ applet.start();
+ Dimension ps = applet.getPreferredSize();
+ f.setBounds(-100,-100,99,99);
+ f.setVisible(true);
+ f.setVisible(false);
+ Insets i = f.getInsets();
+ f.setBounds(0,0,
+ ps.width+i.left+i.right,
+ ps.height+i.top+i.bottom);
+ f.setVisible(true);
+ }
+
+ private class gldemo extends GLAnimCanvas
+ {
+ float rotate;
+
+ float LightAmbient[] = { 0.75f, 0.75f, 0.75f, 1.5f};
+ float LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 0.9f};
+ float LightSpecular[] = { 0.8f, 0.8f, 0.8f, 1.0f};
+
+ public gldemo(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ createOwnWindow = true;
+ }
+
+ public void init()
+ {
+ reshape(getSize().width, getSize().height);
+
+ gl.glEnable(GL_LIGHT0);
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, LightSpecular);
+
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective(45, (float)width/(float)height, 1, 700);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glViewport(0,0,width,height);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+
+ gl.glColor4f(1, 1, 1, 1);
+
+ rotate++;
+
+ gl.glTranslatef(0, 0, -10);
+ gl.glRotatef(rotate, 0, 1, 0);
+ gl.glBegin(GL_POLYGON);
+ gl.glNormal3f( 1, 0, 0);
+ gl.glVertex3f( 0, 1, 0);
+ gl.glVertex3f(-1, -1, 0);
+ gl.glVertex3f( 1, -1, 0);
+ gl.glEnd();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+ }
+}
diff --git a/demos/MiscDemos/TriangleRotate_plugin13.html b/demos/MiscDemos/TriangleRotate_plugin13.html
new file mode 100644
index 0000000..444fa8b
--- /dev/null
+++ b/demos/MiscDemos/TriangleRotate_plugin13.html
@@ -0,0 +1,46 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 500 HEIGHT = 300 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "TriangleRotate.class" WIDTH = 500 HEIGHT = 300 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "TriangleRotate.class" WIDTH = 500 HEIGHT = 300></XMP>
+<PARAM NAME = CODE VALUE = "TriangleRotate.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "TriangleRotate.class" WIDTH = 500 HEIGHT = 300>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/accanti.html b/demos/MiscDemos/accanti.html
new file mode 100644
index 0000000..9730abd
--- /dev/null
+++ b/demos/MiscDemos/accanti.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>OpenGL Demo - ported by Sven Goethel</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Sven Goethel
+<br>
+<applet code="accanti.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/accanti.java b/demos/MiscDemos/accanti.java
new file mode 100644
index 0000000..3191452
--- /dev/null
+++ b/demos/MiscDemos/accanti.java
@@ -0,0 +1,258 @@
+/**
+ * @(#) accanti.java
+ * @(#) author: Silicon Graphics, Inc. (converted to Java by Sven Goethel)
+ */
+
+/*
+ * This program demonstrates lots of material properties.
+ * A single light source illuminates the objects.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+import gl4java.utils.glut.*;
+
+public class accanti extends Applet
+{
+ accantiCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new accantiCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+ public static void main( String args[] ) {
+ GLContext.gljNativeDebug = true;
+ GLContext.gljClassDebug = true;
+
+ accanti applet =
+ new accanti();
+
+ Frame f = new Frame("accanti");
+
+ f.addWindowListener( new WindowAdapter()
+ {
+ public void windowClosed(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ public void windowClosing(WindowEvent e)
+ {
+ windowClosed(e);
+ }
+ }
+ );
+
+ f.setLayout(new BorderLayout());
+ f.add("Center", applet);
+ applet.setSize(500,300);
+ applet.init();
+ applet.start();
+ Dimension ps = applet.getPreferredSize();
+ f.setBounds(-100,-100,99,99);
+ f.setVisible(true);
+ f.setVisible(false);
+ Insets i = f.getInsets();
+ f.setBounds(0,0,
+ ps.width+i.left+i.right,
+ ps.height+i.top+i.bottom);
+ f.setVisible(true);
+ }
+
+ /* Local GLCanvas extension class */
+
+
+ private class accantiCanvas extends GLCanvas
+ {
+ int teapotList;
+ GLUTFunc glut = null;
+
+ public accantiCanvas(int w, int h)
+ {
+ super(w, h);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ accumSize = 8;
+ }
+
+
+ boolean hasAccumulatorBits = false;
+
+ public void init()
+ {
+ int aRbits[] = { 0 };
+ int aGbits[] = { 0 };
+ int aBbits[] = { 0 };
+ int aAbits[] = { 0 };
+
+ glut = new GLUTFuncLightImpl(gl, glu);
+
+ reshape(getSize().width, getSize().height);
+
+ float mat_ambient[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float light_position[] = { 0.0f, 0.0f, 10.0f, 1.0f };
+ float lm_ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
+
+ gl.glGetIntegerv(GL_ACCUM_RED_BITS, aRbits);
+ gl.glGetIntegerv(GL_ACCUM_GREEN_BITS, aGbits);
+ gl.glGetIntegerv(GL_ACCUM_BLUE_BITS, aBbits);
+ gl.glGetIntegerv(GL_ACCUM_ALPHA_BITS, aAbits);
+
+ System.out.println("Accumulation Buffer Bits:");
+ System.out.println("\t red: "+aRbits[0]);
+ System.out.println("\t green: "+aGbits[0]);
+ System.out.println("\t blue: "+aBbits[0]);
+ System.out.println("\t alpha: "+aAbits[0]);
+
+ hasAccumulatorBits = aRbits[0] > 0 || aGbits[0] > 0 ||
+ aBbits[0] > 0 || aAbits[0] > 0 ;
+
+ System.out.println("Has Accumulator Bits: "+hasAccumulatorBits);
+
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, 50.0f);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, light_position);
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lm_ambient);
+
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glDepthFunc(GL_LESS);
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glShadeModel (GL_FLAT);
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ gl.glClearAccum(0.0f, 0.0f, 0.0f, 0.0f);
+ }
+
+ void displayObjects()
+ {
+ float torus_diffuse[] = { 0.7f, 0.7f, 0.0f, 1.0f };
+ float cube_diffuse[] = { 0.0f, 0.7f, 0.7f, 1.0f };
+ float sphere_diffuse[] = { 0.7f, 0.0f, 0.7f, 1.0f };
+ float octa_diffuse[] = { 0.7f, 0.4f, 0.4f, 1.0f };
+
+ gl.glPushMatrix ();
+ gl.glRotatef (30.0f, 1.0f, 0.0f, 0.0f);
+
+ gl.glPushMatrix ();
+ gl.glTranslatef (-0.80f, 0.35f, 0.0f);
+ gl.glRotatef (100.0f, 1.0f, 0.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, torus_diffuse);
+ glut.glutSolidTorus (0.275f, 0.85f, 16, 16);
+ gl.glPopMatrix ();
+
+ gl.glPushMatrix ();
+ gl.glTranslatef (-0.75f, -0.50f, 0.0f);
+ gl.glRotatef (45.0f, 0.0f, 0.0f, 1.0f);
+ gl.glRotatef (45.0f, 1.0f, 0.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, cube_diffuse);
+ glut.glutSolidCube (1.5f);
+ gl.glPopMatrix ();
+
+ gl.glPushMatrix ();
+ gl.glTranslatef (0.75f, 0.60f, 0.0f);
+ gl.glRotatef (30.0f, 1.0f, 0.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, sphere_diffuse);
+ glut.glutSolidSphere (1.0f, 16, 16);
+ gl.glPopMatrix ();
+
+ gl.glPushMatrix ();
+ gl.glTranslatef (0.70f, -0.90f, 0.25f);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, octa_diffuse);
+ glut.glutSolidOctahedron ();
+ gl.glPopMatrix ();
+
+ gl.glPopMatrix ();
+ }
+
+ public void display()
+ {
+ int viewport[]=new int[4];
+ int jitter;
+ int ACSIZE=8;
+
+ if (glj.gljMakeCurrent() == false) return;
+
+ gl.glGetIntegerv (GL_VIEWPORT, viewport);
+ glj.gljCheckGL();
+
+ if(hasAccumulatorBits)
+ gl.glClear(GL_ACCUM_BUFFER_BIT);
+ glj.gljCheckGL();
+
+ for (jitter = 0; jitter < ACSIZE; jitter++) {
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gl.glPushMatrix ();
+
+ /* Note that 4.5f is the distance in world space between
+ * left and right and bottom and top.
+ * This formula converts fractional pixel movement to
+ * world coordinates.
+ */
+ gl.glTranslatef (/*j8[jitter].x**/4.5f/viewport[2],
+ /*j8[jitter].y**/4.5f/viewport[3], 0.0f);
+ displayObjects ();
+ gl.glPopMatrix ();
+ if(hasAccumulatorBits)
+ gl.glAccum(GL_ACCUM, 1.0f/(float)ACSIZE);
+ glj.gljCheckGL();
+ }
+ if(hasAccumulatorBits)
+ gl.glAccum (GL_RETURN, 1.0f);
+ glj.gljCheckGL();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void reshape(int w, int h)
+ {
+ gl.glViewport(0, 0, w, h);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ if (w <= h)
+ gl.glOrtho (-2.25f, 2.25f, -2.25f*h/w, 2.25f*h/w, -10.0f, 10.0f);
+ else
+ gl.glOrtho (-2.25f*w/h, 2.25f*w/h, -2.25f, 2.25f, -10.0f, 10.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+ }
+}
diff --git a/demos/MiscDemos/accanti_plugin13.html b/demos/MiscDemos/accanti_plugin13.html
new file mode 100644
index 0000000..0a1597d
--- /dev/null
+++ b/demos/MiscDemos/accanti_plugin13.html
@@ -0,0 +1,48 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>OpenGL Demo - ported by Sven Goethel</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Sven Goethel
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "accanti.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "accanti.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "accanti.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "accanti.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/alpha3D.html b/demos/MiscDemos/alpha3D.html
new file mode 100644
index 0000000..43e5aaf
--- /dev/null
+++ b/demos/MiscDemos/alpha3D.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>OpenGL Demo - ported by Sven Goethel</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Sven Goethel
+<br>
+<applet code="alpha3D.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/alpha3D.java b/demos/MiscDemos/alpha3D.java
new file mode 100644
index 0000000..a982375
--- /dev/null
+++ b/demos/MiscDemos/alpha3D.java
@@ -0,0 +1,287 @@
+/**
+ * @(#) alpha3D.java
+ * @(#) author: Silicon Graphics, Inc. (converted to Java by Sven Goethel)
+ */
+
+/*
+ * This program demonstrates lots of material properties.
+ * A single light source illuminates the objects.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+import gl4java.utils.glut.*;
+
+public class alpha3D extends SimpleGLAnimApplet1
+{
+ static final float MAXZ = 8.0f;
+ static final float MINZ = -8.0f;
+ static final float ZINC = 0.4f;
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new alpha3DCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ public static void main( String args[] ) {
+ alpha3D applet =
+ new alpha3D();
+
+ Frame f = new Frame("alpha3D");
+
+ f.addWindowListener( new WindowAdapter()
+ {
+ public void windowClosed(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ public void windowClosing(WindowEvent e)
+ {
+ windowClosed(e);
+ }
+ }
+ );
+
+ f.setLayout(new BorderLayout());
+ f.add("Center", applet);
+ applet.setSize(500,300);
+ applet.init();
+ applet.start();
+ Dimension ps = applet.getPreferredSize();
+ f.setBounds(-100,-100,99,99);
+ f.setVisible(true);
+ f.setVisible(false);
+ Insets i = f.getInsets();
+ f.setBounds(0,0,
+ ps.width+i.left+i.right,
+ ps.height+i.top+i.bottom);
+ f.setVisible(true);
+ }
+ /* Local GLCanvas extension class */
+
+
+ private class alpha3DCanvas extends GLAnimCanvas
+ implements MouseListener, ActionListener
+ {
+ private PopupMenu menu = null;
+ private boolean menu_showing = false;
+ private boolean save_suspended = false;
+ private final String MENUE_0 = "Alpha Mode";
+ private final String MENUE_1 = "Real Mode";
+
+ GLUTFunc glut = null;
+
+ float solidZ = MAXZ;
+ float transparentZ = MINZ;
+ int sphereList, cubeList;
+
+ public alpha3DCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+
+ public void init()
+ {
+ glut = new GLUTFuncLightImpl(gl, glu);
+
+ reshape(getSize().width, getSize().height);
+
+ float mat_specular[] = { 1.0f, 1.0f, 1.0f, 0.15f };
+ float mat_shininess[] = { 100.0f };
+ float position[] = { 0.5f, 0.5f, 1.0f, 0.0f };
+
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, position);
+
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ sphereList = gl.glGenLists(1);
+ gl.glNewList(sphereList, GL_COMPILE);
+ glut.glutSolidSphere (0.4f, 16, 16);
+ gl.glEndList();
+
+ cubeList = gl.glGenLists(1);
+ gl.glNewList(cubeList, GL_COMPILE);
+ glut.glutSolidCube (0.6f);
+ gl.glEndList();
+
+ menu = new PopupMenu("Options");
+ menu.add(MENUE_0);
+ menu.add(MENUE_1);
+ menu.addActionListener(this);
+ add(menu);
+
+ addMouseListener(this);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ float mat_solid[] = { 0.75f, 0.75f, 0.0f, 1.0f };
+ float mat_zero[] = { 0.0f, 0.0f, 0.0f, 1.0f };
+ float mat_transparent[] = { 0.0f, 0.8f, 0.8f, 0.6f };
+ float mat_emission[] = { 0.0f, 0.3f, 0.3f, 0.6f };
+
+ gl.glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ gl.glPushMatrix ();
+ gl.glTranslatef (-0.15f, -0.15f, solidZ);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, mat_zero);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_solid);
+ gl.glCallList (sphereList);
+ gl.glPopMatrix ();
+
+ gl.glPushMatrix ();
+ gl.glTranslatef (0.15f, 0.15f, transparentZ);
+ gl.glRotatef (15.0f, 1.0f, 1.0f, 0.0f);
+ gl.glRotatef (30.0f, 0.0f, 1.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_transparent);
+ gl.glEnable (GL_BLEND);
+ gl.glDepthMask (GL_FALSE);
+ gl.glBlendFunc (GL_SRC_ALPHA, GL_ONE);
+ gl.glCallList (cubeList);
+ gl.glDepthMask (GL_TRUE);
+ gl.glDisable (GL_BLEND);
+ gl.glPopMatrix ();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ animate();
+ }
+
+ public void reshape(int w, int h)
+ {
+ gl.glViewport(0, 0, (int) w, (int) h);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ if (w <= h)
+ gl.glOrtho (-1.5f, 1.5f, -1.5f*(float)h/(float)w,
+ 1.5f*(float)h/(float)w, -10.0f, 10.0f);
+ else
+ gl.glOrtho (-1.5f*(float)w/(float)h,
+ 1.5f*(float)w/(float)h, -1.5f, 1.5f, -10.0f, 10.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ }
+
+ void animate()
+ {
+ if (solidZ <= MINZ || transparentZ >= MAXZ)
+ setSuspended(true);
+ else {
+ solidZ -= ZINC;
+ transparentZ += ZINC;
+ }
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered(MouseEvent evt)
+ {
+ }
+
+ public void mouseExited(MouseEvent evt)
+ {
+ }
+
+ public void mousePressed(MouseEvent evt)
+ {
+ if (!menu_showing)
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ menu_showing = true;
+ save_suspended = isSuspended();
+ if (!save_suspended)
+ {
+ setSuspended(true);
+ repaint(100);
+ try
+ {
+ Thread.currentThread().sleep(200);
+ }
+ catch (Exception e)
+ { }
+ }
+ menu.show(this,evt.getX(),evt.getY());
+ }
+ else
+ {
+ // Must be left button.
+ if (isSuspended()) repaint();
+ }
+ }
+ else
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+
+ public void mouseReleased(MouseEvent evt)
+ {
+ }
+
+ public void mouseClicked(MouseEvent evt)
+ {
+ }
+
+ // Method required for the implementation of ActionListener
+ public void actionPerformed(ActionEvent evt)
+ {
+ String c = evt.getActionCommand();
+ if (c.equals(MENUE_0))
+ {
+ solidZ = MAXZ;
+ transparentZ = MINZ;
+ setSuspended(false);
+ return ;
+ }
+ else if (c.equals(MENUE_1))
+ {
+ solidZ = MAXZ;
+ transparentZ = MINZ;
+ setSuspended(true);
+ repaint();
+ }
+ if (menu_showing)
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+ }
+}
diff --git a/demos/MiscDemos/alpha3D_plugin13.html b/demos/MiscDemos/alpha3D_plugin13.html
new file mode 100644
index 0000000..5b0e6b7
--- /dev/null
+++ b/demos/MiscDemos/alpha3D_plugin13.html
@@ -0,0 +1,48 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>OpenGL Demo - ported by Sven Goethel</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Sven Goethel
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "alpha3D.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "alpha3D.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "alpha3D.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "alpha3D.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/anti.html b/demos/MiscDemos/anti.html
new file mode 100644
index 0000000..95146a3
--- /dev/null
+++ b/demos/MiscDemos/anti.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>OpenGL Demo - ported by Sven Goethel</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Sven Goethel
+<br>
+<applet code="anti.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/anti.java b/demos/MiscDemos/anti.java
new file mode 100644
index 0000000..eafb66a
--- /dev/null
+++ b/demos/MiscDemos/anti.java
@@ -0,0 +1,162 @@
+/**
+ * @(#) anti.java
+ * @(#) author: Silicon Graphics, Inc. (converted to Java by Ron Cemer)
+ */
+
+/*
+ * This program demonstrates lots of material properties.
+ * A single light source illuminates the objects.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+import gl4java.utils.glut.*;
+
+public class anti extends Applet
+{
+ antiCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new antiCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+ public static void main( String args[] ) {
+ anti applet =
+ new anti();
+
+ Frame f = new Frame("anti");
+
+ f.addWindowListener( new WindowAdapter()
+ {
+ public void windowClosed(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ public void windowClosing(WindowEvent e)
+ {
+ windowClosed(e);
+ }
+ }
+ );
+
+ f.setLayout(new BorderLayout());
+ f.add("Center", applet);
+ applet.setSize(500,300);
+ applet.init();
+ applet.start();
+ Dimension ps = applet.getPreferredSize();
+ f.setBounds(-100,-100,99,99);
+ f.setVisible(true);
+ f.setVisible(false);
+ Insets i = f.getInsets();
+ f.setBounds(0,0,
+ ps.width+i.left+i.right,
+ ps.height+i.top+i.bottom);
+ f.setVisible(true);
+ }
+ /* Local GLCanvas extension class */
+
+
+ private class antiCanvas extends GLCanvas
+ {
+ GLUTFunc glut = null;
+
+ public antiCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+/* Initialize antialia(float)Math.sing for RGBA mode, including alpha
+ * blending, hint, and line width. Print out implementation
+ * specific info on line width granularity and width.
+ */
+ public void init()
+ {
+ glut = new GLUTFuncLightImpl(gl, glu);
+
+ reshape(getSize().width, getSize().height);
+
+ float values[]=new float[2];
+ gl.glGetFloatv (GL_LINE_WIDTH_GRANULARITY, values);
+ System.out.println("GL_LINE_WIDTH_GRANULARITY value is "+values[0]);
+
+ gl.glGetFloatv (GL_LINE_WIDTH_RANGE, values);
+ System.out.println("GL_LINE_WIDTH_RANGE values are "+
+ values[0] + ", " +values[1]);
+
+ gl.glEnable (GL_LINE_SMOOTH);
+ gl.glEnable (GL_BLEND);
+ gl.glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ gl.glHint (GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
+ gl.glLineWidth (1.5f);
+
+ gl.glShadeModel(GL_FLAT);
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ gl.glDepthFunc(GL_LESS);
+ gl.glEnable(GL_DEPTH_TEST);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gl.glColor4f (1.0f, 1.0f, 1.0f, 1.0f);
+ glut.glutWireIcosahedron();
+ glj.gljSwap();
+ glj.gljFree();
+ }
+
+ public void reshape(int w, int h)
+ {
+ gl.glViewport(0, 0, w, h);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective (45.0f, (float) w/(float) h, 3.0f, 5.0f);
+
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity ();
+ gl.glTranslatef (0.0f, 0.0f, -4.0f); /* move object into view */
+ }
+ }
+}
+
diff --git a/demos/MiscDemos/anti_plugin13.html b/demos/MiscDemos/anti_plugin13.html
new file mode 100644
index 0000000..1800131
--- /dev/null
+++ b/demos/MiscDemos/anti_plugin13.html
@@ -0,0 +1,48 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>OpenGL Demo - ported by Sven Goethel</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Sven Goethel
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "anti.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "anti.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "anti.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "anti.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/coloredCross.java b/demos/MiscDemos/coloredCross.java
new file mode 100644
index 0000000..52cab5b
--- /dev/null
+++ b/demos/MiscDemos/coloredCross.java
@@ -0,0 +1,111 @@
+import gl4java.awt.*;
+import java.applet.*;
+import java.awt.*;
+import java.awt.Dimension;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import gl4java.*;
+
+public class coloredCross extends Applet
+{
+ MyCanvas canvas = null;
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new MyCanvas (d.width, d.height);
+ add("Center", canvas);
+ }
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("coloredCross");
+
+ coloredCross applet = new coloredCross();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+ public void start()
+ {
+ }
+
+
+ public void stop()
+ {
+ }
+
+ protected class MyCanvas extends GLCanvas
+ {
+ public MyCanvas(int w, int h) {
+ super(w,h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void init() {
+ reshape(getSize().width, getSize().height);
+ }
+
+ public void display()
+ {
+ /* Standard GL4Java Init */
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ System.out.println("display()");
+
+ gl.glPushMatrix();
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+
+ gl.glBegin(GLEnum.GL_LINES);
+ gl.glColor4f(0f, 0f, 1f, 1f);
+ gl.glVertex3i( 0, 0, 0);
+ gl.glVertex3i( 10, 10, 0);
+
+ gl.glColor4f(0f, 1f, 0f, 1f);
+ gl.glVertex3i( 0, 10, 0);
+ gl.glVertex3i( 10, 0, 0);
+
+ gl.glColor4f(1f, 0f, 0f, 1f);
+ gl.glVertex3i( 0, 5, 0);
+ gl.glVertex3i( 10, 5, 0);
+
+ gl.glColor4f(1f, 1f, 1f, 1f);
+ gl.glVertex3i( 5, 0, 0);
+ gl.glVertex3i( 5, 10, 0);
+ gl.glEnd();
+
+ gl.glPopMatrix();
+
+ /* For your animation dutys ;-) */
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ System.out.println("display() done");
+
+ }
+
+ public void reshape( int width, int height )
+ {
+ gl.glViewport(0, 0, width, height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glOrtho(0, 10, 0, 10, -50.0,50.0);
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+ }
+}
diff --git a/demos/MiscDemos/depthcue.html b/demos/MiscDemos/depthcue.html
new file mode 100644
index 0000000..53cba75
--- /dev/null
+++ b/demos/MiscDemos/depthcue.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>OpenGL Demo - ported by Sven Goethel</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Sven Goethel
+<br>
+<applet code="depthcue.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/depthcue.java b/demos/MiscDemos/depthcue.java
new file mode 100644
index 0000000..3b6f04b
--- /dev/null
+++ b/demos/MiscDemos/depthcue.java
@@ -0,0 +1,140 @@
+/**
+ * @(#) depthcue.java
+ * @(#) author: Silicon Graphics, Inc. (converted to Java by Ron Cemer)
+ */
+
+/*
+ * This program demonstrates lots of material properties.
+ * A single light source illuminates the objects.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+import gl4java.utils.glut.*;
+
+public class depthcue extends Applet
+{
+ depthcueCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new depthcueCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("teapots");
+
+ depthcue applet = new depthcue();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class depthcueCanvas extends GLCanvas
+ {
+ GLUTFunc glut = null;
+
+ public depthcueCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+/* Initialize depthcuealia(float)Math.sing for RGBA mode, including alpha
+ * blending, hint, and line width. Print out implementation
+ * specific info on line width granularity and width.
+ */
+ public void init()
+ {
+ glut = new GLUTFuncLightImpl(gl, glu);
+
+ reshape(getSize().width, getSize().height);
+
+ float fogColor[] = {0.0f, 0.0f, 0.0f, 1.0f};
+
+ gl.glEnable(GL_FOG);
+ gl.glFogi (GL_FOG_MODE, GL_LINEAR);
+ gl.glHint (GL_FOG_HINT, GL_NICEST); /* per pixel */
+ gl.glFogf (GL_FOG_START, 3.0f);
+ gl.glFogf (GL_FOG_END, 5.0f);
+ gl.glFogfv (GL_FOG_COLOR, fogColor);
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+
+ gl.glShadeModel(GL_FLAT);
+ gl.glDepthFunc(GL_LESS);
+ gl.glEnable(GL_DEPTH_TEST);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gl.glColor3f (1.0f, 1.0f, 1.0f);
+ glut.glutWireIcosahedron();
+ glj.gljSwap();
+ glj.gljFree();
+ }
+
+ public void reshape(int w, int h)
+ {
+ gl.glViewport(0, 0, w, h);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective (45.0f, (float) w/(float) h, 3.0f, 5.0f);
+
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity ();
+ gl.glTranslatef (0.0f, 0.0f, -4.0f); /* move object into view */
+ }
+ }
+}
+
diff --git a/demos/MiscDemos/depthcue_plugin13.html b/demos/MiscDemos/depthcue_plugin13.html
new file mode 100644
index 0000000..a4b4a9e
--- /dev/null
+++ b/demos/MiscDemos/depthcue_plugin13.html
@@ -0,0 +1,48 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>OpenGL Demo - ported by Sven Goethel</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Sven Goethel
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "depthcue.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "depthcue.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "depthcue.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "depthcue.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/gears.html b/demos/MiscDemos/gears.html
new file mode 100644
index 0000000..56ebd8e
--- /dev/null
+++ b/demos/MiscDemos/gears.html
@@ -0,0 +1,13 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<applet code="gears.class" width=550 height=400>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
diff --git a/demos/MiscDemos/gears.java b/demos/MiscDemos/gears.java
new file mode 100644
index 0000000..b61d711
--- /dev/null
+++ b/demos/MiscDemos/gears.java
@@ -0,0 +1,437 @@
+/**
+ * @(#) gears.java
+ * @(#) author: Brian Paul (converted to Java by Ron Cemer and Sven Goethel)
+ *
+ * This version is equal to Brian Paul's version 1.2 1999/10/21
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.GLEnum;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class gears extends SimpleGLAnimApplet1
+{
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ init(false);
+ }
+
+ public void init(boolean showGL)
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new gearsCanvas(showGL, d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ public static void main( String args[] )
+ {
+ int i = 0;
+ String glLib = null;
+ String gluLib = null;
+ boolean perftest=false;
+
+ while(args.length>i)
+ {
+ if(args[i].equals("-perftest"))
+ {
+ perftest=true;
+ } else if(args[i].equals("-glLib"))
+ {
+ i++;
+ if(args.length>i)
+ glLib=args[i];
+ } else if(args[i].equals("-gluLib"))
+ {
+ i++;
+ if(args.length>i)
+ gluLib=args[i];
+ } else {
+ System.out.println("illegal arg "+i+": "+args[i]);
+ }
+ i++;
+ }
+
+ if(!perftest)
+ {
+ GLContext.gljNativeDebug = true;
+ GLContext.gljClassDebug = true;
+ }
+
+ System.out.println("loading libs(gl, glu): "+
+ glLib+", "+gluLib+": "+
+ GLContext.loadNativeLibraries(null, glLib, gluLib));
+
+ Frame mainFrame = new Frame("gears");
+
+ gears applet = new gears();
+
+ applet.setSize(300, 300);
+ applet.init(true);
+
+ if(perftest)
+ {
+ applet.canvas.setUseFpsSleep(false);
+ applet.canvas.setUseRepaint(false);
+ System.out.println("useFpsSleep: "+
+ applet.canvas.getUseFpsSleep());
+ System.out.println("useRepaint: "+
+ applet.canvas.getUseRepaint());
+ }
+
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class gearsCanvas extends GLAnimCanvas implements MouseListener, MouseMotionListener
+ {
+ private static final float M_PI = 3.14159265f;
+
+ private long T0 = 0;
+ private long Frames = 0;
+
+ private float view_rotx = 20.0f, view_roty = 30.0f, view_rotz = 0.0f;
+ private int gear1, gear2, gear3;
+ private float angle = 0.0f;
+
+ private int prevMouseX, prevMouseY;
+ private boolean mouseRButtonDown = false;
+
+ private boolean showGL = false;
+
+ public gearsCanvas(int w, int h)
+ {
+ this(false, w, h);
+ }
+
+ public gearsCanvas(boolean showGL, int w, int h)
+ {
+ super(w, h);
+ setAnimateFps(30.0);
+
+ this.showGL=showGL;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ reshape(getSize().width, getSize().height);
+
+ float pos[] = { 5.0f, 5.0f, 10.0f, 0.0f };
+ float red[] = { 0.8f, 0.1f, 0.0f, 1.0f };
+ float green[] = { 0.0f, 0.8f, 0.2f, 1.0f };
+ float blue[] = { 0.2f, 0.2f, 1.0f, 1.0f };
+
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ gl.glEnable(GL_CULL_FACE);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ /* make the gears */
+ gear1 = gl.glGenLists(1);
+ gl.glNewList(gear1, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
+ gear(1.0f, 4.0f, 1.0f, 20, 0.7f);
+ gl.glEndList();
+
+ gear2 = gl.glGenLists(1);
+ gl.glNewList(gear2, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
+ gear(0.5f, 2.0f, 2.0f, 10, 0.7f);
+ gl.glEndList();
+
+ gear3 = gl.glGenLists(1);
+ gl.glNewList(gear3, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+ gear(1.3f, 2.0f, 0.5f, 10, 0.7f);
+ gl.glEndList();
+
+ gl.glEnable(GL_NORMALIZE);
+
+ glj.gljCheckGL();
+
+ addMouseListener(this);
+ addMouseMotionListener(this);
+
+ T0=System.currentTimeMillis();
+ }
+
+ public void doCleanup()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ removeMouseMotionListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ float h = (float)height / (float)width;
+
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glFrustum(-1.0f, 1.0f, -h, h, 5.0f, 60.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glTranslatef(0.0f, 0.0f, -40.0f);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ if(showGL)
+ {
+ showGL=false;
+ System.out.println("GL VERSION : "+gl.glGetString(GL_VERSION));
+ System.out.println("GL RENDERER: "+gl.glGetString(GL_RENDERER));
+ System.out.println("GL VENDOR : "+gl.glGetString(GL_VENDOR));
+ }
+
+ angle += 2.0f;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ gl.glPushMatrix();
+ gl.glRotatef(view_rotx, 1.0f, 0.0f, 0.0f);
+ gl.glRotatef(view_roty, 0.0f, 1.0f, 0.0f);
+ gl.glRotatef(view_rotz, 0.0f, 0.0f, 1.0f);
+
+ gl.glPushMatrix();
+ gl.glTranslatef(-3.0f, -2.0f, 0.0f);
+ gl.glRotatef(angle, 0.0f, 0.0f, 1.0f);
+ gl.glCallList(gear1);
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(3.1f, -2.0f, 0.0f);
+ gl.glRotatef(-2.0f * angle - 9.0f, 0.0f, 0.0f, 1.0f);
+ gl.glCallList(gear2);
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(-3.1f, 4.2f, 0.0f);
+ gl.glRotatef(-2.0f * angle - 25.0f, 0.0f, 0.0f, 1.0f);
+ gl.glCallList(gear3);
+ gl.glPopMatrix();
+
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ Frames++;
+
+ long t=System.currentTimeMillis();
+ if(t - T0 >= 5000)
+ {
+ double seconds = (double)(t - T0) / 1000.0;
+ double fps = (double)Frames / seconds;
+ System.out.println(Frames+" frames in "+seconds+" seconds = "+
+ fps+" FPS");
+ T0 = t;
+ Frames = 0;
+ }
+ }
+
+ private void gear
+ (float inner_radius,
+ float outer_radius,
+ float width,
+ int teeth,
+ float tooth_depth)
+ {
+ int i;
+ float r0, r1, r2;
+ float angle, da;
+ float u, v, len;
+
+ r0 = inner_radius;
+ r1 = outer_radius - tooth_depth / 2.0f;
+ r2 = outer_radius + tooth_depth / 2.0f;
+
+ da = 2.0f * M_PI / teeth / 4.0f;
+
+ gl.glShadeModel(GL_FLAT);
+
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+
+ /* draw front face */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
+ if(i < teeth)
+ {
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3.0f * da), r1 * (float)Math.sin(angle + 3.0f * da), width * 0.5f);
+ }
+ }
+ gl.glEnd();
+
+ /* draw front sides of teeth */
+ gl.glBegin(GL_QUADS);
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2.0f * da), r2 * (float)Math.sin(angle + 2.0f * da), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3.0f * da), r1 * (float)Math.sin(angle + 3.0f * da), width * 0.5f);
+ }
+ gl.glEnd();
+
+ /* draw back face */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
+ }
+ gl.glEnd();
+
+ /* draw back sides of teeth */
+ gl.glBegin(GL_QUADS);
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), -width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), -width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
+ }
+ gl.glEnd();
+
+ /* draw outward faces of teeth */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
+ u = r2 * (float)Math.cos(angle + da) - r1 * (float)Math.cos(angle);
+ v = r2 * (float)Math.sin(angle + da) - r1 * (float)Math.sin(angle);
+ len = (float)Math.sqrt(u * u + v * v);
+ u /= len;
+ v /= len;
+ gl.glNormal3f(v, -u, 0.0f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), -width * 0.5f);
+ gl.glNormal3f((float)Math.cos(angle), (float)Math.sin(angle), 0.0f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), -width * 0.5f);
+ u = r1 * (float)Math.cos(angle + 3 * da) - r2 * (float)Math.cos(angle + 2 * da);
+ v = r1 * (float)Math.sin(angle + 3 * da) - r2 * (float)Math.sin(angle + 2 * da);
+ gl.glNormal3f(v, -u, 0.0f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
+ gl.glNormal3f((float)Math.cos(angle), (float)Math.sin(angle), 0.0f);
+ }
+ gl.glVertex3f(r1 * (float)Math.cos(0), r1 * (float)Math.sin(0), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(0), r1 * (float)Math.sin(0), -width * 0.5f);
+ gl.glEnd();
+
+ gl.glShadeModel(GL_SMOOTH);
+
+ /* draw inside radius cylinder */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glNormal3f(-(float)Math.cos(angle), -(float)Math.sin(angle), 0.0f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
+ }
+ gl.glEnd();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ prevMouseX = evt.getX();
+ prevMouseY = evt.getY();
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ mouseRButtonDown = true;
+ evt.consume();
+ }
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ mouseRButtonDown = false;
+ evt.consume();
+ }
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ }
+
+ // Methods required for the implementation of MouseMotionListener
+ public void mouseDragged( MouseEvent evt )
+ {
+ int x = evt.getX();
+ int y = evt.getY();
+ Dimension size = getSize();
+
+ float thetaY = 360.0f * ( (float)(x-prevMouseX)/(float)size.width);
+ float thetaX = 360.0f * ( (float)(prevMouseY-y)/(float)size.height);
+
+ prevMouseX = x;
+ prevMouseY = y;
+
+ view_rotx += thetaX;
+ view_roty += thetaY;
+
+ evt.consume();
+ }
+
+ public void mouseMoved( MouseEvent evt )
+ {
+ }
+ }
+}
diff --git a/demos/MiscDemos/gears_plugin13.html b/demos/MiscDemos/gears_plugin13.html
new file mode 100644
index 0000000..acaaea5
--- /dev/null
+++ b/demos/MiscDemos/gears_plugin13.html
@@ -0,0 +1,45 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 550 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "gears.class" WIDTH = 550 HEIGHT = 400 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "gears.class" WIDTH = 550 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "gears.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "gears.class" WIDTH = 550 HEIGHT = 400>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
diff --git a/demos/MiscDemos/glJavaFontTest1.java b/demos/MiscDemos/glJavaFontTest1.java
new file mode 100644
index 0000000..78ccd39
--- /dev/null
+++ b/demos/MiscDemos/glJavaFontTest1.java
@@ -0,0 +1,120 @@
+// Font rendering using GL4Java
+// by Pontus Lidman
+// (c) 2000 MathCore AB
+
+import gl4java.awt.*;
+import javax.swing.*;
+import java.awt.Dimension;
+import gl4java.GLContext;
+import gl4java.GLFunc;
+
+import java.awt.Font;
+import java.awt.Shape;
+import java.awt.font.*;
+import java.awt.geom.*;
+
+public class glJavaFontTest1 {
+
+
+ protected class MyCanvas extends GLCanvas {
+
+
+ public void drawString(String s,double x,double y) {
+
+ Font font=new Font("timesroman",Font.PLAIN,12);
+ AffineTransform identity=new AffineTransform();
+ FontRenderContext frc=new FontRenderContext(identity,false,false);
+ GlyphVector g=font.createGlyphVector(frc,s);
+ Shape shp=g.getOutline();
+ FlatteningPathIterator path=new FlatteningPathIterator(shp.getPathIterator(identity),0.05);
+
+ double [] coords=new double[6];
+ int type;
+
+ while (!path.isDone()) {
+ type=path.currentSegment(coords);
+ switch(type) {
+ case PathIterator.SEG_MOVETO:
+ gl.glBegin(GL_LINE_STRIP);
+ gl.glVertex2d(x+coords[0],y+coords[1]);
+ break;
+ case PathIterator.SEG_LINETO:
+ gl.glVertex2d(x+coords[0],y+coords[1]);
+ break;
+ case PathIterator.SEG_CLOSE:
+ gl.glEnd();
+ break;
+ }
+ path.next();
+ }
+ }
+
+ public MyCanvas(int w, int h) {
+ super(w,h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void init() {
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glOrtho(-50,50,50,-50,-50.0,50.0);
+ gl.glMatrixMode(GL_MODELVIEW);
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int w, int h) {
+ Dimension d=new Dimension(w,h);
+ if (!cvsIsInit()) return;
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("problem in use() method");
+ return;
+ }
+ setSize(d);
+ gl.glViewport(0,0,w,h);
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void display() {
+ int i;
+
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ gl.glPushMatrix();
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+ glu.gluLookAt(0, 0, 20, 0, 0, 0, 0, 1, 0);
+
+ gl.glColor3d(1,1,1);
+ drawString("Hello world!",-40,0);
+
+
+ gl.glPopMatrix();
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+ }
+
+ protected MyCanvas cvs;
+ protected JFrame frame;
+
+ public glJavaFontTest1() {
+ frame = new JFrame( "OpenGL" );
+ cvs= new MyCanvas(640,480);
+ frame.setSize(640,480);
+ frame.getContentPane().add("Center", cvs);
+ frame.setVisible(true);
+ }
+
+ public static void main(java.lang.String[] args) {
+ try {
+ glJavaFontTest1 g=new glJavaFontTest1();
+ } catch (Throwable exception) {
+ System.err.println("Exception occurred in main()");
+ exception.printStackTrace(System.out);
+ }
+ }
+}
diff --git a/demos/MiscDemos/glutFontBitmapTest.html b/demos/MiscDemos/glutFontBitmapTest.html
new file mode 100644
index 0000000..d70bcd9
--- /dev/null
+++ b/demos/MiscDemos/glutFontBitmapTest.html
@@ -0,0 +1,15 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<br>
+<hr>
+<applet code="glutFontBitmapTest.class" width=600 height=400>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/glutFontBitmapTest.java b/demos/MiscDemos/glutFontBitmapTest.java
new file mode 100644
index 0000000..bb2a2a4
--- /dev/null
+++ b/demos/MiscDemos/glutFontBitmapTest.java
@@ -0,0 +1,137 @@
+// Test program for GLUT Bitmap font rendering functions
+// by Pontus Lidman
+// Copyright 2000 MathCore AB
+//
+// This file/package is licensed under the terms of the LPGL
+// with the permission of Pontus Lidman / Mathcore !
+//
+
+import gl4java.utils.glut.*;
+import gl4java.utils.glut.fonts.*;
+
+import gl4java.awt.*;
+import java.applet.*;
+import java.awt.*;
+import java.awt.Dimension;
+import gl4java.GLContext;
+import gl4java.GLFunc;
+
+public class glutFontBitmapTest extends Applet {
+
+ protected GLUTFunc glut = null;
+
+ protected class MyCanvas extends GLCanvas
+ {
+
+ boolean print_tests=false;
+
+ public MyCanvas(int w, int h) {
+ super(w,h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void init() {
+ glut = new GLUTFuncLightImplWithFonts(gl, glu);
+
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glOrtho(-1,1,-1,1,-50.0,50.0);
+ gl.glMatrixMode(GL_MODELVIEW);
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int w, int h) {
+ Dimension d=new Dimension(w,h);
+ if (!cvsIsInit()) return;
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("problem in use() method");
+ return;
+ }
+ setSize(d);
+ gl.glViewport(0,0,w,h);
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void display() {
+ int i;
+
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ gl.glPushMatrix();
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+ glu.gluLookAt(0, 0, 20, 0, 0, 0, 0, 1, 0);
+
+ gl.glColor3d(0.3,0,0);
+
+ gl.glBegin(GL_POLYGON);
+ gl.glVertex2d(0,-0.5);
+ gl.glVertex2d(0.5,0.5);
+ gl.glVertex2d(-0.5,0.5);
+ gl.glEnd();
+
+ gl.glColor3d(1,1,1);
+ gl.glRasterPos2d(-0.2,-0.2);
+ glut.glutBitmapString(glut.GLUT_BITMAP_8_BY_13,"8x13 Font");
+ gl.glRasterPos2d(-0.2,-0.1);
+ glut.glutBitmapString(glut.GLUT_BITMAP_9_BY_15,"9x15 Font");
+ gl.glRasterPos2d(-0.2,0.0);
+ glut.glutBitmapString(glut.GLUT_BITMAP_HELVETICA_10,"Helvetica 10 Font");
+ gl.glRasterPos2d(-0.2,0.1);
+ glut.glutBitmapString(glut.GLUT_BITMAP_HELVETICA_12,"Helvetica 12 Font");
+ gl.glRasterPos2d(-0.2,0.2);
+ glut.glutBitmapString(glut.GLUT_BITMAP_HELVETICA_18,"Helvetica 18 Font");
+ gl.glRasterPos2d(-0.2,0.3);
+ glut.glutBitmapString(glut.GLUT_BITMAP_TIMES_ROMAN_10,"Times Roman 10 Font");
+ gl.glRasterPos2d(-0.2,0.4);
+ glut.glutBitmapString(glut.GLUT_BITMAP_TIMES_ROMAN_24,"Times Roman 24 Font");
+
+ gl.glPopMatrix();
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+ }
+
+ protected MyCanvas cvs;
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ cvs= new MyCanvas(d.width,d.height);
+ add("Center", cvs);
+ }
+
+ public void start()
+ {
+ }
+
+
+ public void stop()
+ {
+ }
+
+ public static void main(java.lang.String[] args) {
+ try {
+ Frame mainFrame = new Frame("FontTest");
+
+ glutFontBitmapTest applet=new glutFontBitmapTest();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ } catch (Throwable exception) {
+ System.err.println("Exception occurred in main()");
+ exception.printStackTrace(System.out);
+ }
+ }
+}
diff --git a/demos/MiscDemos/glutFontBitmapTest2Applet$glutF b/demos/MiscDemos/glutFontBitmapTest2Applet$glutF
new file mode 100644
index 0000000..a23aee0
--- /dev/null
+++ b/demos/MiscDemos/glutFontBitmapTest2Applet$glutF
Binary files differ
diff --git a/demos/MiscDemos/glutFontBitmapTest2Applet.html b/demos/MiscDemos/glutFontBitmapTest2Applet.html
new file mode 100644
index 0000000..a10559b
--- /dev/null
+++ b/demos/MiscDemos/glutFontBitmapTest2Applet.html
@@ -0,0 +1,16 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<B>Try to drag the mouse (press-button and move) with/without the SHIFT key!</B>
+<br>
+<hr>
+<applet code="glutFontBitmapTest2Applet.class" width=600 height=400>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/glutFontBitmapTest2Applet.java b/demos/MiscDemos/glutFontBitmapTest2Applet.java
new file mode 100644
index 0000000..0985385
--- /dev/null
+++ b/demos/MiscDemos/glutFontBitmapTest2Applet.java
@@ -0,0 +1,319 @@
+
+import gl4java.*;
+import gl4java.awt.*;
+import gl4java.utils.textures.*;
+import gl4java.utils.glut.*;
+import gl4java.utils.glut.fonts.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.applet.*;
+import java.net.*;
+
+public class glutFontBitmapTest2Applet extends Applet
+{
+ glutFontBitmapTest2 canvas = null;
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new glutFontBitmapTest2 (d.width, d.height);
+ add("Center", canvas);
+ }
+
+ public void start()
+ {
+ }
+
+
+ public void stop()
+ {
+ }
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("font test 2");
+
+ glutFontBitmapTest2Applet applet =
+ new glutFontBitmapTest2Applet();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+ class glutFontBitmapTest2 extends GLCanvas
+ implements MouseListener,MouseMotionListener
+ {
+ float []mPosObjTrans;
+ float []mPosObjRot;
+
+ Point mousePoint;
+ Point oldMousePoint;
+ boolean mouseMoveFlag;
+
+ protected GLUTFunc glut = null;
+
+ int texName[] = {0};
+
+ public glutFontBitmapTest2 (int w, int h)
+ {
+ super(w, h);
+ }
+
+ public void init()
+ {
+ glut = new GLUTFuncLightImplWithFonts(gl, glu);
+
+ // cameraMatrix init
+ mPosObjTrans=new float[16];
+ for(int i=0;i<16;i++)
+ mPosObjTrans[i]=0f;
+ mPosObjTrans[0]=mPosObjTrans[5]=mPosObjTrans[10]=mPosObjTrans[15]=1f;
+
+ mPosObjRot=new float[16];
+ for(int i=0;i<16;i++)
+ mPosObjRot[i]=0f;
+ mPosObjRot[0]=mPosObjRot[5]=mPosObjRot[10]=mPosObjRot[15]=1f;
+
+ TranlateObj(0f,0f,-10f);
+
+ gl.glShadeModel (GL_SMOOTH);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ gl.glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
+ gl.glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glj.gljCheckGL();
+
+ canvas.addMouseListener(this);
+ canvas.addMouseMotionListener(this);
+ mouseMoveFlag=false;
+
+ reshape(getSize().width, getSize().height);
+ }
+
+ public void display()
+ {
+ int i;
+
+ /* Standard GL4Java Init */
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ // just render it
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ SetCamera();
+
+ DrawScene();
+
+ /* For your animation dutys ;-) */
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void reshape(int w, int h)
+ {
+ gl.glMatrixMode (GL_MODELVIEW);
+ gl.glViewport (0, 0, w, h);
+ gl.glLoadIdentity();
+ SetCamera();
+ }
+
+
+ public void drawGrid(float x0, float y0,
+ float width, float height, float step)
+ {
+ float i,j;
+
+ /* draw grid */
+ gl.glBegin(GL_LINES);
+ for(i=x0;i<width;i+=step)
+ for(j=y0;j<height;j+=step)
+ {
+ if(i==0f && j==0f)
+ gl.glColor3f (1f,0f,0f);
+ else
+ gl.glColor3f (0.6f,0.5f,0.5f);
+ gl.glVertex2f(0f,j);
+ gl.glVertex2f(width,j);
+ gl.glVertex2f(i,height);
+ gl.glVertex2f(i,0f);
+ }
+ gl.glEnd();
+ }
+
+ void DrawScene()
+ {
+ gl.glMatrixMode (GL_MODELVIEW);
+ gl.glLoadIdentity ();
+
+ // kamera setzen
+ gl.glLoadMatrixf(mPosObjTrans);
+ gl.glMultMatrixf(mPosObjRot);
+
+ gl.glPushMatrix();
+ drawGrid(0f, 0f, 10f, 10f, 0.5f);
+ gl.glPopMatrix();
+
+ // obj zeichnen
+ gl.glPushMatrix();
+ gl.glColor3d(0.3,0,0);
+
+ gl.glBegin(GL_POLYGON);
+ gl.glVertex2d(0,-0.5);
+ gl.glVertex2d(0.5,0.5);
+ gl.glVertex2d(-0.5,0.5);
+ gl.glEnd();
+
+ gl.glColor3d(1,1,1);
+ gl.glRasterPos2d(-2.2,-1.2);
+ glut.glutBitmapString(glut.GLUT_BITMAP_8_BY_13,"8x13 Font");
+ gl.glRasterPos2d(-2.2,0.2);
+ glut.glutBitmapString(glut.GLUT_BITMAP_9_BY_15,"9x15 Font");
+ gl.glRasterPos2d(-2.2,1.2);
+ glut.glutBitmapString(glut.GLUT_BITMAP_HELVETICA_10,"Helvetica 10 Font");
+ gl.glRasterPos2d(-2.2,2.2);
+ glut.glutBitmapString(glut.GLUT_BITMAP_HELVETICA_12,"Helvetica 12 Font");
+ gl.glRasterPos2d(-2.2,3.2);
+ glut.glutBitmapString(glut.GLUT_BITMAP_HELVETICA_18,"Helvetica 18 Font");
+ gl.glRasterPos2d(-2.2,4.2);
+ glut.glutBitmapString(glut.GLUT_BITMAP_TIMES_ROMAN_10,"Times Roman 10 Font");
+ gl.glRasterPos2d(-2.2,5.2);
+ glut.glutBitmapString(glut.GLUT_BITMAP_TIMES_ROMAN_24,"Times Roman 24 Font");
+ gl.glPopMatrix();
+
+ }
+
+ void SetCamera()
+ {
+ Dimension dim=getSize();
+ float aspect=(float)dim.width/(float)dim.height;
+
+ gl.glMatrixMode (GL_PROJECTION);
+ gl.glLoadIdentity ();
+ glu.gluPerspective(60f,aspect,.01,100);
+ }
+
+ void RotateObj(float degree,
+ float axisX,
+ float axisY,
+ float axisZ)
+ {
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ gl.glMatrixMode (GL_MODELVIEW);
+ gl.glLoadIdentity ();
+
+ // kamera setzen
+ gl.glRotatef(degree,axisX,axisY,axisZ);
+ gl.glMultMatrixf(mPosObjRot);
+ gl.glGetFloatv(GL_MODELVIEW_MATRIX,mPosObjRot);
+
+ repaint();
+ }
+
+ void TranlateObj(float x,float y,float z)
+ {
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ gl.glMatrixMode (GL_MODELVIEW);
+ gl.glLoadIdentity ();
+
+ // kamera setzen
+ gl.glLoadMatrixf(mPosObjTrans);
+ gl.glTranslatef(x,y,z);
+ gl.glGetFloatv(GL_MODELVIEW_MATRIX,mPosObjTrans);
+
+ repaint();
+ }
+
+ // entfernt rotationen aus aktueller matrix
+ double Billboard()
+ {
+ float[] mat=new float[16];
+
+ gl.glGetFloatv(GL_MODELVIEW_MATRIX,mat);
+ mat[0] = mat[5] = mat[10] = 1;
+ mat[1] = mat[2] = mat[4] = mat[6] = mat[8] = mat[9] = 0;
+ gl.glLoadMatrixf(mat);
+
+ return mat[14];
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ if(mouseMoveFlag==false)
+ { // start drag
+ mouseMoveFlag=true;
+ mousePoint=evt.getPoint();
+ }
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ mouseMoveFlag=false;
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ }
+
+ public void mouseDragged(MouseEvent e)
+ {
+ if(mouseMoveFlag==true)
+ {
+ oldMousePoint=new Point(mousePoint);
+ mousePoint=e.getPoint();
+
+ Point dif=new Point(mousePoint.x-oldMousePoint.x,
+ mousePoint.y-oldMousePoint.y);
+
+ if(e.isShiftDown()==true)
+ TranlateObj((float)dif.x/6.0f,(float)dif.y/-6.0f,0f);
+ else if(e.isAltDown()==true)
+ {
+ TranlateObj(0f,0f,(float)dif.y/6.0f);
+ RotateObj(dif.x,0f,0f,1f);
+ }
+ else
+ {
+ RotateObj(dif.x,0f,1f,0f);
+ RotateObj(dif.y,1f,0f,0f);
+ }
+ }
+ }
+ public void mouseMoved(MouseEvent e)
+ {
+ }
+
+
+ }
+}
diff --git a/demos/MiscDemos/glutFontBitmapTest2Applet_plugin13.html b/demos/MiscDemos/glutFontBitmapTest2Applet_plugin13.html
new file mode 100644
index 0000000..2acee05
--- /dev/null
+++ b/demos/MiscDemos/glutFontBitmapTest2Applet_plugin13.html
@@ -0,0 +1,48 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<B>Try to drag the mouse (press-button and move) with/without the SHIFT key!</B>
+<br>
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 600 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "glutFontBitmapTest2Applet.class" WIDTH = 600 HEIGHT = 400 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "glutFontBitmapTest2Applet.class" WIDTH = 600 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "glutFontBitmapTest2Applet.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "glutFontBitmapTest2Applet.class" WIDTH = 600 HEIGHT = 400>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/glutFontBitmapTest_plugin13.html b/demos/MiscDemos/glutFontBitmapTest_plugin13.html
new file mode 100644
index 0000000..2c747d1
--- /dev/null
+++ b/demos/MiscDemos/glutFontBitmapTest_plugin13.html
@@ -0,0 +1,47 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<br>
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 600 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "glutFontBitmapTest.class" WIDTH = 600 HEIGHT = 400 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "glutFontBitmapTest.class" WIDTH = 600 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "glutFontBitmapTest.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "glutFontBitmapTest.class" WIDTH = 600 HEIGHT = 400>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/glutFontStrokeTest.html b/demos/MiscDemos/glutFontStrokeTest.html
new file mode 100644
index 0000000..0264ee6
--- /dev/null
+++ b/demos/MiscDemos/glutFontStrokeTest.html
@@ -0,0 +1,15 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<br>
+<hr>
+<applet code="glutFontStrokeTest.class" width=600 height=400>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/glutFontStrokeTest.java b/demos/MiscDemos/glutFontStrokeTest.java
new file mode 100644
index 0000000..27d95fc
--- /dev/null
+++ b/demos/MiscDemos/glutFontStrokeTest.java
@@ -0,0 +1,128 @@
+// Test program for GLUT Stroke font rendering functions
+// by Pontus Lidman
+// Copyright 2000 MathCore AB
+//
+// This file/package is licensed under the terms of the LPGL
+// with the permission of Pontus Lidman / Mathcore !
+//
+
+import gl4java.utils.glut.*;
+import gl4java.utils.glut.fonts.*;
+
+import gl4java.awt.*;
+import java.applet.*;
+import java.awt.*;
+import java.awt.Dimension;
+import gl4java.GLContext;
+import gl4java.GLFunc;
+
+public class glutFontStrokeTest extends Applet {
+
+ protected GLUTFunc glut = null;
+
+ protected class MyCanvas extends GLCanvas {
+
+ public MyCanvas(int w, int h) {
+ super(w,h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void init() {
+ glut = new GLUTFuncLightImplWithFonts(gl, glu);
+
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glOrtho(-1000,1000,-1000,1000,-50.0,50.0);
+ gl.glMatrixMode(GL_MODELVIEW);
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int w, int h) {
+ Dimension d=new Dimension(w,h);
+ if (!cvsIsInit()) return;
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("problem in use() method");
+ return;
+ }
+ setSize(d);
+ gl.glViewport(0,0,w,h);
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void display() {
+ int i;
+
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ gl.glPushMatrix();
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+ glu.gluLookAt(0, 0, 20, 0, 0, 0, 0, 1, 0);
+
+ gl.glColor3d(0.3,0,0);
+
+ gl.glBegin(GL_POLYGON);
+ gl.glVertex2d(0,-0.5);
+ gl.glVertex2d(0.5,0.5);
+ gl.glVertex2d(-0.5,0.5);
+ gl.glEnd();
+
+ gl.glColor3d(1,1,1);
+ gl.glPushMatrix();
+ gl.glTranslated(-900,-100,0);
+ glut.glutStrokeString(glut.GLUT_STROKE_ROMAN,"Roman Font");
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glTranslated(-900,100,0);
+ glut.glutStrokeString(glut.GLUT_STROKE_MONO_ROMAN,"Mono Roman Font");
+ gl.glPopMatrix();
+
+ gl.glPopMatrix();
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+ }
+
+ protected MyCanvas cvs;
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ cvs= new MyCanvas(d.width,d.height);
+ add("Center", cvs);
+ }
+
+ public void start()
+ {
+ }
+
+
+ public void stop()
+ {
+ }
+
+ public static void main(java.lang.String[] args) {
+ try {
+ Frame mainFrame = new Frame("Stroke Test");
+
+ glutFontStrokeTest applet=new glutFontStrokeTest();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ } catch (Throwable exception) {
+ System.err.println("Exception occurred in main()");
+ exception.printStackTrace(System.out);
+ }
+ }
+}
diff --git a/demos/MiscDemos/glutFontStrokeTest_plugin13.html b/demos/MiscDemos/glutFontStrokeTest_plugin13.html
new file mode 100644
index 0000000..6c74a92
--- /dev/null
+++ b/demos/MiscDemos/glutFontStrokeTest_plugin13.html
@@ -0,0 +1,47 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<br>
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 600 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "glutFontStrokeTest.class" WIDTH = 600 HEIGHT = 400 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "glutFontStrokeTest.class" WIDTH = 600 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "glutFontStrokeTest.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "glutFontStrokeTest.class" WIDTH = 600 HEIGHT = 400>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/index.html b/demos/MiscDemos/index.html
new file mode 100644
index 0000000..0c01565
--- /dev/null
+++ b/demos/MiscDemos/index.html
@@ -0,0 +1,78 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Ron Cemer & Sven Goethel">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Misc Demos</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<p>Here are the demos-II for <B> GL4Java >= 2.4.0.0: </B> <br>
+<br>
+<p><a href="index_plugin13.html">To use the Java2 Plug-In (Java2, JRE, Plug-In 1.3), click here !</a><br>
+<br>
+<B>Try to use the right-mouse-button for a pop-up menu within the demos !</B>
+<br>
+<p>&nbsp;<a href="TriangleRotate.html">TriangleRotate</a>
+: TriangleRotate at 500x300
+<p>&nbsp;<a href="DrawColoredPrimitives.html">DrawColoredPrimitives</a>
+: DrawColoredPrimitives at 500x300
+<p>&nbsp;<a href="DrawColoredPrimitives2.html">DrawColoredPrimitives2</a>
+: DrawColoredPrimitives2 at 500x300
+<p>&nbsp;<a href="nurbs.html">nurbs</a>
+: nurbs at 500x300
+<p>&nbsp;<a href="spectex.html">spectex</a>
+: spectex at 400x400
+<p>&nbsp;<a href="morph3d.html">morph3d</a>
+: morph3d at 400x400
+<p>&nbsp;<a href="gears.html">gears</a>
+: gears at 400x400
+<br>&nbsp;
+<br>
+<p>&nbsp;<a href="accanti.html">accanti</a>
+: accanti at 400x400 (GLUT DEMO)
+<p>&nbsp;<a href="alpha3D.html">alpha3D</a>
+: alpha3D at 400x400 (GLUT DEMO)
+<p>&nbsp;<a href="anti.html">anti</a>
+: anti at 400x400 (GLUT DEMO)
+<p>&nbsp;<a href="depthcue.html">depthcue</a>
+: depthcue at 400x400 (GLUT DEMO)
+<p>&nbsp;<a href="teaambient.html">teaambient</a>
+: teaambient at 400x400 (GLUT DEMO)
+<p>&nbsp;<a href="teapots.html">teapots</a>
+: teapots at 400x400 (GLUT DEMO)
+<br>&nbsp;
+<br>
+<p>&nbsp;<a href="pngTextureTestApplet.html">pngTextureTestApplet</a>
+: png texture test at 600x400 (GLUT DEMO)
+<br>&nbsp;
+<br>
+<br>&nbsp;<a href="stencil.html">Stencil Test</a>
+: test/shows geometry with 0 and 8 stencil-bits
+<p>&nbsp;<a href="glutFontStrokeTest.html">GLUT Font Stroke 1</a>
+: GLUT Font Stroke 1 (GLUT DEMO)
+<p>&nbsp;<a href="glutFontBitmapTest.html">GLUT Font Bitmap 1</a>
+: GLUT Font Bitmap 1 (GLUT DEMO)
+<p>&nbsp;<a href="glutFontBitmapTest2Applet.html">GLUT Font Bitmap 2</a>
+: GLUT Font Bitmap 2 (GLUT DEMO)
+<br>&nbsp;
+<br>
+<br>&nbsp;<a href="tess.html">Tessellator Demo 1</a>
+: test/shows 2 tesselated geometries
+<br>&nbsp;<a href="tesswind.html">Tessellator Demo 2</a>
+: test/shows tesselated geometries with different winding rules
+<br>&nbsp;<a href="tessdemo.html">Tessellator Demo 3</a>
+: test/shows self created tesselated geometries
+<br>&nbsp;
+<br>
+<br>&nbsp;<a href="SharedGLTest2.html">Shared GL-Context</a>
+: test/shows the usage of a shared GLContext for Display-Lists
+<br>&nbsp;
+<br>
+<br>&nbsp;<a href="select.html">Selection Demo 1</a>
+: test/shows selection
+<br>&nbsp;
+<br>
+<br>
+</body>
+</html>
diff --git a/demos/MiscDemos/index_plugin13.html b/demos/MiscDemos/index_plugin13.html
new file mode 100644
index 0000000..082aab8
--- /dev/null
+++ b/demos/MiscDemos/index_plugin13.html
@@ -0,0 +1,80 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Ron Cemer & Sven Goethel">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Misc Demos</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<p>Here are the demos-II for <B> GL4Java >= 2.4.0.0: & Java2 Plug-In 1.3</B>
+<hr>
+<br>&nbsp;
+<a href="../../Installer/java.policy">The Java2 (sdk, jre, plugin 1.3) policy file example to give GL4Java the necessary permissions (Click here) !</a>
+<br>&nbsp;
+<hr>
+<B>Try to use the right-mouse-button for a pop-up menu within the demos !</B>
+<br>
+<p>&nbsp;<a href="TriangleRotate_plugin13.html">TriangleRotate</a>
+: TriangleRotate at 500x300
+<p>&nbsp;<a href="DrawColoredPrimitives_plugin13.html">DrawColoredPrimitives</a>
+: DrawColoredPrimitives at 500x300
+<p>&nbsp;<a href="DrawColoredPrimitives2_plugin13.html">DrawColoredPrimitives2</a>
+: DrawColoredPrimitives2 at 500x300
+<p>&nbsp;<a href="nurbs_plugin13.html">nurbs</a>
+: nurbs at 500x300
+<p>&nbsp;<a href="spectex_plugin13.html">spectex</a>
+: spectex at 400x400
+<p>&nbsp;<a href="morph3d_plugin13.html">morph3d</a>
+: morph3d at 400x400
+<p>&nbsp;<a href="gears_plugin13.html">gears</a>
+: gears at 400x400
+<br>&nbsp;
+<br>
+<p>&nbsp;<a href="accanti_plugin13.html">accanti</a>
+: accanti at 400x400 (GLUT DEMO)
+<p>&nbsp;<a href="alpha3D_plugin13.html">alpha3D</a>
+: alpha3D at 400x400 (GLUT DEMO)
+<p>&nbsp;<a href="anti_plugin13.html">anti</a>
+: anti at 400x400 (GLUT DEMO)
+<p>&nbsp;<a href="depthcue_plugin13.html">depthcue</a>
+: depthcue at 400x400 (GLUT DEMO)
+<p>&nbsp;<a href="teaambient_plugin13.html">teaambient</a>
+: teaambient at 400x400 (GLUT DEMO)
+<p>&nbsp;<a href="teapots_plugin13.html">teapots</a>
+: teapots at 400x400 (GLUT DEMO)
+<br>&nbsp;
+<br>
+<p>&nbsp;<a href="pngTextureTestApplet_plugin13.html">pngTextureTestApplet</a>
+: png texture test at 600x400 (GLUT DEMO)
+<br>&nbsp;
+<br>
+<br>&nbsp;<a href="stencil_plugin13.html">Stencil Test</a>
+: test/shows geometry with 0 and 8 stencil-bits
+<p>&nbsp;<a href="glutFontStrokeTest_plugin13.html">GLUT Font Stroke 1</a>
+: GLUT Font Stroke 1 (GLUT DEMO)
+<p>&nbsp;<a href="glutFontBitmapTest_plugin13.html">GLUT Font Bitmap 1</a>
+: GLUT Font Bitmap 1 (GLUT DEMO)
+<p>&nbsp;<a href="glutFontBitmapTest2Applet_plugin13.html">GLUT Font Bitmap 2</a>
+: GLUT Font Bitmap 2 (GLUT DEMO)
+<br>&nbsp;
+<br>
+<br>&nbsp;<a href="tess_plugin13.html">Tessellator Demo 1</a>
+: test/shows 2 tesselated geometries
+<br>&nbsp;<a href="tesswind_plugin13.html">Tessellator Demo 2</a>
+: test/shows tesselated geometries with different winding rules
+<br>&nbsp;<a href="tessdemo_plugin13.html">Tessellator Demo 3</a>
+: test/shows self created tesselated geometries
+<br>&nbsp;
+<br>
+<br>&nbsp;<a href="SharedGLTest2_plugin13.html">Shared GL-Context</a>
+: test/shows the usage of a shared GLContext for Display-Lists
+<br>&nbsp;
+<br>
+<br>&nbsp;<a href="select_plugin13.html">Selection Demo 1</a>
+: test/shows selection
+<br>&nbsp;
+<br>
+<br>
+</body>
+</html>
diff --git a/demos/MiscDemos/morph3d.html b/demos/MiscDemos/morph3d.html
new file mode 100644
index 0000000..b99094a
--- /dev/null
+++ b/demos/MiscDemos/morph3d.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>OpenGL Demo - ported by Sven Goethel</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Sven Goethel
+<br>
+<applet code="morph3d.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/morph3d.java b/demos/MiscDemos/morph3d.java
new file mode 100755
index 0000000..7c8a8fe
--- /dev/null
+++ b/demos/MiscDemos/morph3d.java
@@ -0,0 +1,1060 @@
+/*-
+ * morph3d.c - Shows 3D morphing objects
+ *
+ * Converted to GLUT by brianp on 1/1/98
+ *
+ * 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 (float)Math.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
+ *
+ * and
+ *
+ * Marcelo F. Vianna (Feb-13-1997)
+ */
+
+/*
+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.
+- 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 (float)Math.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 u(float)Math.sing 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*(float)Math.sqrt(2))/(float)Math.sqrt(3)
+ CUBE : 1/2
+ OCTAHEDRON : 1/(float)Math.sqrt(6)
+ DODECAHEDRON : T^2 * (float)Math.sqrt((T+2)/5) / 2 -> where T=((float)Math.sqrt(5)+1)/2
+ ICOSAHEDRON : (3*(float)Math.sqrt(3)+(float)Math.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 cros(float)Math.sing 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: (float)Math.sqrt(2) for the base
+and (float)Math.sqrt(3)/2 for the other two other edges. So the angle we want is:
+ +-----------------------------------------------------------+
+ | 2*ARCSIN((float)Math.sqrt(2)/(float)Math.sqrt(3)) = 109.47122063449069174f 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:
+(float)Math.sqrt(2)/2 for the base and 1/2 for the other two edges. So the angle we
+want is:
+ +-----------------------------------------------------------+
+ | 2*ARCSIN(((float)Math.sqrt(2)/2)/1) = 90.000000000000000000f 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((float)Math.sqrt(2)/(float)Math.sqrt(3)) = 109.47122063449069174f 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.6881909602355867905f
+ (VRp is the pentagon's vertex radio).
+ Face Radius For Dodecahedron
+ FRd = T^2 * (float)Math.sqrt((T+2)/5) / 2 = 1.1135163644116068404f
+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.434948822922009981f 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 = (float)Math.sin(60)/3 = (float)Math.sqrt(3)/6 = 0.2886751345948128655f
+ Face Radius For Icosahedron
+ FRi= (3*(float)Math.sqrt(3)+(float)Math.sqrt(15))/12 = 0.7557613140761707538f
+So the angle is:
+ +-----------------------------------------------------------+
+ | 2*ARCTAN(ERt/FRi) = 41.810314895778596167f degrees |
+ +-----------------------------------------------------------+
+
+*/
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+import gl4java.utils.textures.*;
+
+public class morph3d extends SimpleGLAnimApplet1
+{
+ static final float Scale =0.3f;
+ static final float tetraangle = 109.47122063449069174f;
+ static final float cubeangle = 90.000000000000000000f;
+ static final float octaangle = 109.47122063449069174f;
+ static final float dodecaangle = 63.434948822922009981f;
+ static final float icoangle = 41.810314895778596167f;
+
+ static final float Pi = 3.1415926535897932385f;
+ static final float SQRT2 = 1.4142135623730951455f;
+ static final float SQRT3 = 1.7320508075688771932f;
+ static final float SQRT5 = 2.2360679774997898051f;
+ static final float SQRT6 = 2.4494897427831778813f;
+ static final float SQRT15 = 3.8729833462074170214f;
+ static final float cossec36_2 = 0.8506508083520399322f;
+ static final float cos72 = 0.3090169943749474241f;
+ static final float sin72 = 0.9510565162951535721f;
+ static final float cos36 = 0.8090169943749474241f;
+ static final float sin36 = 0.5877852522924731292f;
+
+ static final float TAU = (SQRT5+1f)/2.0f;
+
+
+ /* Initialize the applet */
+
+ boolean isAnApplet = true;
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new morph3dCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("morph3d");
+
+ GLContext.gljNativeDebug = true;
+ GLContext.gljClassDebug = true;
+
+ morph3d applet = new morph3d();
+
+ applet.isAnApplet = false;
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+ /* Local GLCanvas extension class */
+
+
+ private class morph3dCanvas extends GLAnimCanvas
+ implements MouseListener, ActionListener
+ {
+ private PopupMenu menu = null;
+ private boolean menu_showing = false;
+ private boolean save_suspended = false;
+ private final String MENUE_0 = "Tetrahedron";
+ private final String MENUE_1 = "Hexahedron (Cube)";
+ private final String MENUE_2 = "Octahedron";
+ private final String MENUE_3 = "Dodecahedron";
+ private final String MENUE_4 = "Icosahedron";
+ private final String MENUE_5 = "Toggle colored faces";
+ private final String MENUE_6 = "Toggle smooth/flat shading";
+ private final String MENU_SNAPSHOT = "Snapshot";
+
+ TGATextureGrabber textgrab = null;
+
+ boolean doSnapshot=false;
+
+ /* Increasing this values produces better image quality,
+ the price is speed. */
+ /* Very low values produces erroneous/incorrect plotting */
+ int tetradivisions = 23;
+ int cubedivisions = 20;
+ int octadivisions = 21;
+ int dodecadivisions = 10;
+ int icodivisions = 15;
+
+ boolean mono=false;
+ boolean smooth=true;
+ int WindH, WindW;
+ float step=0;
+ float seno;
+ int object;
+ int edgedivisions;
+ float Magnitude;
+ // float *MaterialColor[20];
+ float MaterialColor[][];
+
+ float front_shininess[] = {60.0f};
+ float front_specular[] = { 0.7f, 0.7f, 0.7f, 1.0f };
+ float ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
+ float diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float position0[] = { 1.0f, 1.0f, 1.0f, 0.0f };
+ float position1[] = {-1.0f,-1.0f, 1.0f, 0.0f };
+ float lmodel_ambient[] = { 0.5f, 0.5f, 0.5f, 1.0f };
+ float lmodel_twoside[] = {1.0f};
+
+ float MaterialRed[] = { 0.7f, 0.0f, 0.0f, 1.0f };
+ float MaterialGreen[] = { 0.1f, 0.5f, 0.2f, 1.0f };
+ float MaterialBlue[] = { 0.0f, 0.0f, 0.7f, 1.0f };
+ float MaterialCyan[] = { 0.2f, 0.5f, 0.7f, 1.0f };
+ float MaterialYellow[] = { 0.7f, 0.7f, 0.0f, 1.0f };
+ float MaterialMagenta[] = { 0.6f, 0.2f, 0.5f, 1.0f };
+ float MaterialWhite[] = { 0.7f, 0.7f, 0.7f, 1.0f };
+ float MaterialGray[] = { 0.2f, 0.2f, 0.2f, 1.0f };
+
+ public morph3dCanvas(int w, int h)
+ {
+ super(w, h);
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ rgba = true;
+ }
+
+
+ final float VectMulX(float Y1,float Z1,float Y2,float Z2)
+ { return (Y1)*(Z2)-(Z1)*(Y2);
+ }
+
+ final float VectMulY(float X1,float Z1,float X2,float Z2)
+ { return (Z1)*(X2)-(X1)*(Z2);
+ }
+
+ final float VectMulZ(float X1,float Y1,float X2,float Y2)
+ { return (X1)*(Y2)-(Y1)*(X2);
+ }
+
+ final float sqr(float A)
+ { return (A)*(A); }
+
+ final void TRIANGLE(float Edge, float Amp, int Divisions, float Z)
+ {
+ float Xf,Yf,Xa,Yb,Xf2,Yf2;
+ float Factor,Factor1,Factor2;
+ float VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ;
+ float Ax,Ay,Bx;
+ int Ri,Ti;
+ float Vr=(Edge)*SQRT3/3;
+ float AmpVr2=(Amp)/sqr(Vr);
+ float Zf=(Edge)*(Z);
+
+ Ax=(Edge)*(+0.5f/(Divisions)); Ay=(Edge)*(-SQRT3/(2*Divisions));
+ Bx=(Edge)*(-0.5f/(Divisions));
+ for (Ri=1; Ri<=(Divisions); Ri++) {
+ gl.glBegin(GL_TRIANGLE_STRIP);
+ for (Ti=0; Ti<Ri; Ti++) {
+ Xf=(float)(Ri-Ti)*Ax + (float)Ti*Bx;
+ Yf=Vr+(float)(Ri-Ti)*Ay + (float)Ti*Ay;
+ Xa=Xf+0.001f; Yb=Yf+0.001f;
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*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;
+ gl.glNormal3f(VectMulX(NeiAY, NeiAZ, NeiBY, NeiBZ),
+ VectMulY(NeiAX, NeiAZ, NeiBX, NeiBZ),
+ VectMulZ(NeiAX, NeiAY, NeiBX, NeiBY));
+ gl.glVertex3f(VertX, VertY, VertZ);
+
+ Xf=(float)(Ri-Ti-1)*Ax + (float)Ti*Bx;
+ Yf=Vr+(float)(Ri-Ti-1)*Ay + (float)Ti*Ay;
+ Xa=Xf+0.001f; Yb=Yf+0.001f;
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*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;
+ gl.glNormal3f(VectMulX(NeiAY, NeiAZ, NeiBY, NeiBZ),
+ VectMulY(NeiAX, NeiAZ, NeiBX, NeiBZ),
+ VectMulZ(NeiAX, NeiAY, NeiBX, NeiBY));
+ gl.glVertex3f(VertX, VertY, VertZ);
+
+ }
+ Xf=(float)Ri*Bx;
+ Yf=Vr+(float)Ri*Ay;
+ Xa=Xf+0.001f; Yb=Yf+0.001f;
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*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;
+ gl.glNormal3f(VectMulX(NeiAY, NeiAZ, NeiBY, NeiBZ),
+ VectMulY(NeiAX, NeiAZ, NeiBX, NeiBZ),
+ VectMulZ(NeiAX, NeiAY, NeiBX, NeiBY));
+ gl.glVertex3f(VertX, VertY, VertZ);
+ gl.glEnd();
+ }
+ }
+
+ final void SQUARE(float Edge, float Amp, int Divisions, float Z)
+ {
+ int Xi,Yi;
+ float Xf,Yf,Y,Xf2,Yf2,Y2,Xa,Yb;
+ float Factor,Factor1,Factor2;
+ float VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ;
+ float Zf=(Edge)*(Z);
+ float AmpVr2=(Amp)/sqr((Edge)*SQRT2/2);
+
+ for (Yi=0; Yi<(Divisions); Yi++) {
+ Yf=-((Edge)/2.0f) + ((float)Yi)/(Divisions)*(Edge);
+ Yf2=sqr(Yf);
+ Y=Yf+1.0f/(Divisions)*(Edge);
+ Y2=sqr(Y);
+ gl.glBegin(GL_QUAD_STRIP);
+ for (Xi=0; Xi<=(Divisions); Xi++) {
+ Xf=-((Edge)/2.0f) + ((float)Xi)/(Divisions)*(Edge);
+ Xf2=sqr(Xf);
+
+ Xa=Xf+0.001f; Yb=Y+0.001f;
+ 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;
+ gl.glNormal3f(VectMulX(NeiAY, NeiAZ, NeiBY, NeiBZ),
+ VectMulY(NeiAX, NeiAZ, NeiBX, NeiBZ),
+ VectMulZ(NeiAX, NeiAY, NeiBX, NeiBY));
+ gl.glVertex3f(VertX, VertY, VertZ);
+
+ Xa=Xf+0.001f; Yb=Yf+0.001f;
+ 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;
+ gl.glNormal3f(VectMulX(NeiAY, NeiAZ, NeiBY, NeiBZ),
+ VectMulY(NeiAX, NeiAZ, NeiBX, NeiBZ),
+ VectMulZ(NeiAX, NeiAY, NeiBX, NeiBY));
+ gl.glVertex3f(VertX, VertY, VertZ);
+ }
+ gl.glEnd();
+ }
+ }
+
+ final void PENTAGON(float Edge, float Amp, int Divisions, float Z)
+ {
+ int Ri,Ti,Fi;
+ float Xf,Yf,Xa,Yb,Xf2,Yf2;
+ float x[]=new float[6],y[]=new float[6];
+ float Factor,Factor1,Factor2;
+ float VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ;
+ float Zf=(Edge)*(Z);
+ float AmpVr2=(Amp)/sqr((Edge)*cossec36_2);
+
+ for(Fi=0;Fi<6;Fi++) {
+ x[Fi]=-(float)Math.cos( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge);
+ y[Fi]=(float)Math.sin( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge);
+ }
+
+ for (Ri=1; Ri<=(Divisions); Ri++) {
+ for (Fi=0; Fi<5; Fi++) {
+ gl.glBegin(GL_TRIANGLE_STRIP);
+ for (Ti=0; Ti<Ri; Ti++) {
+ Xf=(float)(Ri-Ti)*x[Fi] + (float)Ti*x[Fi+1];
+ Yf=(float)(Ri-Ti)*y[Fi] + (float)Ti*y[Fi+1];
+ Xa=Xf+0.001f; Yb=Yf+0.001f;
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*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;
+ gl.glNormal3f(VectMulX(NeiAY, NeiAZ, NeiBY, NeiBZ),
+ VectMulY(NeiAX, NeiAZ, NeiBX, NeiBZ),
+ VectMulZ(NeiAX, NeiAY, NeiBX, NeiBY));
+ gl.glVertex3f(VertX, VertY, VertZ);
+
+ Xf=(float)(Ri-Ti-1)*x[Fi] + (float)Ti*x[Fi+1];
+ Yf=(float)(Ri-Ti-1)*y[Fi] + (float)Ti*y[Fi+1];
+ Xa=Xf+0.001f; Yb=Yf+0.001f;
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*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;
+ gl.glNormal3f(VectMulX(NeiAY, NeiAZ, NeiBY, NeiBZ),
+ VectMulY(NeiAX, NeiAZ, NeiBX, NeiBZ),
+ VectMulZ(NeiAX, NeiAY, NeiBX, NeiBY));
+ gl.glVertex3f(VertX, VertY, VertZ);
+
+ }
+ Xf=(float)Ri*x[Fi+1];
+ Yf=(float)Ri*y[Fi+1];
+ Xa=Xf+0.001f; Yb=Yf+0.001f;
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*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;
+ gl.glNormal3f(VectMulX(NeiAY, NeiAZ, NeiBY, NeiBZ),
+ VectMulY(NeiAX, NeiAZ, NeiBX, NeiBZ),
+ VectMulZ(NeiAX, NeiAY, NeiBX, NeiBY));
+ gl.glVertex3f(VertX, VertY, VertZ);
+ gl.glEnd();
+ }
+ }
+ }
+
+ void draw_tetra( )
+ {
+ int list;
+
+ list = gl.glGenLists( 1 );
+ gl.glNewList( list, GL_COMPILE );
+ TRIANGLE(2,seno,edgedivisions,0.5f/SQRT6);
+ gl.glEndList();
+
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+ gl.glCallList(list);
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,0,1);
+ gl.glRotatef(-tetraangle,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-180+tetraangle,0.5f,SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-180+tetraangle,0.5f,-SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+ gl.glCallList(list);
+
+ gl.glDeleteLists(list,1);
+ }
+
+ void draw_cube()
+ {
+ int list;
+
+ list = gl.glGenLists( 1 );
+ gl.glNewList( list, GL_COMPILE );
+ SQUARE(2.0f, seno, edgedivisions, 0.5f);
+ gl.glEndList();
+
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+ gl.glCallList(list);
+ gl.glRotatef(cubeangle,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+ gl.glCallList(list);
+ gl.glRotatef(cubeangle,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+ gl.glCallList(list);
+ gl.glRotatef(cubeangle,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+ gl.glCallList(list);
+ gl.glRotatef(cubeangle,0,1,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+ gl.glCallList(list);
+ gl.glRotatef(2*cubeangle,0,1,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+ gl.glCallList(list);
+
+ gl.glDeleteLists(list,1);
+ }
+
+ void draw_octa()
+ {
+ int list;
+
+ list = gl.glGenLists( 1 );
+ gl.glNewList( list, GL_COMPILE );
+ TRIANGLE(2,seno,edgedivisions,1/SQRT6);
+ gl.glEndList();
+
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+ gl.glCallList(list);
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,0,1);
+ gl.glRotatef(-180+octaangle,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-octaangle,0.5f,SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-octaangle,0.5f,-SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glRotatef(180,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+ gl.glCallList(list);
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,0,1);
+ gl.glRotatef(-180+octaangle,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-octaangle,0.5f,SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[6]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-octaangle,0.5f,-SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[7]);
+ gl.glCallList(list);
+
+ gl.glDeleteLists(list,1);
+ }
+
+ void draw_dodeca()
+ {
+ int list;
+
+
+ list = gl.glGenLists( 1 );
+ gl.glNewList( list, GL_COMPILE );
+ PENTAGON(1,seno,edgedivisions,sqr(TAU) * (float)Math.sqrt((TAU+2)/5) / 2);
+ gl.glEndList();
+
+ gl.glPushMatrix();
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+ gl.glCallList(list);
+ gl.glRotatef(180,0,0,1);
+ gl.glPushMatrix();
+ gl.glRotatef(-dodecaangle,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(-dodecaangle,cos72,sin72,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(-dodecaangle,cos72,-sin72,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(dodecaangle,cos36,-sin36,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glRotatef(dodecaangle,cos36,sin36,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glRotatef(180,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[6]);
+ gl.glCallList(list);
+ gl.glRotatef(180,0,0,1);
+ gl.glPushMatrix();
+ gl.glRotatef(-dodecaangle,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[7]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(-dodecaangle,cos72,sin72,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[8]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(-dodecaangle,cos72,-sin72,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[9]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(dodecaangle,cos36,-sin36,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[10]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glRotatef(dodecaangle,cos36,sin36,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[11]);
+ gl.glCallList(list);
+
+ gl.glDeleteLists(list,1);
+ }
+
+ void draw_ico()
+ {
+ int list;
+
+ list = gl.glGenLists( 1 );
+ gl.glNewList( list, GL_COMPILE );
+ TRIANGLE(1.5f,seno,edgedivisions,(3*SQRT3+SQRT15)/12);
+ gl.glEndList();
+
+ gl.glPushMatrix();
+
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+ gl.glCallList(list);
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,0,1);
+ gl.glRotatef(-icoangle,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+ gl.glCallList(list);
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-180+icoangle,0.5f,SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-180+icoangle,0.5f,-SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-180+icoangle,0.5f,SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+ gl.glCallList(list);
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-180+icoangle,0.5f,SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glRotatef(180,0,0,1);
+ gl.glRotatef(-icoangle,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[6]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-180+icoangle,0.5f,-SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[7]);
+ gl.glCallList(list);
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-180+icoangle,0.5f,-SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[8]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glRotatef(180,0,0,1);
+ gl.glRotatef(-icoangle,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[9]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glRotatef(180,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[10]);
+ gl.glCallList(list);
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,0,1);
+ gl.glRotatef(-icoangle,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[11]);
+ gl.glCallList(list);
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-180+icoangle,0.5f,SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[12]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-180+icoangle,0.5f,-SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[13]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-180+icoangle,0.5f,SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[14]);
+ gl.glCallList(list);
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-180+icoangle,0.5f,SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[15]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glRotatef(180,0,0,1);
+ gl.glRotatef(-icoangle,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[16]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-180+icoangle,0.5f,-SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[17]);
+ gl.glCallList(list);
+ gl.glPushMatrix();
+ gl.glRotatef(180,0,1,0);
+ gl.glRotatef(-180+icoangle,0.5f,-SQRT3/2,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[18]);
+ gl.glCallList(list);
+ gl.glPopMatrix();
+ gl.glRotatef(180,0,0,1);
+ gl.glRotatef(-icoangle,1,0,0);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[19]);
+ gl.glCallList(list);
+
+ gl.glDeleteLists(list,1);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ gl.glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ gl.glPushMatrix();
+
+ gl.glTranslatef( 0.0f, 0.0f, -10.0f );
+ gl.glScalef( Scale*WindH/WindW, Scale, Scale );
+ gl.glTranslatef(2.5f*WindW/WindH*(float)Math.sin(step*1.11f),2.5f*(float)Math.cos(step*1.25f*1.11f),0);
+ gl.glRotatef(step*100,1,0,0);
+ gl.glRotatef(step*95,0,1,0);
+ gl.glRotatef(step*90,0,0,1);
+
+ seno=((float)Math.sin(step)+1.0f/3.0f)*(4.0f/5.0f)*Magnitude;
+
+ switch(object) {
+ case 1:
+ draw_tetra();
+ break;
+ case 2:
+ draw_cube();
+ break;
+ case 3:
+ draw_octa();
+ break;
+ case 4:
+ draw_dodeca();
+ break;
+ case 5:
+ draw_ico();
+ break;
+ }
+
+ gl.glPopMatrix();
+
+
+ if(!isAnApplet && doSnapshot)
+ {
+ doSnapshot=false;
+ textgrab.grabPixels(GL_BACK,
+ 0, 0, cvsGetWidth(), cvsGetHeight());
+ textgrab.write2File("morph3d.tga");
+ }
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ step+=0.05f;
+ }
+
+ public void reshape(int width, int height)
+ {
+ WindW=width; WindH=height;
+ gl.glViewport(0, 0, WindW, WindH);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glFrustum( -1.0f, 1.0f, -1.0f, 1.0f, 5.0f, 15.0f );
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+ final void pinit()
+ {
+ switch(object) {
+ case 1:
+ MaterialColor[0]=MaterialRed;
+ MaterialColor[1]=MaterialGreen;
+ MaterialColor[2]=MaterialBlue;
+ MaterialColor[3]=MaterialWhite;
+ edgedivisions=tetradivisions;
+ Magnitude=2.5f;
+ break;
+ case 2:
+ MaterialColor[0]=MaterialRed;
+ MaterialColor[1]=MaterialGreen;
+ MaterialColor[2]=MaterialCyan;
+ MaterialColor[3]=MaterialMagenta;
+ MaterialColor[4]=MaterialYellow;
+ MaterialColor[5]=MaterialBlue;
+ edgedivisions=cubedivisions;
+ Magnitude=2.0f;
+ break;
+ case 3:
+ 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.5f;
+ break;
+ case 4:
+ 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.0f;
+ break;
+ case 5:
+ 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.5f;
+ break;
+ }
+ if (mono) {
+ int loop;
+ for (loop=0; loop<20; loop++) MaterialColor[loop]=MaterialGray;
+ }
+ if (smooth) {
+ gl.glShadeModel( GL_SMOOTH );
+ } else {
+ gl.glShadeModel( GL_FLAT );
+ }
+
+ }
+
+ public void init()
+ {
+ textgrab = new TGATextureGrabber(gl);
+ reshape(getSize().width, getSize().height);
+
+ object=1;
+
+ MaterialColor = new float[20][];
+
+ gl.glClearDepth(1.0f);
+ gl.glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
+ gl.glColor3f( 1.0f, 1.0f, 1.0f );
+
+ gl.glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ glj.gljSwap();
+
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ gl.glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ gl.glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ gl.glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ gl.glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_LIGHT1);
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glEnable(GL_NORMALIZE);
+
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+ gl.glHint(GL_FOG_HINT, GL_FASTEST);
+ gl.glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
+ gl.glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST);
+
+ pinit();
+
+ menu = new PopupMenu("Options");
+ menu.add(MENUE_0);
+ menu.add(MENUE_1);
+ menu.add(MENUE_2);
+ menu.add(MENUE_3);
+ menu.add(MENUE_4);
+ menu.add(MENUE_5);
+ menu.add(MENUE_6);
+ if(!isAnApplet)
+ menu.add(MENU_SNAPSHOT);
+ menu.addActionListener(this);
+ add(menu);
+
+ addMouseListener(this);
+
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered(MouseEvent evt)
+ {
+ }
+
+ public void mouseExited(MouseEvent evt)
+ {
+ }
+
+ public void mousePressed(MouseEvent evt)
+ {
+ if (!menu_showing)
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ menu_showing = true;
+ save_suspended = isSuspended();
+ if (!save_suspended)
+ {
+ setSuspended(true);
+ repaint(100);
+ try
+ {
+ Thread.currentThread().sleep(200);
+ }
+ catch (Exception e)
+ { }
+ }
+ menu.show(this,evt.getX(),evt.getY());
+ }
+ else
+ {
+ // Must be left button.
+ if (isSuspended()) repaint();
+ }
+ }
+ else
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+
+ public void mouseReleased(MouseEvent evt)
+ {
+ }
+
+ public void mouseClicked(MouseEvent evt)
+ {
+ }
+
+ // Method required for the implementation of ActionListener
+ public void actionPerformed(ActionEvent evt)
+ {
+ String c = evt.getActionCommand();
+ if (c.equals(MENUE_0))
+ {
+ object=1;
+ }
+ else if (c.equals(MENUE_1))
+ {
+ object=2;
+ }
+ else if (c.equals(MENUE_2))
+ {
+ object=3;
+ }
+ else if (c.equals(MENUE_3))
+ {
+ object=4;
+ }
+ else if (c.equals(MENUE_4))
+ {
+ object=5;
+ }
+ else if (c.equals(MENUE_5))
+ {
+ mono=!mono;
+ }
+ else if (c.equals(MENUE_6))
+ {
+ smooth=!smooth;
+ }
+ else if (c.equals(MENU_SNAPSHOT))
+ {
+ doSnapshot=true;
+ }
+ if (menu_showing)
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ pinit();
+ }
+ }
+}
+
diff --git a/demos/MiscDemos/morph3d_plugin13.html b/demos/MiscDemos/morph3d_plugin13.html
new file mode 100644
index 0000000..1472b89
--- /dev/null
+++ b/demos/MiscDemos/morph3d_plugin13.html
@@ -0,0 +1,48 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>OpenGL Demo - ported by Sven Goethel</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Sven Goethel
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "morph3d.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "morph3d.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "morph3d.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "morph3d.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/nurbs.html b/demos/MiscDemos/nurbs.html
new file mode 100644
index 0000000..6f0f2fe
--- /dev/null
+++ b/demos/MiscDemos/nurbs.html
@@ -0,0 +1,14 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<applet code="nurbs.class" width=500 height=300>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/nurbs.java b/demos/MiscDemos/nurbs.java
new file mode 100644
index 0000000..52ecd99
--- /dev/null
+++ b/demos/MiscDemos/nurbs.java
@@ -0,0 +1,314 @@
+/**
+ * @(#) DrawColoredPrimitives2.java
+ * @(#) author: Joe Zimmerman (converted to Java by Sven Goethel)
+ */
+
+/* This program is free software under the license of LGPL */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class nurbs extends SimpleGLAnimApplet1
+{
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new gldemo(d.width, d.height);
+ add("Center", canvas);
+ }
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("nurbs");
+
+ nurbs applet = new nurbs();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+
+ private class gldemo extends GLAnimCanvas
+ implements MouseListener, ActionListener
+ {
+ private PopupMenu menu = null;
+ private boolean menu_showing = false;
+ private boolean save_suspended = false;
+ private final String VIEW_ROTATION = "Toggle Rotation";
+ private final String VIEW_FRONT = "View Front";
+ private final String VIEW_TOP = "View Top";
+ private final String VIEW_BOTTOM = "View Bottom";
+
+ final float M_PI = 3.14159265f;
+ final float M_PI_2 = 1.57079632f;
+ float rotate=0;
+ float rotationStep = 1;
+ boolean rotationOn = true;
+ int view = 0; /* 0 = front, 1 = top, 2 = bottom */
+
+ static final int S_NUMPOINTS = 13;
+ static final int S_ORDER = 3;
+ static final int S_NUMKNOTS = (S_NUMPOINTS + S_ORDER);
+ static final int T_NUMPOINTS = 3;
+ static final int T_ORDER = 3;
+ static final int T_NUMKNOTS = (T_NUMPOINTS + T_ORDER);
+ static final float SQRT2 = 1.41421356237309504880f;
+
+ /* initialized local data */
+
+ float sknots[/*S_NUMKNOTS*/] =
+ {-1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 2.0f, 3.0f, 4.0f,
+ 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 9.0f, 9.0f};
+ float tknots[/*T_NUMKNOTS*/] = {1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f};
+
+ // float ctlpoints[/*S_NUMPOINTS*/][/*T_NUMPOINTS*/][/*4*/] = {
+ float ctlpoints[] = {
+ 4f,2f,2f,1f, 4f,1.6f,2.5f,1f , 4f,2f,3.0f,1f ,
+ 5f,4f,2f,1f , 5f,4f,2.5f,1f , 5f,4f,3.0f,1f ,
+ 6f,5f,2f,1f , 6f,5f,2.5f,1f , 6f,5f,3.0f,1f ,
+ SQRT2*6f,SQRT2*6f,SQRT2*2f,SQRT2 ,
+ SQRT2*6f,SQRT2*6f,SQRT2*2.5f,SQRT2 ,
+ SQRT2*6f,SQRT2*6f,SQRT2*3.0f,SQRT2 ,
+ 5.2f,6.7f,2f,1f , 5.2f,6.7f,2.5f,1f , 5.2f,6.7f,3.0f,1f ,
+ SQRT2*4f,SQRT2*6f,SQRT2*2f,SQRT2 ,
+ SQRT2*4f,SQRT2*6f,SQRT2*2.5f,SQRT2 ,
+ SQRT2*4f,SQRT2*6f,SQRT2*3.0f,SQRT2 ,
+ 4f,5.2f,2f,1f , 4f,4.6f,2.5f,1f , 4f,5.2f,3.0f,1f ,
+ SQRT2*4f,SQRT2*6f,SQRT2*2f,SQRT2 ,
+ SQRT2*4f,SQRT2*6f,SQRT2*2.5f,SQRT2 ,
+ SQRT2*4f,SQRT2*6f,SQRT2*3.0f,SQRT2 ,
+ 2.8f,6.7f,2f,1f , 2.8f,6.7f,2.5f,1f , 2.8f,6.7f,3.0f,1f ,
+ SQRT2*2f,SQRT2*6f,SQRT2*2f,SQRT2 ,
+ SQRT2*2f,SQRT2*6f,SQRT2*2.5f,SQRT2 ,
+ SQRT2*2f,SQRT2*6f,SQRT2*3.0f,SQRT2 ,
+ 2f,5f,2f,1f , 2f,5f,2.5f,1f , 2f,5f,3.0f,1f ,
+ 3f,4f,2f,1f , 3f,4f,2.5f,1f , 3f,4f,3.0f,1f ,
+ 4f,2f,2f,1f , 4f,1.6f,2.5f,1f , 4f,2f,3.0f,1f
+ };
+
+
+ int theNurb;
+
+ public gldemo(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ reshape(getSize().width, getSize().height);
+
+ float mat_ambient[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float mat_diffuse[] = { 1.0f, 0.2f, 1.0f, 1.0f };
+ float mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float mat_shininess[] = { 50.0f };
+
+ float light0_position[] = { 1.0f, 0.1f, 1.0f, 0.0f };
+ float light1_position[] = { -1.0f, 0.1f, 1.0f, 0.0f };
+
+ float lmodel_ambient[] = { 0.3f, 0.3f, 0.3f, 1.0f };
+
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
+ gl.glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_LIGHT1);
+ gl.glDepthFunc(GL_LESS);
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glEnable(GL_AUTO_NORMAL);
+
+ theNurb = glu.gluNewNurbsRenderer();
+
+ glu.gluNurbsProperty(theNurb, GLU_SAMPLING_TOLERANCE, 25.0f);
+ glu.gluNurbsProperty(theNurb, GLU_DISPLAY_MODE, GLU_FILL);
+ glj.gljCheckGL();
+
+ menu = new PopupMenu("Options");
+ menu.add(VIEW_ROTATION);
+ menu.add(VIEW_FRONT);
+ menu.add(VIEW_TOP);
+ menu.add(VIEW_BOTTOM);
+ menu.addActionListener(this);
+ add(menu);
+
+ addMouseListener(this);
+ }
+
+ public void doCleanup()
+ {
+ removeMouseListener(this);
+ menu.removeActionListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective(90, (float)width/(float)height, 1, 700);
+
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glViewport(0,0,width,height);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+
+ gl.glTranslatef(0, 0, -7.5f);
+
+ gl.glPushMatrix();
+
+ gl.glTranslatef(-5f, -4.5f, -2.5f);
+
+ if(view==1)
+ {
+ gl.glRotatef(90f, 1, 0, 0);
+ } else if(view==2)
+ {
+ gl.glRotatef(-90f, 1, 0, 0);
+ }
+
+ if(rotationOn)
+ {
+ rotate+=rotationStep;
+ if(rotate>=180.0f || rotate<=0.0f)
+ rotationStep*=-1.0f;
+
+ gl.glRotatef(rotate, 0, 1, 0);
+ } else rotate=0;
+
+ glu.gluBeginSurface(theNurb);
+ glu.gluNurbsSurface(theNurb,
+ S_NUMKNOTS, sknots,
+ T_NUMKNOTS, tknots,
+ 4 * T_NUMPOINTS,
+ 4,
+ ctlpoints,
+ S_ORDER, T_ORDER,
+ GL_MAP2_VERTEX_4);
+ glu.gluEndSurface(theNurb);
+
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered(MouseEvent evt)
+ {
+ }
+
+ public void mouseExited(MouseEvent evt)
+ {
+ }
+
+ public void mousePressed(MouseEvent evt)
+ {
+ if (!menu_showing)
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ menu_showing = true;
+ save_suspended = isSuspended();
+ if (!save_suspended)
+ {
+ setSuspended(true);
+ repaint(100);
+ try
+ {
+ Thread.currentThread().sleep(200);
+ }
+ catch (Exception e)
+ { }
+ }
+ menu.show(this,evt.getX(),evt.getY());
+ }
+ else
+ {
+ // Must be left button.
+ if (isSuspended()) repaint();
+ }
+ }
+ else
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+
+ public void mouseReleased(MouseEvent evt)
+ {
+ }
+
+ public void mouseClicked(MouseEvent evt)
+ {
+ }
+
+ // Method required for the implementation of ActionListener
+ public void actionPerformed(ActionEvent evt)
+ {
+ String c = evt.getActionCommand();
+ if (c.equals(VIEW_ROTATION))
+ {
+ rotationOn=!rotationOn;
+ }
+ else if (c.equals(VIEW_FRONT))
+ {
+ view=0;
+ }
+ else if (c.equals(VIEW_TOP))
+ {
+ view=1;
+ }
+ else if (c.equals(VIEW_BOTTOM))
+ {
+ view=2;
+ }
+ if (menu_showing)
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+
+
+
+ }
+}
diff --git a/demos/MiscDemos/nurbs_plugin13.html b/demos/MiscDemos/nurbs_plugin13.html
new file mode 100644
index 0000000..ac13d9e
--- /dev/null
+++ b/demos/MiscDemos/nurbs_plugin13.html
@@ -0,0 +1,46 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 500 HEIGHT = 300 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "nurbs.class" WIDTH = 500 HEIGHT = 300 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "nurbs.class" WIDTH = 500 HEIGHT = 300></XMP>
+<PARAM NAME = CODE VALUE = "nurbs.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "nurbs.class" WIDTH = 500 HEIGHT = 300>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/pngTextureTestApplet.html b/demos/MiscDemos/pngTextureTestApplet.html
new file mode 100644
index 0000000..4887df3
--- /dev/null
+++ b/demos/MiscDemos/pngTextureTestApplet.html
@@ -0,0 +1,16 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<B>Try to drag the mouse (press-button and move) with/without the SHIFT key!</B>
+<br>
+<hr>
+<applet code="pngTextureTestApplet.class" width=600 height=400>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/pngTextureTestApplet.java b/demos/MiscDemos/pngTextureTestApplet.java
new file mode 100755
index 0000000..99ea0bb
--- /dev/null
+++ b/demos/MiscDemos/pngTextureTestApplet.java
@@ -0,0 +1,420 @@
+///////////////////////////////////////////////////
+// pngTextureTest in opgl
+///////////////////////////////////////////////////
+// progMaxRheiner
+///////////////////////////////////////////////////
+// 5.12.1999
+///////////////////////////////////////////////////
+
+import gl4java.*;
+import gl4java.awt.*;
+import gl4java.utils.textures.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.applet.*;
+import java.net.*;
+
+public class pngTextureTestApplet extends Applet
+{
+ pngTextureTest canvas = null;
+ boolean isAnApplet = true;
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ if(isAnApplet)
+ canvas = new pngTextureTest (d.width, d.height, getCodeBase());
+ else
+ canvas = new pngTextureTest (d.width, d.height, null);
+ add("Center", canvas);
+ }
+
+ public static void main( String args[] ) {
+ pngTextureTestApplet applet =
+ new pngTextureTestApplet();
+
+ Frame f = new Frame("pngTextureTestApplet");
+
+ f.addWindowListener( new WindowAdapter()
+ {
+ public void windowClosed(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ public void windowClosing(WindowEvent e)
+ {
+ windowClosed(e);
+ }
+ }
+ );
+
+ f.setLayout(new BorderLayout());
+ f.add("Center", applet);
+ applet.setSize(500,300);
+ applet.isAnApplet = false;
+ applet.init();
+ applet.start();
+ Dimension ps = applet.getPreferredSize();
+ f.setBounds(-100,-100,99,99);
+ f.setVisible(true);
+ f.setVisible(false);
+ Insets i = f.getInsets();
+ f.setBounds(0,0,
+ ps.width+i.left+i.right,
+ ps.height+i.top+i.bottom);
+ f.setVisible(true);
+ }
+ public void start()
+ {
+ }
+
+
+ public void stop()
+ {
+ }
+
+ class pngTextureTest extends GLCanvas
+ implements MouseListener,MouseMotionListener
+ {
+ float []mPosObjTrans;
+ float []mPosObjRot;
+
+ Point mousePoint;
+ Point oldMousePoint;
+ boolean mouseMoveFlag;
+
+
+ int texName[] = {0};
+ URL base;
+
+ public pngTextureTest (int w, int h, URL base)
+ {
+ super(w, h);
+ this.base=base;
+ }
+
+ public void preInit()
+ {
+ createOwnWindow = true;
+ }
+
+ public void init()
+ {
+ // texture laden
+ PngTextureLoader txtLoader1 = new PngTextureLoader(gl, glu);
+ if(base!=null)
+ txtLoader1.readTexture(base, "tex/DAISYX.png");
+ else {
+ try {
+ txtLoader1.readTexture("tex/DAISYX.png");
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ byte[] pixels1 = txtLoader1.getTexture();
+
+ if(txtLoader1.isOk())
+ {
+ gl.glEnable(GL_TEXTURE_2D);
+
+ // JAU: let's show us the scaled,
+ // and the tricky one using glTexSubImage2D
+ gl.glGenTextures(1,texName);
+ gl.glBindTexture(GL_TEXTURE_2D,texName[0]);
+
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
+
+ txtLoader1.texImage2DNonScaled(true);
+ // The Scaled Way
+ // txtLoader1.texImage2DScaled2Pow2();
+
+ gl.glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ System.out.println("texture succesfully loaded !");
+ System.out.println("texture: "+txtLoader1);
+ }
+ // cameraMatrix init
+ mPosObjTrans=new float[16];
+ for(int i=0;i<16;i++)
+ mPosObjTrans[i]=0f;
+ mPosObjTrans[0]=mPosObjTrans[5]=mPosObjTrans[10]=mPosObjTrans[15]=1f;
+
+ mPosObjRot=new float[16];
+ for(int i=0;i<16;i++)
+ mPosObjRot[i]=0f;
+ mPosObjRot[0]=mPosObjRot[5]=mPosObjRot[10]=mPosObjRot[15]=1f;
+
+ TranlateObj(0f,0f,-10f);
+
+ gl.glShadeModel (GL_SMOOTH);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ gl.glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
+ gl.glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ glj.gljCheckGL();
+
+ canvas.addMouseListener(this);
+ canvas.addMouseMotionListener(this);
+ mouseMoveFlag=false;
+
+ reshape(getSize().width, getSize().height);
+ }
+
+ public void display()
+ {
+ int i;
+
+ /* Standard GL4Java Init */
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ // just render it
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ SetCamera();
+
+ DrawScene();
+
+ /* For your animation dutys ;-) */
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void reshape(int w, int h)
+ {
+ gl.glMatrixMode (GL_MODELVIEW);
+ gl.glViewport (0, 0, w, h);
+ gl.glLoadIdentity();
+ SetCamera();
+ }
+
+
+ public void drawGrid(float x0, float y0,
+ float width, float height, float step)
+ {
+ float i,j;
+
+ /* draw grid */
+ gl.glBegin(GL_LINES);
+ for(i=x0;i<width;i+=step)
+ for(j=y0;j<height;j+=step)
+ {
+ if(i==0f && j==0f)
+ gl.glColor3f (1f,0f,0f);
+ else
+ gl.glColor3f (0.6f,0.5f,0.5f);
+ gl.glVertex2f(0f,j);
+ gl.glVertex2f(width,j);
+ gl.glVertex2f(i,height);
+ gl.glVertex2f(i,0f);
+ }
+ gl.glEnd();
+ }
+
+ void DrawScene()
+ {
+ gl.glMatrixMode (GL_MODELVIEW);
+ gl.glLoadIdentity ();
+
+ // kamera setzen
+ gl.glLoadMatrixf(mPosObjTrans);
+ gl.glMultMatrixf(mPosObjRot);
+
+ gl.glPushMatrix();
+ gl.glDisable(GL_TEXTURE_2D);
+ drawGrid(0f, 0f, 10f, 10f, 0.5f);
+ gl.glPopMatrix();
+
+ // obj zeichnen
+
+ gl.glPushMatrix();
+ gl.glScalef(2f,2f,2f);
+ gl.glColor3f(1f,0f,0f);
+ gl.glDisable(GL_TEXTURE_2D);
+ DrawObj();
+ gl.glPopMatrix();
+
+ gl.glEnable(GL_BLEND);
+ gl.glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+
+ if(texName[0]!=0)
+ gl.glEnable(GL_TEXTURE_2D);
+
+ gl.glColor3f(1f,1f,1f);
+
+ gl.glPushMatrix();
+ gl.glScalef(3f,3f,3f);
+ gl.glTranslatef(-1f,0f,1f);
+ DrawObj();
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glScalef(3f,3f,3f);
+ gl.glTranslatef(1f,0f,1f);
+ DrawObj();
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glScalef(3f,3f,3f);
+ gl.glTranslatef(-2f,1f,1f);
+ Billboard();
+ DrawObj();
+ gl.glPopMatrix();
+
+ gl.glDisable(GL_BLEND);
+ }
+
+ void DrawObj()
+ {
+ gl.glPushMatrix();
+ gl.glBegin(GL_QUADS);
+ gl.glNormal3f(0f,0f,1f);
+ gl.glTexCoord2f(0f,0f);
+ gl.glVertex3f(-.5f,-.5f,0f);
+
+ gl.glNormal3f(0f,0f,1f);
+ gl.glTexCoord2f(0f,1f);
+ gl.glVertex3f(.5f,-.5f,0f);
+
+ gl.glNormal3f(0f,0f,1f);
+ gl.glTexCoord2f(1f,1f);
+ gl.glVertex3f(.5f,.5f,0f);
+
+ gl.glNormal3f(0f,0f,1f);
+ gl.glTexCoord2f(1f,0f);
+ gl.glVertex3f(-.5f,.5f,0f);
+ gl.glEnd();
+ gl.glPopMatrix();
+ }
+
+ void SetCamera()
+ {
+ Dimension dim=getSize();
+ float aspect=(float)dim.width/(float)dim.height;
+
+ gl.glMatrixMode (GL_PROJECTION);
+ gl.glLoadIdentity ();
+ glu.gluPerspective(60f,aspect,.01,100);
+ }
+
+ void RotateObj(float degree,
+ float axisX,
+ float axisY,
+ float axisZ)
+ {
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ gl.glMatrixMode (GL_MODELVIEW);
+ gl.glLoadIdentity ();
+
+ // kamera setzen
+ gl.glRotatef(degree,axisX,axisY,axisZ);
+ gl.glMultMatrixf(mPosObjRot);
+ gl.glGetFloatv(GL_MODELVIEW_MATRIX,mPosObjRot);
+
+ repaint();
+ }
+
+ void TranlateObj(float x,float y,float z)
+ {
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ gl.glMatrixMode (GL_MODELVIEW);
+ gl.glLoadIdentity ();
+
+ // kamera setzen
+ gl.glLoadMatrixf(mPosObjTrans);
+ gl.glTranslatef(x,y,z);
+ gl.glGetFloatv(GL_MODELVIEW_MATRIX,mPosObjTrans);
+
+ repaint();
+ }
+
+ // entfernt rotationen aus aktueller matrix
+ double Billboard()
+ {
+ float[] mat=new float[16];
+
+ gl.glGetFloatv(GL_MODELVIEW_MATRIX,mat);
+ mat[0] = mat[5] = mat[10] = 1;
+ mat[1] = mat[2] = mat[4] = mat[6] = mat[8] = mat[9] = 0;
+ gl.glLoadMatrixf(mat);
+
+ return mat[14];
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ if(mouseMoveFlag==false)
+ { // start drag
+ mouseMoveFlag=true;
+ mousePoint=evt.getPoint();
+ }
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ mouseMoveFlag=false;
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ }
+
+ public void mouseDragged(MouseEvent e)
+ {
+ if(mouseMoveFlag==true)
+ {
+ oldMousePoint=new Point(mousePoint);
+ mousePoint=e.getPoint();
+
+ Point dif=new Point(mousePoint.x-oldMousePoint.x,
+ mousePoint.y-oldMousePoint.y);
+
+ if(e.isShiftDown()==true)
+ TranlateObj((float)dif.x/6.0f,(float)dif.y/-6.0f,0f);
+ else if(e.isAltDown()==true)
+ {
+ TranlateObj(0f,0f,(float)dif.y/6.0f);
+ RotateObj(dif.x,0f,0f,1f);
+ }
+ else
+ {
+ RotateObj(dif.x,0f,1f,0f);
+ RotateObj(dif.y,1f,0f,0f);
+ }
+ }
+ }
+ public void mouseMoved(MouseEvent e)
+ {
+ }
+
+
+ }
+}
diff --git a/demos/MiscDemos/pngTextureTestApplet_plugin13.html b/demos/MiscDemos/pngTextureTestApplet_plugin13.html
new file mode 100644
index 0000000..929700a
--- /dev/null
+++ b/demos/MiscDemos/pngTextureTestApplet_plugin13.html
@@ -0,0 +1,48 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<B>Try to drag the mouse (press-button and move) with/without the SHIFT key!</B>
+<br>
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 600 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "pngTextureTestApplet.class" WIDTH = 600 HEIGHT = 400 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "pngTextureTestApplet.class" WIDTH = 600 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "pngTextureTestApplet.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "pngTextureTestApplet.class" WIDTH = 600 HEIGHT = 400>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/select.html b/demos/MiscDemos/select.html
new file mode 100644
index 0000000..14b27a6
--- /dev/null
+++ b/demos/MiscDemos/select.html
@@ -0,0 +1,17 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Press the Left-Mouse Button to change the color! <br>
+Press the Middle-Mouse Button to zoom! <br>
+Press the Right-Mouse Button to delete! <br>
+<br>
+<hr>
+<applet code="select.class" width=500 height=300>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
diff --git a/demos/MiscDemos/select.java b/demos/MiscDemos/select.java
new file mode 100644
index 0000000..a1020c3
--- /dev/null
+++ b/demos/MiscDemos/select.java
@@ -0,0 +1,596 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any adverti(float)Math.sing or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "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 BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+import gl4java.utils.glut.*;
+
+public class select extends Applet
+{
+ selectCanvas canvas = null;
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new selectCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+ public static void main( String args[] ) {
+ GLContext.gljNativeDebug = true;
+ GLContext.gljClassDebug = true;
+
+ select applet =
+ new select();
+
+ Frame f = new Frame("select");
+
+ f.addWindowListener( new WindowAdapter()
+ {
+ public void windowClosed(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ public void windowClosing(WindowEvent e)
+ {
+ windowClosed(e);
+ }
+ }
+ );
+
+ f.setLayout(new BorderLayout());
+ f.add("Center", applet);
+ applet.setSize(500,300);
+ applet.init();
+ applet.start();
+ Dimension ps = applet.getPreferredSize();
+ f.setBounds(-100,-100,99,99);
+ f.setVisible(true);
+ f.setVisible(false);
+ Insets i = f.getInsets();
+ f.setBounds(0,0,
+ ps.width+i.left+i.right,
+ ps.height+i.top+i.bottom);
+ f.setVisible(true);
+ }
+
+ /* Local GLCanvas extension class */
+
+ static final int MAXOBJS =10000;
+ static final int MAXSELECT =100;
+ static final int MAXFEED =300;
+ static final int SOLID =1;
+ static final int LINE =2;
+ static final int POINT =3;
+
+ protected class object {
+ float v1[];
+ float v2[];
+ float v3[];
+ float color[];
+
+ public object()
+ {
+ v1=new float[2];
+ v2=new float[2];
+ v3=new float[2];
+ color=new float[3];
+ }
+ } /* objects[MAXOBJS] */
+
+
+ private class selectCanvas extends GLCanvas
+ implements MouseListener
+ {
+ int windW, windH;
+
+ object[] objects=null;
+ int selectBuf[/*MAXSELECT*/];
+ float feedBuf[/*MAXFEED*/];
+ int vp[/*4*/];
+ float zRotation = 90.0f;
+ float zoom = 1.0f;
+ int objectCount;
+ int numObjects;
+ boolean linePoly = false;
+
+ public selectCanvas(int w, int h)
+ {
+ super(w, h);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+
+ public void init()
+ {
+ int i;
+
+ windW = getSize().width;
+ windH = getSize().height;
+
+ objects = new object[MAXOBJS];
+ for(i=0; i<MAXOBJS; i++)
+ objects[i]=new object();
+
+ selectBuf=new int[MAXSELECT];
+ feedBuf=new float[MAXFEED];
+ vp=new int[4];
+
+ numObjects = 10;
+ InitObjects(numObjects);
+ gl.glGetIntegerv(GL_VIEWPORT, vp);
+
+ addMouseListener(this);
+ }
+
+ public void InitObjects(int num)
+ {
+ int i;
+ double x, y;
+
+ if (num > MAXOBJS) {
+ num = MAXOBJS;
+ }
+ if (num < 1) {
+ num = 1;
+ }
+ objectCount = num;
+
+ // srand((unsigned int)time(NULL));
+ for (i = 0; i < num; i++) {
+ /*
+ x = (rand() % 300) - 150;
+ y = (rand() % 300) - 150;
+ */
+ x = (Math.random() * 300.0) - 150.0;
+ y = (Math.random() * 300.0) - 150.0;
+
+ objects[i].v1[0] = (float) (x + (Math.random() * 50.0) - 25.0);
+ objects[i].v2[0] = (float) (x + (Math.random() * 50.0) - 25.0);
+ objects[i].v3[0] = (float) (x + (Math.random() * 50.0) - 25.0);
+ objects[i].v1[1] = (float) (y + (Math.random() * 50.0) - 25.0);
+ objects[i].v2[1] = (float) (y + (Math.random() * 50.0) - 25.0);
+ objects[i].v3[1] = (float) (y + (Math.random() * 50.0) - 25.0);
+ objects[i].color[0] = (float)
+ (((Math.random() * 100.0) + 50.0) / 150.0f);
+ objects[i].color[1] = (float)
+ (((Math.random() * 100.0) + 50.0) / 150.0f);
+ objects[i].color[2] = (float)
+ (((Math.random() * 100.0) + 50.0) / 150.0f);
+ }
+ }
+
+
+ public void reshape(int width, int height)
+ {
+
+ windW = (int)width;
+ windH = (int)height;
+ }
+
+ public void Render(int mode)
+ {
+ int i;
+
+ for (i = 0; i < objectCount; i++) {
+ if (mode == GL_SELECT) {
+ gl.glLoadName(i);
+ }
+ gl.glColor3fv(objects[i].color);
+ gl.glBegin(GL_POLYGON);
+ gl.glVertex2fv(objects[i].v1);
+ gl.glVertex2fv(objects[i].v2);
+ gl.glVertex2fv(objects[i].v3);
+ gl.glEnd();
+ }
+ }
+
+ public int DoSelect(int x, int y)
+ {
+ int hits;
+
+ gl.glSelectBuffer(MAXSELECT, selectBuf);
+ gl.glRenderMode(GL_SELECT);
+ gl.glInitNames();
+ gl.glPushName(~0);
+
+ gl.glPushMatrix();
+
+ gl.glViewport(0, 0, windW, windH);
+ gl.glGetIntegerv(GL_VIEWPORT, vp);
+
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPickMatrix(x, windH-y, 4, 4, vp);
+ glu.gluOrtho2D(-175, 175, -175, 175);
+ gl.glMatrixMode(GL_MODELVIEW);
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+
+ gl.glScalef(zoom, zoom, zoom);
+ gl.glRotatef(zRotation, 0, 0, 1);
+
+ Render(GL_SELECT);
+
+ gl.glPopMatrix();
+
+ hits = gl.glRenderMode(GL_RENDER);
+ if (hits <= 0) {
+ return -1;
+ }
+
+ return selectBuf[(hits-1)*4+3];
+ }
+
+ public void RecolorTri(int h)
+ {
+
+ objects[h].color[0] = (float)
+ (((Math.random() * 100.0) + 50.0) / 150.0);
+ objects[h].color[1] = (float)
+ (((Math.random() * 100.0) + 50.0) / 150.0);
+ objects[h].color[2] = (float)
+ (((Math.random() * 100.0) + 50.0) / 150.0);
+ }
+
+ public void DeleteTri(int h)
+ {
+
+ objects[h] = objects[objectCount-1];
+ objectCount--;
+ }
+
+ public void GrowTri(int h)
+ {
+ float v[/*2*/];
+ int i;
+
+ v = new float[2];
+
+ v[0] = objects[h].v1[0] + objects[h].v2[0] + objects[h].v3[0];
+ v[1] = objects[h].v1[1] + objects[h].v2[1] + objects[h].v3[1];
+ v[0] /= 3f;
+ v[1] /= 3f;
+
+ for (i = 0; i < 3; i++) {
+ switch (i) {
+ case 0:
+ objects[h].v1[0] = 1.5f * (objects[h].v1[0] - v[0]) + v[0];
+ objects[h].v1[1] = 1.5f * (objects[h].v1[1] - v[1]) + v[1];
+ break;
+ case 1:
+ objects[h].v2[0] = 1.5f * (objects[h].v2[0] - v[0]) + v[0];
+ objects[h].v2[1] = 1.5f * (objects[h].v2[1] - v[1]) + v[1];
+ break;
+ case 2:
+ objects[h].v3[0] = 1.5f * (objects[h].v3[0] - v[0]) + v[0];
+ objects[h].v3[1] = 1.5f * (objects[h].v3[1] - v[1]) + v[1];
+ break;
+ }
+ }
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered(MouseEvent evt)
+ {
+ }
+
+ public void mouseExited(MouseEvent evt)
+ {
+ }
+
+ public void mousePressed(MouseEvent evt)
+ {
+ }
+
+ public void mouseReleased(MouseEvent evt)
+ {
+ }
+
+ public void mouseClicked(MouseEvent evt)
+ {
+ int x1 = evt.getX();
+ int y1 = evt.getY();
+
+ /* translate GLUT into GL coordinates */
+ // y1 = getSize().height -y1;
+
+ int hit;
+
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("mouseClicked: problem in GL-use() method");
+ return;
+ }
+
+ hit = DoSelect(x1, y1);
+
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ if (hit != -1) {
+ if ((evt.getModifiers() & evt.BUTTON1_MASK) != 0) {
+ RecolorTri(hit);
+ }
+ if ((evt.getModifiers() & evt.BUTTON2_MASK) != 0) {
+ GrowTri(hit);
+ }
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0) {
+ DeleteTri(hit);
+ }
+ }
+
+ repaint();
+ }
+
+ public void display()
+ {
+
+ /* Standard GL4Java Init */
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ gl.glPushMatrix();
+
+ gl.glViewport(0, 0, windW, windH);
+ gl.glGetIntegerv(GL_VIEWPORT, vp);
+
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluOrtho2D(-175, 175, -175, 175);
+ gl.glMatrixMode(GL_MODELVIEW);
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+
+ gl.glScalef(zoom, zoom, zoom);
+ gl.glRotatef(zRotation, 0, 0, 1);
+
+ Render(GL_RENDER);
+
+ gl.glPopMatrix();
+
+ /* For your animation dutys ;-) */
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void DrawZoom(int x, int y)
+ {
+
+ gl.glPushMatrix();
+
+ gl.glViewport(0, 0, windW, windH);
+ gl.glGetIntegerv(GL_VIEWPORT, vp);
+
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPickMatrix(x, windH-y, 4, 4, vp);
+ glu.gluOrtho2D(-175, 175, -175, 175);
+ gl.glMatrixMode(GL_MODELVIEW);
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+
+ gl.glScalef(zoom, zoom, zoom);
+ gl.glRotatef(zRotation, 0, 0, 1);
+
+ Render(GL_RENDER);
+
+ gl.glPopMatrix();
+ }
+
+ public int DumpFeedbackVert(int i, int n)
+ {
+ int index;
+
+ index = i;
+ if (index+7 > n) {
+ System.out.println(" ???");
+ return n;
+ }
+ System.out.println(" ("+feedBuf[index]+" "+
+ feedBuf[index+1]+" "+
+ feedBuf[index+2]+"), color = ("+
+ feedBuf[index+3]+" "+
+ feedBuf[index+4]+" "+
+ feedBuf[index+5]+")");
+ return index + 7;
+ }
+
+ public void DrawFeedback(int n)
+ {
+ int i;
+ int verts;
+
+ System.out.println("Feedback results ("+n+" floats):");
+ for (i = 0; i < n; i++) {
+ switch ((int)feedBuf[i]) {
+ case GL_POLYGON_TOKEN:
+ System.out.print("Polygon");
+ i++;
+ if (i < n) {
+ verts = (int)feedBuf[i];
+ i++;
+ System.out.print(": "+verts+" vertices");
+ } else {
+ verts = 0;
+ }
+ System.out.print("\n");
+ while (verts>0) {
+ i=DumpFeedbackVert(i, n);
+ verts--;
+ }
+ i--;
+ break;
+ case GL_LINE_TOKEN:
+ System.out.print("Line:");
+ i++;
+ i=DumpFeedbackVert(i, n);
+ i=DumpFeedbackVert(i, n);
+ i--;
+ break;
+ case GL_LINE_RESET_TOKEN:
+ System.out.print("Line Reset:\n");
+ i++;
+ i=DumpFeedbackVert(i, n);
+ i=DumpFeedbackVert(i, n);
+ i--;
+ break;
+ default:
+ System.out.print(feedBuf[i]+"\n");
+ break;
+ }
+ }
+ if (i == MAXFEED) {
+ System.out.print("...\n");
+ }
+ System.out.print("\n");
+ }
+
+ public void DoFeedback()
+ {
+ int x;
+
+ gl.glFeedbackBuffer(MAXFEED, GL_3D_COLOR, feedBuf);
+ gl.glRenderMode(GL_FEEDBACK);
+
+ gl.glPushMatrix();
+
+ gl.glViewport(0, 0, windW, windH);
+ gl.glGetIntegerv(GL_VIEWPORT, vp);
+
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluOrtho2D(-175, 175, -175, 175);
+ gl.glMatrixMode(GL_MODELVIEW);
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+
+ gl.glScalef(zoom, zoom, zoom);
+ gl.glRotatef(zRotation, 0, 0, 1);
+
+ Render(GL_FEEDBACK);
+
+ gl.glPopMatrix();
+
+ x = gl.glRenderMode(GL_RENDER);
+ if (x == -1) {
+ x = MAXFEED;
+ }
+
+ DrawFeedback((int)x);
+ }
+
+ /*
+ static void Key2(int key, int x, int y)
+ {
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ zRotation += 0.5f;
+ break;
+ case GLUT_KEY_RIGHT:
+ zRotation -= 0.5f;
+ break;
+ default:
+ return;
+ }
+
+ glut.glutPostRedisplay();
+ }
+
+ static void Key(unsigned char key, int x, int y)
+ {
+ switch (key) {
+ case 27:
+ exit(1);
+ case 'Z':
+ zoom /= 0.75f;
+ break;
+ case 'z':
+ zoom *= 0.75f;
+ break;
+ case 'f':
+ DoFeedback();
+ break;
+ case 'd':
+ DrawZoom(x, y);
+ break;
+ case 'l':
+ linePoly = !linePoly;
+ if (linePoly) {
+ gl.glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ } else {
+ gl.glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ }
+ break;
+ default:
+ return;
+ }
+
+ glut.glutPostRedisplay();
+ }
+ */
+
+ }
+}
diff --git a/demos/MiscDemos/select_plugin13.html b/demos/MiscDemos/select_plugin13.html
new file mode 100644
index 0000000..f4e0e54
--- /dev/null
+++ b/demos/MiscDemos/select_plugin13.html
@@ -0,0 +1,49 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Press the Left-Mouse Button to change the color! <br>
+Press the Middle-Mouse Button to zoom! <br>
+Press the Right-Mouse Button to delete! <br>
+<br>
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 500 HEIGHT = 300 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "select.class" WIDTH = 500 HEIGHT = 300 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "select.class" WIDTH = 500 HEIGHT = 300></XMP>
+<PARAM NAME = CODE VALUE = "select.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "select.class" WIDTH = 500 HEIGHT = 300>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
diff --git a/demos/MiscDemos/spectex.html b/demos/MiscDemos/spectex.html
new file mode 100644
index 0000000..4ceb658
--- /dev/null
+++ b/demos/MiscDemos/spectex.html
@@ -0,0 +1,14 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<applet code="spectex.class" width=400 height=400>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/spectex.java b/demos/MiscDemos/spectex.java
new file mode 100644
index 0000000..55d4aae
--- /dev/null
+++ b/demos/MiscDemos/spectex.java
@@ -0,0 +1,336 @@
+/**
+ * @(#) spectex.java
+ * @(#) author: Joe Zimmerman (converted to Java by Sven Goethel)
+ */
+
+/* This program is free software under the license of LGPL */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class spectex extends SimpleGLAnimApplet1
+{
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new gldemo(d.width, d.height);
+ add("Center", canvas);
+ }
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("spectex");
+
+ spectex applet = new spectex();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+ private class gldemo extends GLAnimCanvas
+ implements MouseListener, ActionListener
+ {
+ private PopupMenu menu = null;
+ private boolean menu_showing = false;
+ private boolean save_suspended = false;
+ private final String MENUE_0 = "1-pass lighting + texturing";
+ private final String MENUE_1 = "specular lighting";
+ private final String MENUE_2 = "diffuse lighting + texturing";
+ private final String MENUE_3 = "2-pass lighting + texturing";
+ private final String MENUE_4 = "OpenGL 1.2f separate specular";
+
+ final float M_PI = 3.14159265f;
+ final float M_PI_2 = 1.57079632f;
+ int view = 0; /* 0 = front, 1 = top, 2 = bottom */
+
+ int Quadric;
+ int Sphere;
+ float LightPos[/*4*/] = {10.0f, 10.0f, 10.0f, 1.0f};
+ float Delta = 1.0f;
+ int Mode = 0;
+
+ /*static float Blue[4] = {0.0f, 0.0f, 1.0f, 1.0f};*/
+ /*static float Gray[4] = {0.5f, 0.5f, 0.5f, 1.0f};*/
+ float Black[/*4*/] = {0.0f, 0.0f, 0.0f, 1.0f};
+ float White[/*4*/] = {1.0f, 1.0f, 1.0f, 1.0f};
+
+ public gldemo(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, Black);
+
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, White);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, White);
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, 20.0f);
+
+ /* Actually, these are set again later */
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, White);
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, White);
+
+ Quadric = glu.gluNewQuadric();
+ glu.gluQuadricTexture( Quadric, GL_TRUE );
+
+ Sphere= gl.glGenLists(1);
+ gl.glNewList( Sphere, GL_COMPILE );
+ glu.gluSphere( Quadric, 1.0f, 24, 24 );
+ gl.glEndList();
+
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glEnable(GL_CULL_FACE);
+
+ // byte texImage[64][64][3];
+ byte texImage[] = new byte[64 * 64 * 3];
+ int i,j;
+
+ for (i=0;i<64;i++) {
+ for (j=0;j<64;j++) {
+ int k = ((i>>3)&1) ^ ((j>>3)&1);
+ texImage[i*64*3 + j*3 + 0] = (byte)(255*k);
+ texImage[i*64*3 + j*3 + 1] = (byte)(255*(1-k));
+ texImage[i*64*3 + j*3 + 2] = (byte)(0);
+ }
+ }
+
+ gl.glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ gl.glTexImage2D( GL_TEXTURE_2D,
+ 0,
+ 3,
+ 64, 64,
+ 0,
+ GL_RGB, GL_UNSIGNED_BYTE,
+ texImage );
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl.glEnable(GL_TEXTURE_2D);
+
+ gl.glBlendFunc(GL_ONE, GL_ONE);
+
+ glj.gljCheckGL();
+
+ reshape(getSize().width, getSize().height);
+
+ glj.gljCheckGL();
+
+ menu = new PopupMenu("Options");
+ menu.add(MENUE_0);
+ menu.add(MENUE_1);
+ menu.add(MENUE_2);
+ menu.add(MENUE_3);
+ menu.add(MENUE_4);
+ menu.addActionListener(this);
+ add(menu);
+
+ addMouseListener(this);
+ }
+
+ public void doCleanup()
+ {
+ removeMouseListener(this);
+ menu.removeActionListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport( 0, 0, width, height );
+ gl.glMatrixMode( GL_PROJECTION );
+ gl.glLoadIdentity();
+ gl.glFrustum( -1.0f, 1.0f, -1.0f, 1.0f, 5.0f, 25.0f );
+ gl.glMatrixMode( GL_MODELVIEW );
+ gl.glLoadIdentity();
+ gl.glTranslatef( 0.0f, 0.0f, -12.0f );
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ gl.glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, LightPos);
+
+ gl.glPushMatrix();
+ gl.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
+
+ if (Mode==0) {
+ /* Typical method: diffuse + specular + texture */
+ gl.glEnable(GL_TEXTURE_2D);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, White); /* enable diffuse */
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, White); /* enable specular */
+ //gl.glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
+ // glj.gljCheckGL();
+ gl.glCallList(Sphere);
+ }
+ else if (Mode==1) {
+ /* just specular highlight */
+ gl.glDisable(GL_TEXTURE_2D);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, Black); /* disable diffuse */
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, White); /* enable specular */
+ //gl.glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
+ gl.glCallList(Sphere);
+ }
+ else if (Mode==2) {
+ /* diffuse textured */
+ gl.glEnable(GL_TEXTURE_2D);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, White); /* enable diffuse */
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, Black); /* disable specular */
+ //gl.glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
+ gl.glCallList(Sphere);
+ }
+ else if (Mode==3) {
+ /* 2-pass: diffuse textured then add specular highlight*/
+ gl.glEnable(GL_TEXTURE_2D);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, White); /* enable diffuse */
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, Black); /* disable specular */
+ //gl.glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
+ gl.glCallList(Sphere);
+ /* specular highlight */
+ gl.glDepthFunc(GL_EQUAL); /* redraw same pixels */
+ gl.glDisable(GL_TEXTURE_2D);
+ gl.glEnable(GL_BLEND); /* add */
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, Black); /* disable diffuse */
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, White); /* enable specular */
+ gl.glCallList(Sphere);
+ gl.glDepthFunc(GL_LESS);
+ gl.glDisable(GL_BLEND);
+ }
+ else if (Mode==4) {
+ /* OpenGL 1.2f's separate diffuse and specular color */
+ gl.glEnable(GL_TEXTURE_2D);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, White); /* enable diffuse */
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, White); /* enable specular */
+ //gl.glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
+ gl.glCallList(Sphere);
+ }
+
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ LightPos[0] += Delta;
+ if (LightPos[0]>15.0f)
+ Delta = -1.0f;
+ else if (LightPos[0]<-15.0f)
+ Delta = 1.0f;
+
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered(MouseEvent evt)
+ {
+ }
+
+ public void mouseExited(MouseEvent evt)
+ {
+ }
+
+ public void mousePressed(MouseEvent evt)
+ {
+ if (!menu_showing)
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ menu_showing = true;
+ save_suspended = isSuspended();
+ if (!save_suspended)
+ {
+ setSuspended(true);
+ repaint(100);
+ try
+ {
+ Thread.currentThread().sleep(200);
+ }
+ catch (Exception e)
+ { }
+ }
+ menu.show(this,evt.getX(),evt.getY());
+ }
+ else
+ {
+ // Must be left button.
+ if (isSuspended()) repaint();
+ }
+ }
+ else
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+
+ public void mouseReleased(MouseEvent evt)
+ {
+ }
+
+ public void mouseClicked(MouseEvent evt)
+ {
+ }
+
+ // Method required for the implementation of ActionListener
+ public void actionPerformed(ActionEvent evt)
+ {
+ String c = evt.getActionCommand();
+ if (c.equals(MENUE_0))
+ {
+ Mode=0;
+ }
+ else if (c.equals(MENUE_1))
+ {
+ Mode=1;
+ }
+ else if (c.equals(MENUE_2))
+ {
+ Mode=2;
+ }
+ else if (c.equals(MENUE_3))
+ {
+ Mode=3;
+ }
+ else if (c.equals(MENUE_4))
+ {
+ Mode=4;
+ }
+ if (menu_showing)
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+
+
+
+ }
+}
diff --git a/demos/MiscDemos/spectex_plugin13.html b/demos/MiscDemos/spectex_plugin13.html
new file mode 100644
index 0000000..91da5f0
--- /dev/null
+++ b/demos/MiscDemos/spectex_plugin13.html
@@ -0,0 +1,46 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "spectex.class" WIDTH = 400 HEIGHT = 400 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "spectex.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "spectex.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "spectex.class" WIDTH = 400 HEIGHT = 400>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/MiscDemos/stencil.html b/demos/MiscDemos/stencil.html
new file mode 100644
index 0000000..099ef91
--- /dev/null
+++ b/demos/MiscDemos/stencil.html
@@ -0,0 +1,20 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Stencil by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Stencil applet
+<br>Originially written by Silicon Graphics
+<br>
+<B> The left canvas should have 0 stencil-bits !
+<B> The right canvas should have 8 stencil-bits !
+<br>
+<hr>
+<applet code="stencil.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/stencil.java b/demos/MiscDemos/stencil.java
new file mode 100644
index 0000000..a2d163f
--- /dev/null
+++ b/demos/MiscDemos/stencil.java
@@ -0,0 +1,342 @@
+/**
+ * @(#) stencil.java
+ * @(#) author: Silicon Graphics (converted to Java by Ron Cemer)
+ */
+
+/*
+ * Copyright (c) 1993-1997, 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(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+
+/*
+ * This program demonstrates use of the stencil buffer for
+ * masking nonrectangular regions.
+ * Whenever the window is redrawn, a value of 1 is drawn
+ * into a diamond-shaped region in the stencil buffer.
+ * Elsewhere in the stencil buffer, the value is 0.
+ * Then a blue sphere is drawn where the stencil value is 1,
+ * and yellow torii are drawn where the stencil value is not 1.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+public class stencil extends Applet
+{
+ stencilCanvas canvas1 = null;
+ stencilCanvas canvas2 = null;
+
+ Panel cvs = null;
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+
+ canvas1 = new stencilCanvas(d.width, d.height, 0, false);
+ System.out.println("the left canvas has 0 stencil-bits, self-window");
+ canvas2 = new stencilCanvas(d.width, d.height, 8, true);
+ System.out.println("the right canvas should have 8 stencil-bits, ownWindow");
+
+ cvs = new Panel();
+ cvs.setLayout(new GridLayout(1,2));
+ cvs.add(canvas1);
+ if(canvas2!=null)
+ cvs.add(canvas2);
+ add("Center", cvs);
+ }
+
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("stencil");
+
+ GLContext.gljNativeDebug = true;
+ GLContext.gljClassDebug = true;
+
+ stencil applet = new stencil();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+
+ /* Destroy the applet */
+
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class stencilCanvas extends GLCanvas
+ {
+ private static final float M_PI = 3.14159265359f;
+ private static final int YELLOWMAT = 1, BLUEMAT = 2;
+ private boolean initdone = false;
+
+ public stencilCanvas(int w, int h,
+ int _stencilBits,
+ boolean _createOwnWindow)
+ {
+ super(w, h);
+ stencilBits = _stencilBits;
+ createOwnWindow = _createOwnWindow;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ // Examine some OpenGL properties
+ int [] res=new int[6];
+
+ gl.glGetIntegerv(GL_STENCIL_BITS,res);
+
+ System.out.println("init(): " + this + "\n\t" +
+ "Stencil bits are "+res[0] +"\n\t" +
+ "IsOwnCreatedWindow: "+createOwnWindow);
+
+ float yellow_diffuse[] = { 0.7f, 0.7f, 0.0f, 1.0f };
+ float yellow_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+
+ float blue_diffuse[] = { 0.1f, 0.1f, 0.7f, 1.0f };
+ float blue_specular[] = { 0.1f, 1.0f, 1.0f, 1.0f };
+
+ float position_one[] = { 1.0f, 1.0f, 1.0f, 0.0f };
+
+ gl.glNewList(YELLOWMAT, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, yellow_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, yellow_specular);
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, 64.0f);
+ gl.glEndList();
+
+ gl.glNewList(BLUEMAT, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, blue_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, blue_specular);
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, 45.0f);
+ gl.glEndList();
+
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, position_one);
+
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ gl.glClearStencil(0);
+ gl.glEnable(GL_STENCIL_TEST);
+
+ glj.gljCheckGL();
+
+ initdone = true;
+ reshape(getSize().width, getSize().height);
+ }
+
+ public void cvsDispose()
+ {
+ System.out.println("destroy(): " + this);
+ super.cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+
+ if (initdone)
+ {
+ /* create a diamond shaped stencil area */
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ if (width <= height)
+ glu.gluOrtho2D
+ (-3.0f,
+ 3.0f,
+ -3.0f*(float)height/(float)width,
+ 3.0f*(float)height/(float)width);
+ else
+ glu.gluOrtho2D
+ (-3.0f*(float)width/(float)height,
+ 3.0f*(float)width/(float)height,
+ -3.0f,
+ 3.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+
+ gl.glClear(GL_STENCIL_BUFFER_BIT);
+ gl.glStencilFunc(GL_ALWAYS, 1, 1);
+ gl.glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
+ gl.glBegin(GL_QUADS);
+ gl.glVertex2f(-1.0f, 0.0f);
+ gl.glVertex2f(0.0f, 1.0f);
+ gl.glVertex2f(1.0f, 0.0f);
+ gl.glVertex2f(0.0f, -1.0f);
+ gl.glEnd();
+ }
+
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective(45.0f, (float)width/(float)height, 3.0f, 7.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glTranslatef(0.0f, 0.0f, -5.0f);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ /* Draw a sphere in a diamond-shaped section in the
+ * middle of a window with 2 torii.
+ */
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ /* draw blue sphere where the stencil is 1 */
+ gl.glStencilFunc(GL_EQUAL, 1, 1);
+ gl.glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+ gl.glCallList(BLUEMAT);
+
+ int qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,0.5f,15,15);
+ glu.gluDeleteQuadric(qobj);
+
+ /* draw the tori where the stencil is not 1 */
+ gl.glStencilFunc(GL_NOTEQUAL, 1, 1);
+ gl.glPushMatrix();
+ gl.glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
+ gl.glRotatef(45.0f, 0.0f, 1.0f, 0.0f);
+ gl.glCallList(YELLOWMAT);
+ glutSolidTorus(0.275f, 0.85f, 15, 15);
+ gl.glPushMatrix();
+ gl.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
+ glutSolidTorus(0.275f, 0.85f, 15, 15);
+ gl.glPopMatrix();
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ // Imported from glut.
+ private void glutSolidTorus
+ (float innerRadius,
+ float outerRadius,
+ int nsides,
+ int rings)
+ {
+ doughnut(innerRadius, outerRadius, nsides, rings);
+ }
+
+ // Imported from glut.
+ private void doughnut(float r, float R, int nsides, int rings)
+ {
+ int i, j;
+ float theta, phi, theta1;
+ float cosTheta, sinTheta;
+ float cosTheta1, sinTheta1;
+ float ringDelta, sideDelta;
+
+ ringDelta = 2.0f * M_PI / rings;
+ sideDelta = 2.0f * M_PI / nsides;
+
+ theta = 0.0f;
+ cosTheta = 1.0f;
+ sinTheta = 0.0f;
+ for (i = rings - 1; i >= 0; i--)
+ {
+ theta1 = theta + ringDelta;
+ cosTheta1 = (float)Math.cos(theta1);
+ sinTheta1 = (float)Math.sin(theta1);
+ gl.glBegin(GL_QUAD_STRIP);
+ phi = 0.0f;
+ for (j = nsides; j >= 0; j--)
+ {
+ float cosPhi, sinPhi, dist;
+
+ phi += sideDelta;
+ cosPhi = (float)Math.cos(phi);
+ sinPhi = (float)Math.sin(phi);
+ dist = R + r * cosPhi;
+
+ gl.glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi);
+ gl.glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi);
+ gl.glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi);
+ gl.glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi);
+ }
+ gl.glEnd();
+ theta = theta1;
+ cosTheta = cosTheta1;
+ sinTheta = sinTheta1;
+ }
+ }
+ }
+}
diff --git a/demos/MiscDemos/stencil_plugin13.html b/demos/MiscDemos/stencil_plugin13.html
new file mode 100644
index 0000000..3a654f8
--- /dev/null
+++ b/demos/MiscDemos/stencil_plugin13.html
@@ -0,0 +1,51 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Stencil by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Stencil applet
+<br>Originially written by Silicon Graphics
+<br>
+<B> The left canvas should have 0 stencil-bits !
+<B> The right canvas should have 8 stencil-bits !
+<br>
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "stencil.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "stencil.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "stencil.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "stencil.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/teaambient.html b/demos/MiscDemos/teaambient.html
new file mode 100644
index 0000000..2bdbdcd
--- /dev/null
+++ b/demos/MiscDemos/teaambient.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>OpenGL Demo - ported by Sven Goethel</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Sven Goethel
+<br>
+<applet code="teaambient.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/teaambient.java b/demos/MiscDemos/teaambient.java
new file mode 100755
index 0000000..aaebf71
--- /dev/null
+++ b/demos/MiscDemos/teaambient.java
@@ -0,0 +1,182 @@
+/**
+ * @(#) teaambient.java
+ * @(#) author: Silicon Graphics, Inc. (converted to Java by Ron Cemer)
+ */
+
+/*
+ * This program demonstrates lots of material properties.
+ * A single light source illuminates the objects.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+import gl4java.utils.glut.*;
+
+public class teaambient extends Applet
+{
+ teaambientCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new teaambientCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("teaambient");
+
+ teaambient applet = new teaambient();
+
+ applet.setSize(400, 600);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class teaambientCanvas extends GLCanvas
+ {
+ GLUTFunc glut = null;
+
+ public teaambientCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+
+ glut = new GLUTFuncLightImpl(gl, glu);
+
+ reshape(getSize().width, getSize().height);
+
+ float light_ambient[] =
+ {0.0f, 0.0f, 0.0f, 1.0f};
+ float light_diffuse[] =
+ {1.0f, 1.0f, 1.0f, 1.0f};
+ float light_specular[] =
+ {1.0f, 1.0f, 1.0f, 1.0f};
+ /* light_position is NOT default value */
+ float light_position[] =
+ {1.0f, 0.0f, 0.0f, 0.0f};
+ float global_ambient[] =
+ {0.75f, 0.75f, 0.75f, 1.0f};
+
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, light_position);
+
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);
+
+ gl.glFrontFace(GL_CW);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_AUTO_NORMAL);
+ gl.glEnable(GL_NORMALIZE);
+ gl.glDepthFunc(GL_LESS);
+ gl.glEnable(GL_DEPTH_TEST);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ float low_ambient[] =
+ {0.1f, 0.1f, 0.1f, 1.0f};
+ float more_ambient[] =
+ {0.4f, 0.4f, 0.4f, 1.0f};
+ float most_ambient[] =
+ {1.0f, 1.0f, 1.0f, 1.0f};
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* material has small ambient reflection */
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, low_ambient);
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, 40.0f);
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, 2.0f, 0.0f);
+ glut.glutSolidTeapot(1.0f);
+ gl.glPopMatrix();
+
+ /* material has moderate ambient reflection */
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, more_ambient);
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, 0.0f, 0.0f);
+ glut.glutSolidTeapot(1.0f);
+ gl.glPopMatrix();
+
+ /* material has large ambient reflection */
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, most_ambient);
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, -2.0f, 0.0f);
+ glut.glutSolidTeapot(1.0f);
+ gl.glPopMatrix();
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void reshape(int w, int h)
+ {
+ gl.glViewport(0, 0, w, h);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ if (w <= h)
+ gl.glOrtho(-4.0f, 4.0f, -4.0f * (float) h / (float) w,
+ 4.0f * (float) h / (float) w, -10.0f, 10.0f);
+ else
+ gl.glOrtho(-4.0f * (float) w / (float) h,
+ 4.0f * (float) w / (float) h, -4.0f, 4.0f, -10.0f, 10.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+ }
+}
diff --git a/demos/MiscDemos/teaambient_plugin13.html b/demos/MiscDemos/teaambient_plugin13.html
new file mode 100644
index 0000000..b1ddbb8
--- /dev/null
+++ b/demos/MiscDemos/teaambient_plugin13.html
@@ -0,0 +1,48 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>OpenGL Demo - ported by Sven Goethel</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Sven Goethel
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "teaambient.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "teaambient.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "teaambient.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "teaambient.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/teapots.html b/demos/MiscDemos/teapots.html
new file mode 100644
index 0000000..834c206
--- /dev/null
+++ b/demos/MiscDemos/teapots.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Teapots by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<applet code="teapots.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/teapots.java b/demos/MiscDemos/teapots.java
new file mode 100644
index 0000000..63d42aa
--- /dev/null
+++ b/demos/MiscDemos/teapots.java
@@ -0,0 +1,279 @@
+/**
+ * @(#) teapots.java
+ * @(#) author: Silicon Graphics, Inc. (converted to Java by Ron Cemer)
+ */
+
+/*
+ * This program demonstrates lots of material properties.
+ * A single light source illuminates the objects.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+import gl4java.utils.glut.*;
+
+public class teapots extends Applet
+{
+ teapotsCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new teapotsCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("teapots");
+
+ teapots applet = new teapots();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class teapotsCanvas extends GLCanvas
+ {
+ int teapotList;
+ GLUTFunc glut = null;
+
+ public teapotsCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+
+ glut = new GLUTFuncLightImpl(gl, glu);
+
+ reshape(getSize().width, getSize().height);
+
+ float ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
+ float diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float position[] = {0.0f, 3.0f, 3.0f, 0.0f};
+
+ float lmodel_ambient[] = {0.2f, 0.2f, 0.2f, 1.0f};
+ float local_view[] = {0.0f};
+
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, position);
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ gl.glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);
+
+ gl.glFrontFace(GL_CW);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_AUTO_NORMAL);
+ gl.glEnable(GL_NORMALIZE);
+ gl.glEnable(GL_DEPTH_TEST);
+ /* be efficient--make teapot display list */
+ teapotList = gl.glGenLists(1);
+ gl.glNewList(teapotList, GL_COMPILE);
+ glut.glutSolidTeapot(1.0);
+ gl.glEndList();
+
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ if (width <= height)
+ gl.glOrtho
+ (0.0f,
+ 16.0f,
+ 0.0f,
+ 16.0f*(float)height/(float)width,
+ -10.0f,
+ 10.0f);
+ else
+ gl.glOrtho
+ (0.0f,
+ 16.0f*(float)width/(float)height,
+ 0.0f,
+ 16.0,
+ -10.0f,
+ 10.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ /**
+ * First column: emerald, jade, obsidian, pearl, ruby, turquoise
+ * 2nd column: brass, bronze, chrome, copper, gold, silver
+ * 3rd column: black, cyan, green, red, white, yellow plastic
+ * 4th column: black, cyan, green, red, white, yellow rubber
+ */
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ renderTeapot
+ (2.0f, 17.0f, 0.0215f, 0.1745f, 0.0215f,
+ 0.07568f, 0.61424f, 0.07568f, 0.633f, 0.727811f, 0.633f, 0.6f);
+ renderTeapot
+ (2.0f, 14.0f, 0.135f, 0.2225f, 0.1575f,
+ 0.54f, 0.89f, 0.63f, 0.316228f, 0.316228f, 0.316228f, 0.1f);
+ renderTeapot
+ (2.0f, 11.0f, 0.05375f, 0.05f, 0.06625f,
+ 0.18275f, 0.17f, 0.22525f, 0.332741f, 0.328634f, 0.346435f, 0.3f);
+ renderTeapot
+ (2.0f, 8.0f, 0.25f, 0.20725f, 0.20725f,
+ 1f, 0.829f, 0.829f, 0.296648f, 0.296648f, 0.296648f, 0.088f);
+ renderTeapot
+ (2.0f, 5.0f, 0.1745f, 0.01175f, 0.01175f,
+ 0.61424f, 0.04136f, 0.04136f, 0.727811f, 0.626959f, 0.626959f, 0.6f);
+ renderTeapot
+ (2.0f, 2.0f, 0.1f, 0.18725f, 0.1745f,
+ 0.396f, 0.74151f, 0.69102f, 0.297254f, 0.30829f, 0.306678f, 0.1f);
+ renderTeapot
+ (6.0f, 17.0f, 0.329412f, 0.223529f, 0.027451f,
+ 0.780392f, 0.568627f, 0.113725f, 0.992157f, 0.941176f, 0.807843f,
+ 0.21794872f);
+ renderTeapot
+ (6.0f, 14.0f, 0.2125f, 0.1275f, 0.054f,
+ 0.714f, 0.4284f, 0.18144f, 0.393548f, 0.271906f, 0.166721f, 0.2f);
+ renderTeapot
+ (6.0f, 11.0f, 0.25f, 0.25f, 0.25f,
+ 0.4f, 0.4f, 0.4f, 0.774597f, 0.774597f, 0.774597f, 0.6f);
+ renderTeapot
+ (6.0f, 8.0f, 0.19125f, 0.0735f, 0.0225f,
+ 0.7038f, 0.27048f, 0.0828f, 0.256777f, 0.137622f, 0.086014f, 0.1f);
+ renderTeapot
+ (6.0f, 5.0f, 0.24725f, 0.1995f, 0.0745f,
+ 0.75164f, 0.60648f, 0.22648f, 0.628281f, 0.555802f, 0.366065f, 0.4f);
+ renderTeapot
+ (6.0f, 2.0f, 0.19225f, 0.19225f, 0.19225f,
+ 0.50754f, 0.50754f, 0.50754f, 0.508273f, 0.508273f, 0.508273f, 0.4f);
+ renderTeapot
+ (10.0f, 17.0f, 0.0f, 0.0f, 0.0f, 0.01f, 0.01f, 0.01f,
+ 0.50f, 0.50f, 0.50f, .25f);
+ renderTeapot
+ (10.0f, 14.0f, 0.0f, 0.1f, 0.06f, 0.0f, 0.50980392f, 0.50980392f,
+ 0.50196078f, 0.50196078f, 0.50196078f, .25f);
+ renderTeapot
+ (10.0f, 11.0f, 0.0f, 0.0f, 0.0f,
+ 0.1f, 0.35f, 0.1f, 0.45f, 0.55f, 0.45f, .25f);
+ renderTeapot
+ (10.0f, 8.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f,
+ 0.7f, 0.6f, 0.6f, .25f);
+ renderTeapot
+ (10.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.55f, 0.55f, 0.55f,
+ 0.70f, 0.70f, 0.70f, .25f);
+ renderTeapot
+ (10.0f, 2.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.5f, 0.0f,
+ 0.60f, 0.60f, 0.50f, .25f);
+ renderTeapot
+ (14.0f, 17.0f, 0.02f, 0.02f, 0.02f, 0.01f, 0.01f, 0.01f,
+ 0.4f, 0.4f, 0.4f, .078125f);
+ renderTeapot
+ (14.0f, 14.0f, 0.0f, 0.05f, 0.05f, 0.4f, 0.5f, 0.5f,
+ 0.04f, 0.7f, 0.7f, .078125f);
+ renderTeapot
+ (14.0f, 11.0f, 0.0f, 0.05f, 0.0f, 0.4f, 0.5f, 0.4f,
+ 0.04f, 0.7f, 0.04f, .078125f);
+ renderTeapot
+ (14.0f, 8.0f, 0.05f, 0.0f, 0.0f, 0.5f, 0.4f, 0.4f,
+ 0.7f, 0.04f, 0.04f, .078125f);
+ renderTeapot
+ (14.0f, 5.0f, 0.05f, 0.05f, 0.05f, 0.5f, 0.5f, 0.5f,
+ 0.7f, 0.7f, 0.7f, .078125f);
+ renderTeapot
+ (14.0f, 2.0f, 0.05f, 0.05f, 0.0f, 0.5f, 0.5f, 0.4f,
+ 0.7f, 0.7f, 0.04f, .078125f);
+ gl.glFlush();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ /*
+ * Move object into position. Use 3rd through 12th
+ * parameters to specify the material property. Draw a teapot.
+ */
+ private void renderTeapot
+ (float x,
+ float y,
+ float ambr,
+ float ambg,
+ float ambb,
+ float difr,
+ float difg,
+ float difb,
+ float specr,
+ float specg,
+ float specb,
+ float shine)
+ {
+ float mat[] = new float[4];
+
+ gl.glPushMatrix();
+ gl.glTranslatef(x, y, 0.0f);
+ mat[0] = ambr; mat[1] = ambg; mat[2] = ambb; mat[3] = 1.0f;
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat);
+ mat[0] = difr; mat[1] = difg; mat[2] = difb;
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat);
+ mat[0] = specr; mat[1] = specg; mat[2] = specb;
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat);
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, shine * 128.0f);
+ gl.glCallList(teapotList);
+ gl.glPopMatrix();
+ }
+
+ }
+}
diff --git a/demos/MiscDemos/teapots_plugin13.html b/demos/MiscDemos/teapots_plugin13.html
new file mode 100644
index 0000000..19ee75d
--- /dev/null
+++ b/demos/MiscDemos/teapots_plugin13.html
@@ -0,0 +1,48 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Teapots by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "teapots.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "teapots.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "teapots.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "teapots.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/MiscDemos/tess.h b/demos/MiscDemos/tess.h
new file mode 100644
index 0000000..998c67b
--- /dev/null
+++ b/demos/MiscDemos/tess.h
@@ -0,0 +1,40 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class tess */
+
+#ifndef _Included_tess
+#define _Included_tess
+#ifdef __cplusplus
+extern "C" {
+#endif
+/* Inaccessible static: LOCK */
+#undef tess_assert
+#define tess_assert 0L
+/* Inaccessible static: isInc */
+/* Inaccessible static: incRate */
+#undef tess_TOP_ALIGNMENT
+#define tess_TOP_ALIGNMENT 0.0f
+#undef tess_CENTER_ALIGNMENT
+#define tess_CENTER_ALIGNMENT 0.5f
+#undef tess_BOTTOM_ALIGNMENT
+#define tess_BOTTOM_ALIGNMENT 1.0f
+#undef tess_LEFT_ALIGNMENT
+#define tess_LEFT_ALIGNMENT 0.0f
+#undef tess_RIGHT_ALIGNMENT
+#define tess_RIGHT_ALIGNMENT 1.0f
+#undef tess_serialVersionUID
+#define tess_serialVersionUID -7644114512714619750LL
+#undef tess_serialVersionUID
+#define tess_serialVersionUID 4613797578919906343LL
+/* Inaccessible static: nameCounter */
+#undef tess_serialVersionUID
+#define tess_serialVersionUID -2728009084054400034LL
+#undef tess_serialVersionUID
+#define tess_serialVersionUID -5836846270535785031LL
+/* Inaccessible static: rect */
+/* Inaccessible static: tri */
+/* Inaccessible static: star */
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/demos/MiscDemos/tess.html b/demos/MiscDemos/tess.html
new file mode 100644
index 0000000..e4496f7
--- /dev/null
+++ b/demos/MiscDemos/tess.html
@@ -0,0 +1,15 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Press the Right-Mouse Button for a Menu !
+<br>
+<hr>
+<applet code="tess.class" width=500 height=300>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
diff --git a/demos/MiscDemos/tess.java b/demos/MiscDemos/tess.java
new file mode 100644
index 0000000..2cf3a7a
--- /dev/null
+++ b/demos/MiscDemos/tess.java
@@ -0,0 +1,298 @@
+/*
+ * Copyright (c) 1993-1997, 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 adverti(float)Math.sing
+ * 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.227f.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227f-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(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+
+/*
+ * tess.c
+ * This program demonstrates polygon tessellation.
+ * Two tesselated objects are drawn. The first is a
+ * rectangle with a triangular hole. The second is a
+ * smooth shaded, self-intersecting star.
+ *
+ * Note the exterior rectangle is drawn with its vertices
+ * in counter-clockwise order, but its interior clockwise.
+ * Note the combineCallback is needed for the self-intersecting
+ * star. Also note that removing the TessProperty for the
+ * star will make the interior unshaded (WINDING_ODD).
+ */
+
+import gl4java.utils.glut.*;
+import gl4java.utils.glut.fonts.*;
+
+import gl4java.awt.*;
+import java.applet.*;
+import java.awt.*;
+import java.awt.Dimension;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import gl4java.*;
+
+public class tess extends Applet {
+
+ MyCanvas canvas = null;
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new MyCanvas (d.width, d.height);
+ add("Center", canvas);
+ }
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("tessdemo");
+
+ tess applet = new tess();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+ public void start()
+ {
+ }
+
+
+ public void stop()
+ {
+ }
+
+ public static double rect[/*4*/][/*3*/] =
+ {{50.0, 50.0, 0.0},
+ {200.0, 50.0, 0.0},
+ {200.0, 200.0f, 0.0},
+ {50.0, 200.0, 0.0}};
+ public static double tri[/*3*/][/*3*/] =
+ {{75.0, 75.0, 0.0},
+ {125.0, 175.0, 0.0},
+ {175.0, 75.0, 0.0}};
+
+ public static double star[/*5*/][/*6*/] =
+ {{250.0, 50.0, 0.0, 1.0, 0.0, 1.0},
+ {325.0, 200.0, 0.0, 1.0, 1.0, 0.0},
+ {400.0, 50.0, 0.0, 0.0, 1.0, 1.0},
+ {250.0, 150.0, 0.0, 1.0, 0.0, 0.0},
+ {400.0, 150.0, 0.0, 0.0, 1.0, 0.0}};
+
+ protected class MyCanvas extends GLCanvas
+ {
+ protected GLUTFunc glut = null;
+
+ int startList=-1;
+ boolean exit = false;
+
+ public MyCanvas(int w, int h) {
+ super(w,h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void init() {
+ int i;
+ glut = new GLUTFuncLightImplWithFonts(gl, glu);
+
+ int tobj;
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ startList = gl.glGenLists(2);
+
+ tobj = glu.gluNewTess();
+ glu.gluTessCallback ( tobj, GLU_TESS_VERTEX, gl,
+ "glVertex3dv", "([D)V",
+ 3, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_BEGIN, this,
+ "beginCallback", "(I)V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_END, this,
+ "endCallback", "()V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_ERROR, this,
+ "errorCallback", "(I)V",
+ 0, 0, 0, 0, 0);
+
+ /* rectangle with triangular hole inside */
+ gl.glNewList(startList, GL_COMPILE);
+ gl.glShadeModel(GL_FLAT);
+ glu.gluTessBeginPolygon(tobj, (double[])null);
+ glu.gluTessBeginContour(tobj);
+ glu.gluTessVertex(tobj, rect[0], rect[0]);
+ glu.gluTessVertex(tobj, rect[1], rect[1]);
+ glu.gluTessVertex(tobj, rect[2], rect[2]);
+ glu.gluTessVertex(tobj, rect[3], rect[3]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessBeginContour(tobj);
+ glu.gluTessVertex(tobj, tri[0], tri[0]);
+ glu.gluTessVertex(tobj, tri[1], tri[1]);
+ glu.gluTessVertex(tobj, tri[2], tri[2]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessEndPolygon(tobj);
+ gl.glEndList();
+
+ glu.gluTessCallback ( tobj, GLU_TESS_VERTEX, this,
+ "vertexCallback", "([D)V",
+ 6, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_BEGIN, this,
+ "beginCallback", "(I)V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_END, this,
+ "endCallback", "()V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_ERROR, this,
+ "errorCallback", "(I)V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_COMBINE, this,
+ "combineCallback", "([D[D[F[D)V",
+ 3, 4*6, 4, 6, 0);
+
+ /* smooth shaded, self-intersecting star */
+ gl.glNewList(startList + 1, GL_COMPILE);
+ gl.glShadeModel(GL_SMOOTH);
+ glu.gluTessProperty(tobj, GLU_TESS_WINDING_RULE,
+ GLU_TESS_WINDING_POSITIVE);
+ glu.gluTessBeginPolygon(tobj, (double[])null);
+ glu.gluTessBeginContour(tobj);
+ glu.gluTessVertex(tobj, star[0], star[0]);
+ glu.gluTessVertex(tobj, star[1], star[1]);
+ glu.gluTessVertex(tobj, star[2], star[2]);
+ glu.gluTessVertex(tobj, star[3], star[3]);
+ glu.gluTessVertex(tobj, star[4], star[4]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessEndPolygon(tobj);
+ gl.glEndList();
+
+ glu.gluDeleteTess(tobj);
+
+ reshape(getSize().width, getSize().height);
+
+ glj.gljCheckGL();
+ }
+
+ public void display()
+ {
+
+ if(exit) return;
+
+ /* Standard GL4Java Init */
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+ gl.glColor3f(1.0f, 1.0f, 1.0f);
+ gl.glCallList(startList);
+ gl.glCallList(startList + 1);
+
+ /* For your animation dutys ;-) */
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void beginCallback(int which)
+ {
+ gl.glBegin(which);
+ }
+
+ public void errorCallback(int errorCode)
+ {
+ String str;
+
+ gl.glColor3f( 0.9f, 0.9f, 0.9f );
+ gl.glRasterPos2i( 5, 5 );
+
+ str = glu.gluErrorString( errorCode );
+
+ glut.glutBitmapString(glut.GLUT_BITMAP_9_BY_15, str);
+ exit = true;
+ }
+
+ public void endCallback()
+ {
+ gl.glEnd();
+ }
+
+ public void vertexCallback(double[/*6*/] vertex)
+ {
+ double[] col = new double[3];
+ System.arraycopy(vertex, 3, col, 0, 3);
+
+ gl.glColor3dv(col);
+ gl.glVertex3dv(vertex);
+ }
+
+ /* combineCallback is used to create a new vertex when edges
+ * intersect. coordinate location is trivial to calculate,
+ * but weight[4] may be used to average color, normal, or texture
+ * coordinate data. In this program, color is weighted.
+ */
+ public void combineCallback(double coords[/*3*/],
+ double vertex_data[/*4x6*/],
+ float weight[/*4*/], double[/*6*/] dataOut )
+ {
+ int i;
+
+ dataOut[0] = coords[0];
+ dataOut[1] = coords[1];
+ dataOut[2] = coords[2];
+ for (i = 3; i < 6; i++)
+ dataOut[i] = weight[0] * vertex_data[0*6+i]
+ + weight[1] * vertex_data[1*6+i]
+ + weight[2] * vertex_data[2*6+i]
+ + weight[3] * vertex_data[3*6+i];
+ }
+
+ public void reshape(int w, int h)
+ {
+ gl.glViewport( 0, 0, w, h );
+
+ gl.glMatrixMode( GL_PROJECTION );
+ gl.glLoadIdentity();
+ glu.gluOrtho2D(0.0f, (double) w, 0.0f, (double) h);
+ }
+
+ }
+}
diff --git a/demos/MiscDemos/tess_plugin13.html b/demos/MiscDemos/tess_plugin13.html
new file mode 100644
index 0000000..d9b4bc1
--- /dev/null
+++ b/demos/MiscDemos/tess_plugin13.html
@@ -0,0 +1,47 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Press the Right-Mouse Button for a Menu !
+<br>
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 500 HEIGHT = 300 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "tess.class" WIDTH = 500 HEIGHT = 300 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "tess.class" WIDTH = 500 HEIGHT = 300></XMP>
+<PARAM NAME = CODE VALUE = "tess.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "tess.class" WIDTH = 500 HEIGHT = 300>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
diff --git a/demos/MiscDemos/tessdemo.html b/demos/MiscDemos/tessdemo.html
new file mode 100644
index 0000000..7e07e0b
--- /dev/null
+++ b/demos/MiscDemos/tessdemo.html
@@ -0,0 +1,15 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Press the Right-Mouse Button for a Menu !
+<br>
+<hr>
+<applet code="tessdemo.class" width=500 height=300>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
diff --git a/demos/MiscDemos/tessdemo.java b/demos/MiscDemos/tessdemo.java
new file mode 100755
index 0000000..899b27a
--- /dev/null
+++ b/demos/MiscDemos/tessdemo.java
@@ -0,0 +1,667 @@
+/* $Id$ */
+
+/*
+ * A demo of the GLU polygon tesselation functions written by Bogdan Sikorski.
+ * This demo isn't built by the Makefile because it needs GLUT. After you've
+ * installed GLUT you can try this demo.
+ * Here's the command for IRIX, for example:
+ cc -g -ansi -prototypes -fullwarn -float -I../include -DSHM tess_demo.c -L../lib -lglut -lMesaGLU -lMesaGL -lm -lX11 -lXext -lXmu -lfpe -lXext -o tess_demo
+ */
+
+/*
+ * Updated for GLU 1.3f tessellation by Gareth Hughes <[email protected]>
+ */
+
+/*
+ * $Log$
+ * Revision 1.1 2000/11/18 06:53:19 sven
+ * Initial revision
+ *
+ * Revision 1.3f.2.1f 1999/11/16 11:09:09 gareth
+ * Added combine callback. Converted vertices from ints to floats.
+ *
+ * Revision 1.3f 1999/11/04 04:00:42 gareth
+ * Updated demo for new GLU 1.3f tessellation. Added optimized rendering
+ * by saving the output of the tessellation into display lists.
+ *
+ * Revision 1.2f 1999/09/19 20:09:00 tanner
+ *
+ * lots of autoconf updates
+ *
+ * Revision 1.1f.1.1f 1999/08/19 00:55:40 jtg
+ * Imported sources
+ *
+ * Revision 3.5f 1999/03/28 18:24:37 brianp
+ * minor clean-up
+ *
+ * Revision 3.4f 1999/02/14 03:37:07 brianp
+ * fixed callback problem
+ *
+ * Revision 3.3f 1998/07/26 01:25:26 brianp
+ * removed include of gl.h and glu.h
+ *
+ * Revision 3.2f 1998/06/29 02:37:30 brianp
+ * minor changes for Windows (Ted Jump)
+ *
+ * Revision 3.1f 1998/06/09 01:53:49 brianp
+ * main() should return an int
+ *
+ * Revision 3.0f 1998/02/14 18:42:29 brianp
+ * initial rev
+ *
+ */
+
+
+import gl4java.utils.glut.*;
+import gl4java.utils.glut.fonts.*;
+import gl4java.utils.textures.*;
+
+import gl4java.awt.*;
+import java.applet.*;
+import java.awt.*;
+import java.awt.Dimension;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import gl4java.*;
+
+public class tessdemo extends Applet {
+
+ MyCanvas canvas = null;
+ boolean isAnApplet = true;
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new MyCanvas (d.width, d.height);
+ add("Center", canvas);
+ }
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("tessdemo");
+
+ tessdemo applet = new tessdemo();
+ applet.isAnApplet = false;
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+
+ System.out.println(applet.canvas.usage());
+ }
+
+ public void start()
+ {
+ }
+
+
+ public void stop()
+ {
+ }
+
+ static final int MAX_POINTS = 256;
+ static final int MAX_CONTOURS = 32;
+ static final int MAX_TRIANGLES = 256;
+ static final String MENU_DONE = "Done";
+ static final String MENU_TESS = "Tesselate";
+ static final String MENU_CLR = "Clear";
+ static final String MENU_SNAPSHOT = "Snapshot";
+ static final int MODE_DONE =0;
+ static final int MODE_CLR =1;
+ static final int MODE_DEFINE =2;
+ static final int MODE_TESSELATE =3;
+ static final int MODE_TESSELATED =4;
+
+ protected class Contour
+ {
+ float p[][];
+ int point_cnt;
+
+ public Contour()
+ {
+ p = new float[MAX_POINTS][2];
+ point_cnt = 0;
+ }
+ }
+
+ protected class Triangle
+ {
+ int no;
+ float p[][];
+ float color[][];
+
+ public Triangle()
+ {
+ no = 0;
+ p = new float[3][2];
+ color = new float[3][3];
+ }
+ }
+
+ protected class MyCanvas extends GLCanvas
+ implements MouseListener, ActionListener
+ {
+ protected GLUTFunc glut = null;
+
+
+ private PopupMenu menu = null;
+ private boolean menu_showing = false;
+
+ int contour_cnt;
+ int triangle_cnt;
+
+ int mode;
+
+ int list_start;
+
+ float edge_color[];
+
+ Contour contours[/*MAX_CONTOURS*/];
+
+ Triangle triangles[/*MAX_TRIANGLES*/];
+
+ TGATextureGrabber textgrab = null;
+
+ boolean doSnapshot=false;
+
+ public MyCanvas(int w, int h) {
+ super(w,h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void init() {
+ int i;
+ glut = new GLUTFuncLightImplWithFonts(gl, glu);
+ textgrab = new TGATextureGrabber(gl);
+ contours = new Contour[MAX_CONTOURS];
+ for(i=0; i<MAX_CONTOURS; i++)
+ contours[i] = new Contour();
+ triangles = new Triangle[MAX_TRIANGLES];
+ for(i=0; i<MAX_TRIANGLES; i++)
+ triangles[i] = new Triangle();
+ edge_color = new float[3];
+
+ /* clear background to gray */
+ gl.glClearColor( 0.4f, 0.4f, 0.4f, 0.0f );
+ gl.glShadeModel( GL_FLAT );
+ gl.glPolygonMode( GL_FRONT, GL_FILL );
+
+ contour_cnt = 0;
+ mode = MODE_DEFINE;
+
+ reshape(getSize().width, getSize().height);
+
+ glj.gljCheckGL();
+
+ menu = new PopupMenu("Options");
+ menu.add(MENU_DONE);
+ menu.add(MENU_TESS);
+ menu.add(MENU_CLR);
+ if(!isAnApplet)
+ menu.add(MENU_SNAPSHOT);
+ menu.addActionListener(this);
+ add(menu);
+
+ addMouseListener(this);
+ }
+
+
+ public void error_callback( int err )
+ {
+ String str;
+
+ gl.glColor3f( 0.9f, 0.9f, 0.9f );
+ gl.glRasterPos2i( 5, 5 );
+
+ str = glu.gluErrorString( err );
+
+ glut.glutBitmapString(glut.GLUT_BITMAP_9_BY_15, str);
+ }
+
+ public void begin_callback( int mode )
+ {
+ /* Allow multiple triangles to be output inside the begin/end pair. */
+ triangle_cnt = 0;
+ triangles[triangle_cnt].no = 0;
+ }
+
+ public void edge_callback( boolean flag )
+ {
+ /* Persist the edge flag across triangles. */
+ if ( flag == GL_TRUE )
+ {
+ edge_color[0] = 1.0f;
+ edge_color[1] = 1.0f;
+ edge_color[2] = 0.5f;
+ }
+ else
+ {
+ edge_color[0] = 1.0f;
+ edge_color[1] = 0.0f;
+ edge_color[2] = 0.0f;
+ }
+ }
+
+ public void end_callback()
+ {
+ int i;
+
+ gl.glBegin( GL_LINES );
+
+ /* Output the three edges of each triangle as lines colored
+ according to their edge flag. */
+ for ( i = 0 ; i < triangle_cnt ; i++ )
+ {
+ gl.glColor3f( triangles[i].color[0][0],
+ triangles[i].color[0][1],
+ triangles[i].color[0][2] );
+
+ gl.glVertex2f( triangles[i].p[0][0], triangles[i].p[0][1] );
+ gl.glVertex2f( triangles[i].p[1][0], triangles[i].p[1][1] );
+
+ gl.glColor3f( triangles[i].color[1][0],
+ triangles[i].color[1][1],
+ triangles[i].color[1][2] );
+
+ gl.glVertex2f( triangles[i].p[1][0], triangles[i].p[1][1] );
+ gl.glVertex2f( triangles[i].p[2][0], triangles[i].p[2][1] );
+
+ gl.glColor3f( triangles[i].color[2][0],
+ triangles[i].color[2][1],
+ triangles[i].color[2][2] );
+
+ gl.glVertex2f( triangles[i].p[2][0], triangles[i].p[2][1] );
+ gl.glVertex2f( triangles[i].p[0][0], triangles[i].p[0][1] );
+ }
+
+ gl.glEnd();
+ }
+
+ public void vertex_callback( float[/*2*/] data )
+ {
+ int no;
+
+ no = triangles[triangle_cnt].no;
+
+ triangles[triangle_cnt].p[no][0] = data[0];
+ triangles[triangle_cnt].p[no][1] = data[1];
+
+ triangles[triangle_cnt].color[no][0] = edge_color[0];
+ triangles[triangle_cnt].color[no][1] = edge_color[1];
+ triangles[triangle_cnt].color[no][2] = edge_color[2];
+
+ /* After every three vertices, initialize the next triangle. */
+ if ( ++(triangles[triangle_cnt].no) == 3 )
+ {
+ triangle_cnt++;
+ triangles[triangle_cnt].no = 0;
+ }
+ }
+
+ public void combine_callback( double coords[/*3*/],
+ double vertex_data[/*4xn(=0)*/],
+ float weight[/*4*/], float[/*m(=2)*/] data )
+ {
+ data[0] = (float) coords[0];
+ data[1] = (float) coords[1];
+ }
+
+ public void tesse( )
+ {
+ int tobj;
+ double data[] = new double[3];
+ int i, j, point_cnt;
+
+ list_start = gl.glGenLists( 2 );
+
+ tobj = glu.gluNewTess();
+
+ if ( tobj != 0 )
+ {
+ glu.gluTessCallback ( tobj, GLU_TESS_BEGIN, gl,
+ "glBegin", "(I)V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_VERTEX, gl,
+ "glVertex2fv", "([F)V",
+ 2, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_END, gl,
+ "glEnd", "()V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_ERROR, this,
+ "error_callback", "(I)V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_COMBINE, this,
+ "combine_callback", "([D[D[F[F)V",
+ 2, 0, 0, 2, 0);
+
+ gl.glNewList( list_start, GL_COMPILE );
+ glu.gluBeginPolygon( tobj );
+
+ for ( j = 0 ; j <= contour_cnt ; j++ )
+ {
+ point_cnt = contours[j].point_cnt;
+ glu.gluNextContour( tobj, GLU_UNKNOWN );
+
+ for ( i = 0 ; i < point_cnt ; i++ )
+ {
+ data[0] = (double)( contours[j].p[i][0] );
+ data[1] = (double)( contours[j].p[i][1] );
+ data[2] = 0.0;
+ glu.gluTessVertex( tobj, data, contours[j].p[i] );
+ }
+ }
+
+ glu.gluEndPolygon( tobj );
+ gl.glEndList();
+
+ glu.gluTessCallback ( tobj, GLU_TESS_BEGIN, this,
+ "begin_callback", "(I)V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_VERTEX, this,
+ "vertex_callback", "([F)V",
+ 2, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_END, this,
+ "end_callback", "()V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_EDGE_FLAG, this,
+ "edge_callback", "(Z)V",
+ 0, 0, 0, 0, 0);
+
+ gl.glNewList( list_start + 1, GL_COMPILE );
+ glu.gluBeginPolygon( tobj );
+
+ for ( j = 0 ; j <= contour_cnt ; j++ )
+ {
+ point_cnt = contours[j].point_cnt;
+ glu.gluNextContour( tobj, GLU_UNKNOWN );
+
+ for ( i = 0 ; i < point_cnt ; i++ )
+ {
+ data[0] = (double)( contours[j].p[i][0] );
+ data[1] = (double)( contours[j].p[i][1] );
+ data[2] = 0.0f;
+ glu.gluTessVertex( tobj, data, contours[j].p[i] );
+ }
+ }
+
+ glu.gluEndPolygon( tobj );
+ gl.glEndList();
+
+ glu.gluDeleteTess( tobj );
+ }
+ }
+
+ public void mouseClicked(MouseEvent evt)
+ {
+ if(mode != MODE_DEFINE)
+ return;
+
+ int x1 = evt.getX();
+ int y1 = evt.getY();
+ x1 -= x1%10;
+ y1 -= y1%10;
+
+ float[] P = new float[2];
+ int point_cnt;
+
+ /* translate GLUT into GL coordinates */
+
+ P[0] = x1;
+ P[1] = getSize().height -y1;
+
+ point_cnt = contours[contour_cnt].point_cnt;
+
+ contours[contour_cnt].p[point_cnt][0] = P[0];
+ contours[contour_cnt].p[point_cnt][1] = P[1];
+
+ contours[contour_cnt].point_cnt++;
+ repaint();
+ }
+
+ public void donePlaceing()
+ {
+ int point_cnt;
+
+ point_cnt = contours[contour_cnt].point_cnt;
+
+ if ( point_cnt > 2 )
+ {
+ /*
+ gl.glBegin( GL_LINES );
+
+ gl.glVertex2fv( contours[contour_cnt].p[0] );
+ gl.glVertex2fv( contours[contour_cnt].p[point_cnt-1] );
+
+ gl.glEnd();
+ */
+ contours[contour_cnt].p[point_cnt][0] = -1;
+
+ contour_cnt++;
+ contours[contour_cnt].point_cnt = 0;
+ }
+ }
+
+ public void display()
+ {
+
+ /* Standard GL4Java Init */
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ int i,j;
+ int point_cnt;
+
+ gl.glClear( GL_COLOR_BUFFER_BIT );
+
+ switch ( mode )
+ {
+ case MODE_DONE:
+ mode=MODE_DEFINE;
+ donePlaceing();
+ repaint();
+ break;
+
+ case MODE_CLR:
+ mode=MODE_DEFINE;
+ clear();
+ repaint();
+ break;
+
+ case MODE_DEFINE:
+ /* draw grid */
+ gl.glColor3f( 0.6f, 0.5f, 0.5f );
+
+ gl.glBegin( GL_LINES );
+
+ int width = getSize().width;
+ int height = getSize().height;
+ for ( i = 0 ; i < width ; i += 10 )
+ {
+ for ( j = 0 ; j < height ; j += 10 )
+ {
+ gl.glVertex2i( 0, j );
+ gl.glVertex2i( width, j );
+ gl.glVertex2i( i, height );
+ gl.glVertex2i( i, 0 );
+ }
+ }
+
+ gl.glEnd( );
+
+ gl.glColor3f( 1.0f, 1.0f, 0.0f );
+
+ for ( i = 0 ; i <= contour_cnt ; i++ )
+ {
+ point_cnt = contours[i].point_cnt;
+
+ gl.glBegin( GL_LINES );
+
+ switch ( point_cnt )
+ {
+ case 0:
+ break;
+ case 1:
+ gl.glVertex2fv( contours[i].p[0] );
+ gl.glVertex2fv( contours[i].p[0] );
+ break;
+ case 2:
+ gl.glVertex2fv( contours[i].p[0] );
+ gl.glVertex2fv( contours[i].p[1] );
+ break;
+ default:
+ --point_cnt;
+ for ( j = 0 ; j < point_cnt ; j++ )
+ {
+ gl.glVertex2fv( contours[i].p[j] );
+ gl.glVertex2fv( contours[i].p[j+1] );
+ }
+ if ( contours[i].p[j+1][0] == -1 )
+ {
+ gl.glVertex2fv( contours[i].p[0] );
+ gl.glVertex2fv( contours[i].p[j] );
+ }
+ break;
+ }
+
+ gl.glEnd();
+ }
+
+ // gl.glFinish();
+ break;
+
+ case MODE_TESSELATE:
+ mode=MODE_TESSELATED;
+ tesse();
+ glj.gljCheckGL();
+ repaint();
+ break;
+
+ case MODE_TESSELATED:
+ /* draw triangles */
+ gl.glColor3f( 0.7f, 0.7f, 0.0f );
+ gl.glCallList( list_start );
+
+ gl.glLineWidth( 2.0f );
+ gl.glCallList( list_start + 1 );
+ gl.glLineWidth( 1.0f );
+
+ // gl.glFlush();
+ glj.gljCheckGL();
+ break;
+ }
+
+ gl.glColor3f( 1.0f, 1.0f, 0.0f );
+
+ if(!isAnApplet && doSnapshot)
+ {
+ doSnapshot=false;
+ textgrab.grabPixels(GL_BACK,
+ 0, 0, cvsGetWidth(), cvsGetHeight());
+ textgrab.write2File("tessdemo.tga");
+ }
+ /* For your animation dutys ;-) */
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void clear( )
+ {
+ contour_cnt = 0;
+ contours[0].point_cnt = 0;
+ triangle_cnt = 0;
+
+ gl.glDeleteLists( list_start, 2 );
+ list_start = 0;
+ }
+
+ public void reshape(int w, int h)
+ {
+ gl.glViewport( 0, 0, w, h );
+
+ gl.glMatrixMode( GL_PROJECTION );
+ gl.glLoadIdentity();
+ gl.glOrtho( 0.0, (double)w, 0.0, (double)h, -1.0, 1.0 );
+
+ gl.glMatrixMode( GL_MODELVIEW );
+ gl.glLoadIdentity();
+ }
+
+
+ public String usage( )
+ {
+ return "Use left mouse button to place vertices.\n" +
+ "Select done from the pop-up menu,\n"+
+ "if you are done with placing vertices.\n"+
+ "Select tesselate from the pop-up menu.\n";
+ }
+
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered(MouseEvent evt)
+ {
+ }
+
+ public void mouseExited(MouseEvent evt)
+ {
+ }
+
+ public void mousePressed(MouseEvent evt)
+ {
+ if (!menu_showing)
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ menu_showing = true;
+ menu.show(this,evt.getX(),evt.getY());
+ }
+ }
+ else
+ {
+ menu_showing = false;
+ }
+ }
+
+ public void mouseReleased(MouseEvent evt)
+ {
+ }
+
+ // Method required for the implementation of ActionListener
+ public void actionPerformed(ActionEvent evt)
+ {
+ String c = evt.getActionCommand();
+ if (c.equals(MENU_TESS))
+ {
+ mode=MODE_TESSELATE;
+ }
+ else if (c.equals(MENU_CLR))
+ {
+ mode=MODE_CLR;
+ }
+ else if (c.equals(MENU_DONE))
+ {
+ mode=MODE_DONE;
+ }
+ else if (c.equals(MENU_SNAPSHOT))
+ {
+ doSnapshot=true;
+ }
+ if (menu_showing)
+ {
+ menu_showing = false;
+ }
+ repaint();
+ }
+ }
+}
diff --git a/demos/MiscDemos/tessdemo_plugin13.html b/demos/MiscDemos/tessdemo_plugin13.html
new file mode 100644
index 0000000..27e69b2
--- /dev/null
+++ b/demos/MiscDemos/tessdemo_plugin13.html
@@ -0,0 +1,47 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Press the Right-Mouse Button for a Menu !
+<br>
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 500 HEIGHT = 300 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "tessdemo.class" WIDTH = 500 HEIGHT = 300 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "tessdemo.class" WIDTH = 500 HEIGHT = 300></XMP>
+<PARAM NAME = CODE VALUE = "tessdemo.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "tessdemo.class" WIDTH = 500 HEIGHT = 300>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
diff --git a/demos/MiscDemos/tesswind.html b/demos/MiscDemos/tesswind.html
new file mode 100644
index 0000000..cafaf27
--- /dev/null
+++ b/demos/MiscDemos/tesswind.html
@@ -0,0 +1,15 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Press the Right-Mouse Button for a Menu !
+<br>
+<hr>
+<applet code="tesswind.class" width=500 height=500>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
diff --git a/demos/MiscDemos/tesswind.java b/demos/MiscDemos/tesswind.java
new file mode 100755
index 0000000..b25ca42
--- /dev/null
+++ b/demos/MiscDemos/tesswind.java
@@ -0,0 +1,464 @@
+/*
+ * Copyright (c) 1993-1997, 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 adverti(float)Math.sing
+ * 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.227f.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227f-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(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+
+/*
+ * tesswind.c
+ * This program demonstrates the winding rule polygon
+ * tessellation property. Four tessellated objects are drawn,
+ * each with very different contours. When the w key is pressed,
+ * the objects are drawn with a different winding rule.
+ */
+import gl4java.utils.glut.*;
+import gl4java.utils.glut.fonts.*;
+import gl4java.utils.textures.*;
+
+import gl4java.awt.*;
+import java.applet.*;
+import java.awt.*;
+import java.awt.Dimension;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import gl4java.*;
+
+public class tesswind extends Applet {
+
+ MyCanvas canvas = null;
+ boolean isAnApplet = true;
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new MyCanvas (d.width, d.height);
+ add("Center", canvas);
+ }
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("tessdemo");
+
+ tesswind applet = new tesswind();
+ applet.isAnApplet = false;
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+ public void start()
+ {
+ }
+
+
+ public void stop()
+ {
+ }
+
+ static final String MENU_1 = "Odd Winding";
+ static final String MENU_2 = "Nonzero Winding";
+ static final String MENU_3 = "Positive Winding";
+ static final String MENU_4 = "Negative Winding";
+ static final String MENU_5 = "ABS >= 2 Winding";
+ static final String MENU_SNAPSHOT = "Snapshot";
+
+ public static double rects[/*12*/][/*3*/] =
+ { { 50.0, 50.0, 0.0},
+ { 300.0, 50.0, 0.0},
+ { 300.0, 300.0, 0.0},
+ { 50.0, 300.0, 0.0},
+ { 100.0, 100.0, 0.0},
+ { 250.0, 100.0, 0.0},
+ { 250.0, 250.0, 0.0},
+ { 100.0, 250.0, 0.0},
+ { 150.0, 150.0, 0.0},
+ { 200.0, 150.0, 0.0},
+ { 200.0, 200.0, 0.0},
+ { 150.0, 200.0, 0.0} };
+
+ public static double spiral[/*16*/][/*3*/] =
+ { { 400.0, 250.0, 0.0},
+ { 400.0, 50.0, 0.0},
+ { 50.0, 50.0, 0.0},
+ { 50.0, 400.0, 0.0},
+ { 350.0, 400.0, 0.0},
+ { 350.0, 100.0, 0.0},
+ { 100.0, 100.0, 0.0},
+ { 100.0, 350.0, 0.0},
+ { 300.0, 350.0, 0.0},
+ { 300.0, 150.0, 0.0},
+ { 150.0, 150.0, 0.0},
+ { 150.0, 300.0, 0.0},
+ { 250.0, 300.0, 0.0},
+ { 250.0, 200.0, 0.0},
+ { 200.0, 200.0, 0.0},
+ { 200.0, 250.0, 0.0} };
+
+ public static double quad1[/*4*/][/*3*/] =
+ { {50.0, 150.0, 0.0},
+ {350.0, 150.0, 0.0},
+ {350.0, 200.0, 0.0},
+ {50.0, 200.0, 0.0} };
+
+ public static double quad2[/*4*/][/*3*/] =
+ { {100.0, 100.0, 0.0},
+ {300.0, 100.0, 0.0},
+ {300.0, 350.0, 0.0},
+ {100.0, 350.0, 0.0} };
+
+ public static double tri[/*3*/][/*3*/] =
+ { {200.0, 50.0, 0.0},
+ {250.0, 300.0, 0.0},
+ {150.0, 300.0, 0.0} };
+
+ protected class MyCanvas extends GLCanvas
+ implements MouseListener, ActionListener
+ {
+ protected GLUTFunc glut = null;
+
+ boolean exit = false;
+ boolean mkNewLists = false;
+
+ int startList=-1;
+
+ private PopupMenu menu = null;
+ private boolean menu_showing = false;
+
+ TGATextureGrabber textgrab = null;
+
+ boolean doSnapshot=false;
+
+ public MyCanvas(int w, int h) {
+ super(w,h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ double currentWinding = GLU_TESS_WINDING_ODD;
+ int currentShape = 0;
+ int tobj;
+ int list;
+
+ public void init() {
+ int i;
+ glut = new GLUTFuncLightImplWithFonts(gl, glu);
+
+ textgrab = new TGATextureGrabber(gl);
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ gl.glShadeModel(GL_FLAT);
+
+ tobj = glu.gluNewTess();
+
+ glu.gluTessCallback ( tobj, GLU_TESS_VERTEX, gl,
+ "glVertex3dv", "([D)V",
+ 3, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_BEGIN, this,
+ "beginCallback", "(I)V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_END, this,
+ "endCallback", "()V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_ERROR, this,
+ "errorCallback", "(I)V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_COMBINE, this,
+ "combineCallback", "([D[D[F[D)V",
+ 3, 0, 0, 3, 0);
+
+
+ list = gl.glGenLists(4);
+ makeNewLists();
+
+ reshape(getSize().width, getSize().height);
+
+ glj.gljCheckGL();
+
+ menu = new PopupMenu("Options");
+ menu.add(MENU_1);
+ menu.add(MENU_2);
+ menu.add(MENU_3);
+ menu.add(MENU_4);
+ menu.add(MENU_5);
+ if(!isAnApplet)
+ menu.add(MENU_SNAPSHOT);
+ menu.addActionListener(this);
+ add(menu);
+ addMouseListener(this);
+ }
+
+
+ /* Make four display lists,
+ * each with a different tessellated object.
+ */
+ void makeNewLists ()
+ {
+ int i;
+ glu.gluTessProperty(tobj, GLU_TESS_WINDING_RULE,
+ currentWinding);
+
+ gl.glNewList(list, GL_COMPILE);
+ glu.gluTessBeginPolygon(tobj, (double[])null);
+ glu.gluTessBeginContour(tobj);
+ for (i = 0; i < 4; i++)
+ glu.gluTessVertex(tobj, rects[i], rects[i]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessBeginContour(tobj);
+ for (i = 4; i < 8; i++)
+ glu.gluTessVertex(tobj, rects[i], rects[i]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessBeginContour(tobj);
+ for (i = 8; i < 12; i++)
+ glu.gluTessVertex(tobj, rects[i], rects[i]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessEndPolygon(tobj);
+ gl.glEndList();
+
+ gl.glNewList(list+1, GL_COMPILE);
+ glu.gluTessBeginPolygon(tobj, (double[])null);
+ glu.gluTessBeginContour(tobj);
+ for (i = 0; i < 4; i++)
+ glu.gluTessVertex(tobj, rects[i], rects[i]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessBeginContour(tobj);
+ for (i = 7; i >= 4; i--)
+ glu.gluTessVertex(tobj, rects[i], rects[i]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessBeginContour(tobj);
+ for (i = 11; i >= 8; i--)
+ glu.gluTessVertex(tobj, rects[i], rects[i]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessEndPolygon(tobj);
+ gl.glEndList();
+
+ gl.glNewList(list+2, GL_COMPILE);
+ glu.gluTessBeginPolygon(tobj, (double[])null);
+ glu.gluTessBeginContour(tobj);
+ for (i = 0; i < 16; i++)
+ glu.gluTessVertex(tobj, spiral[i], spiral[i]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessEndPolygon(tobj);
+ gl.glEndList();
+
+ gl.glNewList(list+3, GL_COMPILE);
+ glu.gluTessBeginPolygon(tobj, (double[])null);
+ glu.gluTessBeginContour(tobj);
+ for (i = 0; i < 4; i++)
+ glu.gluTessVertex(tobj, quad1[i], quad1[i]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessBeginContour(tobj);
+ for (i = 0; i < 4; i++)
+ glu.gluTessVertex(tobj, quad2[i], quad2[i]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessBeginContour(tobj);
+ for (i = 0; i < 3; i++)
+ glu.gluTessVertex(tobj, tri[i], tri[i]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessEndPolygon(tobj);
+ gl.glEndList();
+ }
+
+ public void display()
+ {
+
+ if(exit) return;
+
+ /* Standard GL4Java Init */
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ if(mkNewLists)
+ {
+ makeNewLists();
+ mkNewLists = false;
+ }
+
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+ gl.glColor3f(1.0f, 1.0f, 1.0f);
+ gl.glPushMatrix();
+ gl.glCallList(list);
+ gl.glTranslatef(0.0f, 500.0f, 0.0f);
+ gl.glCallList(list+1);
+ gl.glTranslatef(500.0f, -500.0f, 0.0f);
+ gl.glCallList(list+2);
+ gl.glTranslatef(0.0f, 500.0f, 0.0f);
+ gl.glCallList(list+3);
+ gl.glPopMatrix();
+
+ if(!isAnApplet && doSnapshot)
+ {
+ doSnapshot=false;
+ textgrab.grabPixels(GL_BACK,
+ 0, 0, cvsGetWidth(), cvsGetHeight());
+ textgrab.write2File("tesswind.tga");
+ }
+
+ /* For your animation dutys ;-) */
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void beginCallback(int which)
+ {
+ gl.glBegin(which);
+ }
+
+ public void errorCallback(int errorCode)
+ {
+ String str;
+
+ gl.glColor3f( 0.9f, 0.9f, 0.9f );
+ gl.glRasterPos2i( 5, 5 );
+
+ str = glu.gluErrorString( errorCode );
+
+ glut.glutBitmapString(glut.GLUT_BITMAP_9_BY_15, str);
+ exit = true;
+ }
+
+ public void endCallback()
+ {
+ gl.glEnd();
+ }
+
+ /* combineCallback is used to create a new vertex when edges
+ * intersect. coordinate location is trivial to calculate,
+ * but weight[4] may be used to average color, normal, or texture
+ * coordinate data.
+ */
+ /* ARGSUSED */
+ public void combineCallback(double coords[/*3*/], double data[/*4xn*/],
+ float weight[/*4*/], double[/*3*/] dataOut )
+ {
+ dataOut[0] = coords[0];
+ dataOut[1] = coords[1];
+ dataOut[2] = coords[2];
+ }
+
+ public void reshape(int w, int h)
+ {
+ gl.glViewport( 0, 0, w, h );
+
+ gl.glMatrixMode( GL_PROJECTION );
+ gl.glLoadIdentity();
+ if (w <= h)
+ glu.gluOrtho2D(0.0f, 1000.0f, 0.0f, 1000.0f * (double)h/(double)w);
+ else
+ glu.gluOrtho2D(0.0f, 1000.0f * (double)w/(double)h, 0.0f, 1000.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered(MouseEvent evt)
+ {
+ }
+
+ public void mouseExited(MouseEvent evt)
+ {
+ }
+
+ public void mousePressed(MouseEvent evt)
+ {
+ if (!menu_showing)
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ menu_showing = true;
+ menu.show(this,evt.getX(),evt.getY());
+ }
+ }
+ else
+ {
+ menu_showing = false;
+ }
+ }
+
+ public void mouseClicked(MouseEvent evt)
+ {
+ }
+
+ public void mouseReleased(MouseEvent evt)
+ {
+ }
+
+ // Method required for the implementation of ActionListener
+ public void actionPerformed(ActionEvent evt)
+ {
+ String c = evt.getActionCommand();
+ if (c.equals(MENU_1))
+ {
+ currentWinding = GLU_TESS_WINDING_ODD;
+ }
+ else if (c.equals(MENU_2))
+ {
+ currentWinding = GLU_TESS_WINDING_NONZERO;
+ }
+ else if (c.equals(MENU_3))
+ {
+ currentWinding = GLU_TESS_WINDING_POSITIVE;
+ }
+ else if (c.equals(MENU_4))
+ {
+ currentWinding = GLU_TESS_WINDING_NEGATIVE;
+ }
+ else if (c.equals(MENU_5))
+ {
+ currentWinding = GLU_TESS_WINDING_ABS_GEQ_TWO;
+ }
+ else if (c.equals(MENU_SNAPSHOT))
+ {
+ doSnapshot=true;
+ }
+ if (menu_showing)
+ {
+ menu_showing = false;
+ }
+ mkNewLists = true;
+ repaint();
+ }
+ }
+}
diff --git a/demos/MiscDemos/tesswind_plugin13.html b/demos/MiscDemos/tesswind_plugin13.html
new file mode 100644
index 0000000..0786232
--- /dev/null
+++ b/demos/MiscDemos/tesswind_plugin13.html
@@ -0,0 +1,47 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Press the Right-Mouse Button for a Menu !
+<br>
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 500 HEIGHT = 500 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "tesswind.class" WIDTH = 500 HEIGHT = 500 frames = "55" scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "tesswind.class" WIDTH = 500 HEIGHT = 500></XMP>
+<PARAM NAME = CODE VALUE = "tesswind.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "tesswind.class" WIDTH = 500 HEIGHT = 500>
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
diff --git a/demos/MiscDemos/tex/DAISYX.png b/demos/MiscDemos/tex/DAISYX.png
new file mode 100644
index 0000000..4892a0b
--- /dev/null
+++ b/demos/MiscDemos/tex/DAISYX.png
Binary files differ
diff --git a/demos/MiscDemos/tex/a.tga b/demos/MiscDemos/tex/a.tga
new file mode 100644
index 0000000..2bbd4d5
--- /dev/null
+++ b/demos/MiscDemos/tex/a.tga
Binary files differ
diff --git a/demos/MiscDemos/tex/gleeson_head.jpg b/demos/MiscDemos/tex/gleeson_head.jpg
new file mode 100644
index 0000000..354cd2f
--- /dev/null
+++ b/demos/MiscDemos/tex/gleeson_head.jpg
Binary files differ
diff --git a/demos/MiscDemos/tex/gnu-head-sm.png b/demos/MiscDemos/tex/gnu-head-sm.png
new file mode 100755
index 0000000..fc91ff9
--- /dev/null
+++ b/demos/MiscDemos/tex/gnu-head-sm.png
Binary files differ
diff --git a/demos/MiscDemos/tex/jaulogo-300x80.png b/demos/MiscDemos/tex/jaulogo-300x80.png
new file mode 100755
index 0000000..4ed48f3
--- /dev/null
+++ b/demos/MiscDemos/tex/jaulogo-300x80.png
Binary files differ
diff --git a/demos/RectRenderSpeed/GL4JCanvas.java b/demos/RectRenderSpeed/GL4JCanvas.java
new file mode 100644
index 0000000..7366ee0
--- /dev/null
+++ b/demos/RectRenderSpeed/GL4JCanvas.java
@@ -0,0 +1,674 @@
+
+import java.io.*;
+
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+//----------------------------------------------
+// class definition.
+//----------------------------------------------
+public class GL4JCanvas extends gl4java.awt.GLCanvas
+{
+ private int _canvas_wid_pix;
+ private int _canvas_hei_pix;
+ private int _num_colors = 50;
+ private boolean refresh_gl = false;
+
+//----------------------------------------------
+// method constructor.
+//----------------------------------------------
+public GL4JCanvas (int wid_pix, int hei_pix)
+{
+ super (wid_pix, hei_pix);
+
+ _canvas_wid_pix = wid_pix;
+ _canvas_hei_pix = hei_pix;
+
+}
+//----------------------------------------------
+// method preInit
+//----------------------------------------------
+public void preInit ()
+{
+ stereoView = false;
+}
+
+public void preSetDblBuffer(boolean dblBuffer)
+{
+ doubleBuffer = dblBuffer;
+}
+
+//----------------------------------------------
+// method init
+//----------------------------------------------
+public void init ()
+{
+}
+//----------------------------------------------
+// method display
+//----------------------------------------------
+public void display ()
+{
+ boolean loc_err;
+
+ loc_err = false;
+
+ if(scripting_modes_number>0)
+ {
+ int i;
+ for (i=0; i<scripting_modes_number; i++)
+ {
+ System.out.println("trying mode: "+scripting_modes[i]);
+ if(setRenderMode(scripting_modes[i])==false)
+ {
+ System.out.println("render mode: "+scripting_modes[i]+" not supported !");
+ continue;
+ }
+ gl_display();
+ }
+ cvsDispose();
+ System.exit(0);
+ }
+
+ if(refresh_gl)
+ {
+ refresh_gl = false;
+ gl_display ();
+ }
+}
+
+public void setRefreshGL(boolean b)
+{
+ refresh_gl = b;
+}
+
+
+public void printTimeDelta(long startTime, int count)
+{
+ long t1 = System.currentTimeMillis ();
+ System.out.println ("... elapsed time: "
+ +((double)(t1-startTime)/1000.0)+" Sec");
+ if(count>0)
+ System.out.println ("... rate: "
+ +(((double)(t1-startTime))*(1000.0/(double)count))
+ +" SPMR (Sec Per Million Rectangles)");
+}
+
+public double getTimeDeltaSecs(long startTime)
+{
+ long t1 = System.currentTimeMillis ();
+ return (double)(t1-startTime)/1000.0;
+}
+
+public static final String modes = new String (
+ " 0 - Immediate + FLAT + ColorIndex + glRect\n"+
+ " 1 - Immediate + FLAT + ColorIndex + glRectiv\n"+
+ " 2 - Immediate + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2);\n"+
+ " 3 - Immediate + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2);\n"+
+ " 10 - Immediate + FLAT + RGB + glRect\n"+
+ " 11 - Immediate + FLAT + RGB + glRectiv\n"+
+ " 12 - Immediate + FLAT + RGB + POLYGON + glVertex2i(x2,y2);\n"+
+ " 13 - Immediate + FLAT + RGB + QUADS + glVertex2i(x2,y2);\n"+
+ " 20 - Immediate + SMOOTH + ColorIndex + glRect\n"+
+ " 21 - Immediate + SMOOTH + ColorIndex + glRectiv\n"+
+ " 22 - Immediate + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2);\n"+
+ " 23 - Immediate + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2);\n"+
+ " 30 - Immediate + SMOOTH + RGB + glRect\n"+
+ " 31 - Immediate + SMOOTH + RGB + glRectiv\n"+
+ " 32 - Immediate + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2);\n"+
+ " 33 - Immediate + SMOOTH + RGB + QUADS + glVertex2i(x2,y2);\n"+
+ "100 - COMPILED + FLAT + ColorIndex + glRect\n"+
+ "101 - COMPILED + FLAT + ColorIndex + glRectiv\n"+
+ "102 - COMPILED + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2);\n"+
+ "103 - COMPILED + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2);\n"+
+ "110 - COMPILED + FLAT + RGB + glRect\n"+
+ "111 - COMPILED + FLAT + RGB + glRectiv\n"+
+ "112 - COMPILED + FLAT + RGB + POLYGON + glVertex2i(x2,y2);\n"+
+ "113 - COMPILED + FLAT + RGB + QUADS + glVertex2i(x2,y2);\n"+
+ "120 - COMPILED + SMOOTH + ColorIndex + glRect\n"+
+ "121 - COMPILED + SMOOTH + ColorIndex + glRectiv\n"+
+ "122 - COMPILED + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2);\n"+
+ "123 - COMPILED + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2);\n"+
+ "130 - COMPILED + SMOOTH + RGB + glRect\n"+
+ "131 - COMPILED + SMOOTH + RGB + glRectiv\n"+
+ "132 - COMPILED + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2);\n"+
+ "133 - COMPILED + SMOOTH + RGB + GL_QUADS+ glVertex2i(x2,y2);\n"+
+ "\n" );
+
+public boolean useDisplayList = false;
+public boolean useSmoothShading = false;
+public boolean useRGB = false;
+
+public int[] scripting_modes = null;
+public int scripting_modes_number = 0;
+
+public void setScriptModes(int[] modes, int len)
+{
+ scripting_modes=modes;
+ scripting_modes_number=len;
+}
+
+/**
+ * renderMode
+ * 0 - glRect
+ * 1 - glRectiv
+ * 2 - POLYGON + glVertex2i
+ * 3 - QUADS + glVertex2i
+ */
+public int renderMode = 0;
+
+public int dez_mode = 0;
+
+public boolean setRenderMode(int mode)
+{
+ useDisplayList = false;
+ useSmoothShading = false;
+ useRGB = false;
+ renderMode = 0;
+
+ if(mode>133 || mode<0)
+ return false;
+
+ dez_mode=mode;
+
+ if(mode>=100)
+ {
+ useDisplayList=true;
+ mode -= 100;
+ }
+
+ if(mode>=20)
+ {
+ useSmoothShading=true;
+ mode -= 20;
+ }
+ if(mode>=10)
+ {
+ useRGB=true;
+ mode -= 10;
+ }
+
+ if(renderMode>3)
+ return false;
+
+ renderMode=mode;
+
+ return true;
+}
+
+public String getGlobalModeDescription()
+{
+ String str = dez_mode + ": ";
+
+ if(doubleBuffer)
+ str = str + "DoubleBuffer";
+ else
+ str = str + "FrontBuffer ";
+
+ if(useDisplayList)
+ str = str + " + COMPILED ";
+ else
+ str = str + " + IMMEDIATE";
+
+ if(useSmoothShading)
+ str = str + " + Smooth";
+ else
+ str = str + " + Flat ";
+
+ if(useRGB)
+ str = str + " + RGB ";
+ else
+ str = str + " + ColorIndex";
+
+ switch (renderMode)
+ {
+ case 0: str = str + " + glRect"; break;
+ case 1: str = str + " + glRectiv"; break;
+ case 2: str = str + " + POLYGON + glVertex2i"; break;
+ case 3: str = str + " + QUADS + glVertex2i"; break;
+ }
+
+ return str;
+}
+
+public void gl_display ()
+{
+ boolean debug;
+ boolean loc_err;
+ int [] ramp;
+ float [][] seis_amps = null;
+ MapAmpToIndex amp_mapper;
+ long t0, t1;
+
+ debug = false;
+
+ System.out.println(">MODE "+getGlobalModeDescription());
+
+ t0 = System.currentTimeMillis();
+ t1 = System.currentTimeMillis();
+
+ loc_err = false;
+
+ ramp = MakeRampJ (_num_colors);
+ if ( ! loc_err)
+ {
+ if (debug)
+ {
+ for (int loopi = 0; loopi < _num_colors; loopi++)
+ {
+ System.out.println ("GL4JCanvas`gl_display- ramp ["+loopi+"] "
+ +ramp [loopi]);
+ }
+ }
+ }
+
+ // plz_note- prepare seismic data for drawing
+ if ( ! loc_err)
+ {
+ // JAU: seis_amps = GetSeisData (1250, 800);
+ // seis_amps = GetSeisData (600, 400);
+ seis_amps = GetSeisData (1250, 800);
+ if (seis_amps == null)
+ {
+ // look_here- error_handling
+ loc_err = true;
+ System.out.println
+ ("GL4JCanvas`gl_display- ERROR- call to "
+ +" _seis_data.GetSeisData returned "+seis_amps);
+ }
+ else
+ {
+ if (debug) System.out.println
+ ("GL4JCanvas`gl_display- call to GetSeisData succeeded");
+ }
+ if (debug)
+ {
+ for (int loopi = 0; loopi < seis_amps.length; loopi++)
+ {
+ for (int loopj = 0; loopj < seis_amps[0].length; loopj++)
+ {
+ if (loopi == 0 || loopi == seis_amps.length - 1)
+ {
+ if (loopj >= 80 && loopj < 120)
+ {
+ System.out.println
+ ("GL4JCanvas`gl_display- seis_amps ["+loopi
+ +"]["+loopj+"] "+seis_amps [loopi][loopj]);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ System.out.println(">Time for fetching Seis-Data: "+
+ getTimeDeltaSecs(t1));
+
+ t1 = System.currentTimeMillis();
+
+ // plz_note- setup mapper (maps from seismic amplitude to
+ // plz_note- color table index)
+ amp_mapper = new MapAmpToIndex (ramp, seis_amps);
+
+ System.out.println(">Time for map color-table: "+
+ getTimeDeltaSecs(t1));
+
+ t1 = System.currentTimeMillis();
+
+ // plz_note-prepare openGL
+ if ( ! loc_err)
+ {
+ if (glj.gljMakeCurrent () == false)
+ {
+ System.out.println ("GL4JCanvas`gl_display- gljMakeCurrent"
+ +" is false");
+ loc_err = true;
+ }
+ }
+
+ if ( ! loc_err)
+ {
+ if (cvsIsInit () != true)
+ {
+ System.out.println ("GL4JCanvas`gl_display- cvsIsInit not true");
+ loc_err = true;
+ }
+ }
+
+ if ( ! loc_err)
+ {
+ if(!doubleBuffer)
+ gl.glDrawBuffer (GL_FRONT);
+
+ if(!useRGB)
+ gl.glClearIndex (0.0f); // 1.0 is black
+
+ gl.glClear (GL_COLOR_BUFFER_BIT);
+
+ // set current color index
+ if(!useRGB)
+ gl.glIndexi (1);
+
+ gl.glMatrixMode (GL_PROJECTION);
+ gl.glLoadIdentity ();
+
+ // left, right top, bottom clip planes.
+ glu.gluOrtho2D (0.0f, (float) (this._canvas_wid_pix),
+ 0.0f, (float) (this._canvas_hei_pix));
+ // look_here- see OpenGL Programming Guide, page 182
+ //gl.glMatrixMode (GL_MODELVIEW);
+ //gl.glLoadIdentity ();
+
+ // plz_note-
+ int num_trc = seis_amps.length;
+ int num_sam = seis_amps [0].length;
+ if (debug)
+ {
+ System.out.println ("GL4JCanvas`gl_display- num_trc "+num_trc);
+ System.out.println ("GL4JCanvas`gl_display- num_sam "+num_sam);
+ }
+
+ int rect_wid = (int) Math.ceil
+ ((double)((double) (this._canvas_wid_pix) / (double) (num_trc)));
+ rect_wid++;
+ int rect_hei = (int) Math.ceil
+ ((double)((double) (this._canvas_hei_pix)/ (double) (num_sam)));
+ rect_hei++;
+ if (debug)
+ {
+ System.out.println ("GL4JCanvas`gl_display- rect_wid "+rect_wid);
+ System.out.println ("GL4JCanvas`gl_display- rect_hei "+rect_hei);
+ }
+
+ int x1, y1, x2, y2;
+ int[] v1 = new int[3];
+ int[] v2 = new int[3];
+ int ramp_index;
+ int color_index;
+
+ double ratio;
+ int count = 0;
+ int rectList = -1;
+
+ {
+ // JAU
+ if(useDisplayList)
+ {
+ rectList = gl.glGenLists(1);
+ gl.glNewList(rectList, GL_COMPILE);
+ }
+
+ if(useSmoothShading)
+ gl.glShadeModel(GL_SMOOTH);
+ else
+ gl.glShadeModel(GL_FLAT);
+
+ if(renderMode==3)
+ gl.glBegin(GL_QUADS);
+
+
+ // plz_note- for each column or trace
+ for (int loop_i = 0; loop_i < num_trc; loop_i++)
+ {
+ // plz_note- for each row or seismic amplitude
+ for (int loop_j = 0; loop_j < num_sam; loop_j++)
+ {
+ // plz_note- compute vertices.
+ ratio = (double)(loop_i) / (double)(num_trc);
+ x1 = (int)(ratio * (double)(this._canvas_wid_pix));
+ x2 = x1 + rect_wid;
+
+ ratio = (double)(loop_j) / (double)(num_sam);
+ y1 = this._canvas_hei_pix -
+ (int)(ratio * (double)(this._canvas_hei_pix));
+ y2 = y1 + rect_hei;
+
+ // plz_note- set current color index
+ ramp_index = amp_mapper.GetColorIndex
+ (seis_amps [loop_i][loop_j]);
+ color_index = ramp [ramp_index];
+ if (debug && ((loop_i == 0 || loop_i == num_trc - 1)
+ && loop_j >= 80 && loop_j< 180))
+ {
+ System.out.print (" `gl_display-"
+ +" trc "+loop_i+", sam "+loop_j
+ +", amp "+seis_amps [loop_i][loop_j]);
+ System.out.print (", ramp_index "+ramp_index);
+ System.out.println (", color_index "+color_index);
+ }
+
+ if(!useRGB)
+ gl.glIndexi (color_index);
+
+ if(renderMode==0)
+ {
+ gl.glRecti (x1, y1, x2, y2);
+ } else if(renderMode==1)
+ {
+ v1[0]=x1; v1[1]=y1;
+ v2[0]=x2; v2[1]=y2;
+ gl.glRectiv (v1, v2);
+ } else {
+ if(renderMode==2)
+ gl.glBegin(GL_POLYGON);
+ if(renderMode>=2)
+ {
+ gl.glVertex2i(x1,y1);
+ gl.glVertex2i(x2,y1);
+ gl.glVertex2i(x2,y2);
+ gl.glVertex2i(x1,y2);
+ }
+ if(renderMode==2)
+ gl.glEnd();
+ }
+
+ count++;
+ }
+ }
+ if(renderMode==3)
+ gl.glEnd( /* GL_QUADS */ );
+
+ // JAU
+ if(useDisplayList)
+ {
+ gl.glEndList();
+ }
+ else if(doubleBuffer)
+ glj.gljSwap ();
+
+ }
+
+ if(useDisplayList)
+ {
+ System.out.println (">`gl_display(displayList)- rectangles put in displayList: " +count);
+ System.out.println (">relative time: (display-list only)");
+ printTimeDelta(t1, count);
+ System.out.println (">absolute time: (display-list and calculations)");
+ printTimeDelta(t0, count);
+ } else {
+ System.out.println (">`gl_display(immediate)- rectangles rendered: " +count);
+ System.out.println (">relative time: (immediate only)");
+ printTimeDelta(t1, count);
+ System.out.println (">absolute time: (immediate and calculations)");
+ printTimeDelta(t0, count);
+ }
+
+ t1 = System.currentTimeMillis();
+
+ if(useDisplayList)
+ {
+ gl.glCallList(rectList);
+
+ if(doubleBuffer)
+ glj.gljSwap ();
+
+ printTimeDelta(t0, count);
+
+ System.out.println (">relative time: (display-list called)");
+ printTimeDelta(t1, count);
+ System.out.println (">absolute time: (display-list compiled+called+calculations)");
+ printTimeDelta(t0, count);
+
+ gl.glDeleteLists(rectList, 1);
+ }
+
+ gl.glFlush ();
+ gl.glFinish ();
+
+ glj.gljFree ();
+ }
+
+}
+//----------------------------------------------
+// method reshape.
+//----------------------------------------------
+public void reshape (int wid, int hei)
+{
+}
+//----------------------------------------------
+// method
+// what the color is does not matter now.
+//----------------------------------------------
+public int [] MakeRampJ (int num_colors)
+{
+ boolean debug = false;
+
+ if (debug) System.out.println ("GL4JCanvas`MakeRampJ- begin");
+
+ int [] rtn_array = new int [num_colors];
+
+ for (int loopi = 0; loopi < num_colors; loopi++)
+ {
+ rtn_array [loopi] = loopi;
+ }
+
+ if (debug) System.out.println ("GL4JCanvas`MakeRampJ- end");
+ return rtn_array;
+}
+//----------------------------------------------
+// method
+// what the data is does not matter now.
+//----------------------------------------------
+public float [][] GetSeisData (int wid, int hei)
+{
+ boolean debug;
+
+ debug = false;
+ if (debug) System.out.println ("GL4JCanvas`GetSeisData- begin");
+
+ float [][] rtn_array = new float [wid][];
+
+ for (int loopi = 0; loopi < wid; loopi++)
+ {
+ rtn_array [loopi] = new float [hei];
+ }
+
+ for (int loopi = 0; loopi < wid; loopi++)
+ for (int loopj = 0; loopj < hei; loopj++)
+ rtn_array [loopi][loopj] = (float) (Math.random ()) * 100.0f;
+
+ if (debug) System.out.println ("GL4JCanvas`GetSeisData- end");
+ return rtn_array;
+}
+
+//----------------------------------------------
+// end of class GL4JCanvas
+//----------------------------------------------
+}
+
+//----------------------------------------------
+// begin class definition
+//----------------------------------------------
+class MapAmpToIndex extends Object
+{
+
+ private boolean InitDone = false;
+ private int [] _color_ramp;
+ private float _max_amp = (float) 0.0;
+ private float _min_amp = (float) 0.0;
+
+//----------------------------------------------
+// method MapAmpToIndex
+//----------------------------------------------
+MapAmpToIndex (int [] ramp, float [][] data)
+{
+ boolean debug;
+
+ debug = false;
+ InitDone = true;
+
+ if (debug) System.out.println ("MapAmpToIndex`MapAmpToIndex- begin");
+
+ // plz_note- set the color index data store
+ _color_ramp = new int [ramp.length];
+ System.arraycopy (ramp, 0, _color_ramp, 0, ramp.length);
+ if (debug)
+ {
+ System.out.println ("MapAmpToIndex`MapAmpToIndex- _color_ramp:");
+ for (int loopi = 0; loopi < _color_ramp.length; loopi++)
+ {
+ System.out.println ("MapAmpToIndex`MapAmpToIndex- _color_ramp ["
+ +loopi+"] "+_color_ramp [loopi]);
+ }
+ }
+
+ // plz_note- set the max, min amplitudes for scaling
+ for (int loopi = 0; loopi < data.length; loopi++)
+ {
+ for (int loopj = 0; loopj < data [0].length; loopj++)
+ {
+ if (data [loopi][loopj] > _max_amp)
+ _max_amp = data [loopi][loopj];
+ if (data [loopi][loopj] < _min_amp)
+ _min_amp = data [loopi][loopj];
+ }
+ }
+ if (debug)
+ {
+ System.out.println ("MapAmpToIndex`MapAmpToIndex- _max_amp "
+ +_max_amp);
+ System.out.println ("MapAmpToIndex`MapAmpToIndex- _min_amp "
+ +_min_amp);
+ }
+
+ if (debug) System.out.println ("MapAmpToIndex`MapAmpToIndex- end");
+}
+
+//----------------------------------------------
+// method GetColorIndex
+//----------------------------------------------
+int GetColorIndex (float this_amp)
+{
+ boolean debug;
+ int index;
+ int max_index;
+ float amp_range;
+
+ debug = false;
+ if (debug) System.out.println ("MapAmpToIndex`GetColorIndex- begin");
+ index = 0;
+
+ //if ( ! init)
+ {
+ max_index = _color_ramp.length - 1;
+ amp_range = _max_amp - _min_amp;
+ }
+
+ index = (int)
+ (((float)(max_index)) *
+ ((this_amp - _min_amp) / (_max_amp - _min_amp)));
+
+ if (debug) System.out.println ("MapAmpToIndex`GetColorIndex- end");
+ return index;
+}
+
+//----------------------------------------------
+// end of class MapAmpToIndex
+//----------------------------------------------
+
+}
+
+
+//----------------------------------------------
+// end of file
+//----------------------------------------------
diff --git a/demos/RectRenderSpeed/GL4JTests2.java b/demos/RectRenderSpeed/GL4JTests2.java
new file mode 100644
index 0000000..8352c96
--- /dev/null
+++ b/demos/RectRenderSpeed/GL4JTests2.java
@@ -0,0 +1,149 @@
+
+import GL4JCanvas;
+
+import java.awt.*;
+import java.awt.event.*;
+
+//----------------------------------------------
+// class definition.
+//----------------------------------------------
+public class GL4JTests2 implements ActionListener
+{
+ private GL4JCanvas _glcanvas;
+ TextField tf_renderMode;
+
+//----------------------------------------------
+// method constructor.
+//----------------------------------------------
+public GL4JTests2 (String [] args)
+{
+ boolean debug = true;
+ Frame outer_frame;
+ Frame inner_frame;
+ Panel inner_panel;
+ Container outer_container;
+ Container inner_container;
+ Button button;
+ int modes[]=new int[args.length];
+ int mode_number=0;
+ boolean dblBuffer=false;
+
+ if(args.length>0)
+ {
+ int i;
+ for (i=0; i<args.length; i++)
+ {
+ if(args[i].equals("help"))
+ {
+ System.out.println(
+ "Arguments:\n"+
+ "\thelp - print this help\n"+
+ "\tdbl - use doublebuffer\n"+
+ "\t<mode> - render mode, where mode is one of the following integer values :\n"+ GL4JCanvas.modes);
+ } else if(args[i].equals("dbl"))
+ {
+ dblBuffer=true;
+ } else {
+ try {
+ modes[mode_number] =
+ Integer.valueOf(args[i]).intValue();
+ mode_number++;
+ } catch (Exception ex) {
+ System.out.println("wrong mode: "+args[i]);
+ return;
+ }
+ }
+ }
+ } else {
+ System.out.println ("GL4JTests`constructor- begin\n modes:\n"+
+ _glcanvas.modes);
+ }
+
+ // build outer most frame and container.
+ outer_frame = new Frame ("The GL4Java Canvas Window");
+
+ // create a new canvas from GL4Java...
+ // _glcanvas = new GL4JCanvas (1250, 800);
+ // JAU: I have just a little screen at my place now :-) !
+ _glcanvas = new GL4JCanvas (640, 480);
+ outer_frame.add ("Center",_glcanvas);
+
+ _glcanvas.preSetDblBuffer(dblBuffer);
+
+ Panel renderPanel = new Panel();
+
+ if(mode_number==0)
+ {
+ // interactive mode
+ //
+ button = new Button ("Paint");
+ button.setActionCommand ("Button Pressed");
+ button.addActionListener (this);
+ renderPanel.add(button);
+ tf_renderMode = new TextField("0");
+ renderPanel.add(tf_renderMode);
+ outer_frame.add ("South", renderPanel);
+
+ }
+
+ outer_frame.pack ();
+ outer_frame.setVisible (true);
+
+ if(mode_number>0)
+ {
+ // scripting mode
+ //
+ _glcanvas.setScriptModes(modes, mode_number);
+ _glcanvas.setRefreshGL(true);
+ _glcanvas.repaint();
+
+ }
+
+}
+
+
+//----------------------------------------------
+// method actionPerformed.
+//----------------------------------------------
+public void actionPerformed (ActionEvent event)
+{
+
+ String action_command;
+
+ /*
+ * Let's do the repaint thread save ...
+ */
+ int mode=0;
+ try {
+ mode = Integer.valueOf(tf_renderMode.getText()).intValue();
+ } catch (Exception ex) {
+ System.out.println("wrong mode: "+tf_renderMode.getText());
+ return;
+ }
+ if(_glcanvas.setRenderMode(mode)==false)
+ {
+ System.out.println("render mode not supported !");
+ System.out.println("use one of the following:\n"+
+ _glcanvas.modes);
+ return;
+ }
+ _glcanvas.setRefreshGL(true);
+ _glcanvas.repaint();
+
+}
+//----------------------------------------------
+// method main.
+//----------------------------------------------
+public static void main (String[] args)
+{
+ boolean debug = true;
+
+ GL4JTests2 gl4JTests1 = new GL4JTests2 (args);
+ //GL4JTests2 gl4JTests2 = new GL4JTests2 (args);
+
+}
+
+//----------------------------------------------
+// end of class GL4JTests.
+//----------------------------------------------
+}
diff --git a/demos/RectRenderSpeed/GL4JTests2.sh b/demos/RectRenderSpeed/GL4JTests2.sh
new file mode 100755
index 0000000..405f1f4
--- /dev/null
+++ b/demos/RectRenderSpeed/GL4JTests2.sh
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+#
+# run
+#
+echo args: $*
+
+#
+# run java with increased memory, classpath arg
+#
+java -ms64m -mx64m GL4JTests2 $*
+
diff --git a/demos/RectRenderSpeed/perfomance-Linux-300MHzPII-Mesa b/demos/RectRenderSpeed/perfomance-Linux-300MHzPII-Mesa
new file mode 100644
index 0000000..a17bfbb
--- /dev/null
+++ b/demos/RectRenderSpeed/perfomance-Linux-300MHzPII-Mesa
@@ -0,0 +1 @@
+I used platform: RivaTNT2 with MesaNVidia driver und Linux glibc2 ! 120 MB RAM ! 300 MhZ PII ! Running under Java117NativeThreads+TYA & ShellScript GL4JTests2.sh ! args: help 0 1 2 3 100 101 102 103 Arguments: help - print this help dbl - use doublebuffer <mode> - render mode, where mode is one of the following integer values : 0 - Immediate + FLAT + ColorIndex + glRect 1 - Immediate + FLAT + ColorIndex + glRectiv 2 - Immediate + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2); 3 - Immediate + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2); 10 - Immediate + FLAT + RGB + glRect 11 - Immediate + FLAT + RGB + glRectiv 12 - Immediate + FLAT + RGB + POLYGON + glVertex2i(x2,y2); 13 - Immediate + FLAT + RGB + QUADS + glVertex2i(x2,y2); 20 - Immediate + SMOOTH + ColorIndex + glRect 21 - Immediate + SMOOTH + ColorIndex + glRectiv 22 - Immediate + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2); 23 - Immediate + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2); 30 - Immediate + SMOOTH + RGB + glRect 31 - Immediate + SMOOTH + RGB + glRectiv 32 - Immediate + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2); 33 - Immediate + SMOOTH + RGB + QUADS + glVertex2i(x2,y2); 100 - COMPILED + FLAT + ColorIndex + glRect 101 - COMPILED + FLAT + ColorIndex + glRectiv 102 - COMPILED + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2); 103 - COMPILED + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2); 110 - COMPILED + FLAT + RGB + glRect 111 - COMPILED + FLAT + RGB + glRectiv 112 - COMPILED + FLAT + RGB + POLYGON + glVertex2i(x2,y2); 113 - COMPILED + FLAT + RGB + QUADS + glVertex2i(x2,y2); 120 - COMPILED + SMOOTH + ColorIndex + glRect 121 - COMPILED + SMOOTH + ColorIndex + glRectiv 122 - COMPILED + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2); 123 - COMPILED + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2); 130 - COMPILED + SMOOTH + RGB + glRect 131 - COMPILED + SMOOTH + RGB + glRectiv 132 - COMPILED + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2); 133 - COMPILED + SMOOTH + RGB + GL_QUADS+ glVertex2i(x2,y2); trying mode: 0 >MODE 0: FrontBuffer + IMMEDIATE + Flat + ColorIndex + glRect >Time for fetching Seis-Data: 8.238 >Time for map color-table: 0.632 >`gl_display(immediate)- rectangles rendered: 1000000 >relative time: (immediate only) ... elapsed time: 24.793 Sec ... rate: 24.793 SPMR (Sec Per Million Rectangles) >absolute time: (immediate and calculations) ... elapsed time: 33.695 Sec ... rate: 33.695 SPMR (Sec Per Million Rectangles) trying mode: 1 >MODE 1: FrontBuffer + IMMEDIATE + Flat + ColorIndex + glRectiv >Time for fetching Seis-Data: 8.69 >Time for map color-table: 1.095 >`gl_display(immediate)- rectangles rendered: 1000000 >relative time: (immediate only) ... elapsed time: 35.262 Sec ... rate: 35.262 SPMR (Sec Per Million Rectangles) >absolute time: (immediate and calculations) ... elapsed time: 45.095 Sec ... rate: 45.095 SPMR (Sec Per Million Rectangles) trying mode: 2 >MODE 2: FrontBuffer + IMMEDIATE + Flat + ColorIndex + POLYGON + glVertex2i >Time for fetching Seis-Data: 7.502 >Time for map color-table: 1.272 >`gl_display(immediate)- rectangles rendered: 1000000 >relative time: (immediate only) ... elapsed time: 44.177 Sec ... rate: 44.177 SPMR (Sec Per Million Rectangles) >absolute time: (immediate and calculations) ... elapsed time: 53.002 Sec ... rate: 53.002 SPMR (Sec Per Million Rectangles) trying mode: 3 >MODE 3: FrontBuffer + IMMEDIATE + Flat + ColorIndex + QUADS + glVertex2i >Time for fetching Seis-Data: 7.626 >Time for map color-table: 1.227 >`gl_display(immediate)- rectangles rendered: 1000000 >relative time: (immediate only) ... elapsed time: 31.222 Sec ... rate: 31.222 SPMR (Sec Per Million Rectangles) >absolute time: (immediate and calculations) ... elapsed time: 40.135 Sec ... rate: 40.135 SPMR (Sec Per Million Rectangles) trying mode: 100 >MODE 100: FrontBuffer + COMPILED + Flat + ColorIndex + glRect >Time for fetching Seis-Data: 8.431 >Time for map color-table: 0.435 >`gl_display(displayList)- rectangles put in displayList: 1000000 >relative time: (display-list only) ... elapsed time: 15.316 Sec ... rate: 15.316 SPMR (Sec Per Million Rectangles) >absolute time: (display-list and calculations) ... elapsed time: 24.43 Sec ... rate: 24.43 SPMR (Sec Per Million Rectangles) ... elapsed time: 24.477 Sec ... rate: 24.477 SPMR (Sec Per Million Rectangles) >relative time: (display-list called) ... elapsed time: 0.065 Sec ... rate: 0.065 SPMR (Sec Per Million Rectangles) >absolute time: (display-list compiled+called+calculations) ... elapsed time: 24.555 Sec ... rate: 24.555 SPMR (Sec Per Million Rectangles) trying mode: 101 >MODE 101: FrontBuffer + COMPILED + Flat + ColorIndex + glRectiv >Time for fetching Seis-Data: 8.556 >Time for map color-table: 0.405 >`gl_display(displayList)- rectangles put in displayList: 1000000 >relative time: (display-list only) ... elapsed time: 23.98 Sec ... rate: 23.98 SPMR (Sec Per Million Rectangles) >absolute time: (display-list and calculations) ... elapsed time: 32.969 Sec ... rate: 32.969 SPMR (Sec Per Million Rectangles) ... elapsed time: 32.97 Sec ... rate: 32.97 SPMR (Sec Per Million Rectangles) >relative time: (display-list called) ... elapsed time: 0.0 Sec ... rate: 0.0 SPMR (Sec Per Million Rectangles) >absolute time: (display-list compiled+called+calculations) ... elapsed time: 32.971 Sec ... rate: 32.971 SPMR (Sec Per Million Rectangles) trying mode: 102 >MODE 102: FrontBuffer + COMPILED + Flat + ColorIndex + POLYGON + glVertex2i >Time for fetching Seis-Data: 8.849 >Time for map color-table: 0.433 >`gl_display(displayList)- rectangles put in displayList: 1000000 >relative time: (display-list only) ... elapsed time: 36.812 Sec ... rate: 36.812 SPMR (Sec Per Million Rectangles) >absolute time: (display-list and calculations) ... elapsed time: 46.114 Sec ... rate: 46.114 SPMR (Sec Per Million Rectangles) ... elapsed time: 46.115 Sec ... rate: 46.115 SPMR (Sec Per Million Rectangles) >relative time: (display-list called) ... elapsed time: 0.0 Sec ... rate: 0.0 SPMR (Sec Per Million Rectangles) >absolute time: (display-list compiled+called+calculations) ... elapsed time: 46.116 Sec ... rate: 46.116 SPMR (Sec Per Million Rectangles) trying mode: 103 >MODE 103: FrontBuffer + COMPILED + Flat + ColorIndex + QUADS + glVertex2i >Time for fetching Seis-Data: 8.511 >Time for map color-table: 0.426 >`gl_display(displayList)- rectangles put in displayList: 1000000 >relative time: (display-list only) ... elapsed time: 23.532 Sec ... rate: 23.532 SPMR (Sec Per Million Rectangles) >absolute time: (display-list and calculations) ... elapsed time: 32.524 Sec ... rate: 32.524 SPMR (Sec Per Million Rectangles) ... elapsed time: 32.55 Sec ... rate: 32.55 SPMR (Sec Per Million Rectangles) >relative time: (display-list called) ... elapsed time: 0.038 Sec ... rate: 0.038 SPMR (Sec Per Million Rectangles) >absolute time: (display-list compiled+called+calculations) ... elapsed time: 32.626 Sec ... rate: 32.626 SPMR (Sec Per Million Rectangles) \ No newline at end of file
diff --git a/demos/RectRenderSpeed/perfomance-Linux-300MHzPII-MesaRivaTNT2.txt b/demos/RectRenderSpeed/perfomance-Linux-300MHzPII-MesaRivaTNT2.txt
new file mode 100644
index 0000000..af0e9e7
--- /dev/null
+++ b/demos/RectRenderSpeed/perfomance-Linux-300MHzPII-MesaRivaTNT2.txt
@@ -0,0 +1,167 @@
+I used platform:
+
+RivaTNT2 with MesaNVidia driver und Linux glibc2 !
+120 MB RAM !
+300 MhZ PII !
+
+Running under Java117NativeThreads+TYA & ShellScript GL4JTests2.sh !
+
+args: help 0 1 2 3 100 101 102 103
+Arguments:
+ help - print this help
+ dbl - use doublebuffer
+ <mode> - render mode, where mode is one of the following integer values :
+ 0 - Immediate + FLAT + ColorIndex + glRect
+ 1 - Immediate + FLAT + ColorIndex + glRectiv
+ 2 - Immediate + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2);
+ 3 - Immediate + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2);
+ 10 - Immediate + FLAT + RGB + glRect
+ 11 - Immediate + FLAT + RGB + glRectiv
+ 12 - Immediate + FLAT + RGB + POLYGON + glVertex2i(x2,y2);
+ 13 - Immediate + FLAT + RGB + QUADS + glVertex2i(x2,y2);
+ 20 - Immediate + SMOOTH + ColorIndex + glRect
+ 21 - Immediate + SMOOTH + ColorIndex + glRectiv
+ 22 - Immediate + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2);
+ 23 - Immediate + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2);
+ 30 - Immediate + SMOOTH + RGB + glRect
+ 31 - Immediate + SMOOTH + RGB + glRectiv
+ 32 - Immediate + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2);
+ 33 - Immediate + SMOOTH + RGB + QUADS + glVertex2i(x2,y2);
+100 - COMPILED + FLAT + ColorIndex + glRect
+101 - COMPILED + FLAT + ColorIndex + glRectiv
+102 - COMPILED + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2);
+103 - COMPILED + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2);
+110 - COMPILED + FLAT + RGB + glRect
+111 - COMPILED + FLAT + RGB + glRectiv
+112 - COMPILED + FLAT + RGB + POLYGON + glVertex2i(x2,y2);
+113 - COMPILED + FLAT + RGB + QUADS + glVertex2i(x2,y2);
+120 - COMPILED + SMOOTH + ColorIndex + glRect
+121 - COMPILED + SMOOTH + ColorIndex + glRectiv
+122 - COMPILED + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2);
+123 - COMPILED + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2);
+130 - COMPILED + SMOOTH + RGB + glRect
+131 - COMPILED + SMOOTH + RGB + glRectiv
+132 - COMPILED + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2);
+133 - COMPILED + SMOOTH + RGB + GL_QUADS+ glVertex2i(x2,y2);
+
+
+trying mode: 0
+>MODE 0: FrontBuffer + IMMEDIATE + Flat + ColorIndex + glRect
+>Time for fetching Seis-Data: 8.238
+>Time for map color-table: 0.632
+>`gl_display(immediate)- rectangles rendered: 1000000
+>relative time: (immediate only)
+... elapsed time: 24.793 Sec
+... rate: 24.793 SPMR (Sec Per Million Rectangles)
+>absolute time: (immediate and calculations)
+... elapsed time: 33.695 Sec
+... rate: 33.695 SPMR (Sec Per Million Rectangles)
+trying mode: 1
+>MODE 1: FrontBuffer + IMMEDIATE + Flat + ColorIndex + glRectiv
+>Time for fetching Seis-Data: 8.69
+>Time for map color-table: 1.095
+>`gl_display(immediate)- rectangles rendered: 1000000
+>relative time: (immediate only)
+... elapsed time: 35.262 Sec
+... rate: 35.262 SPMR (Sec Per Million Rectangles)
+>absolute time: (immediate and calculations)
+... elapsed time: 45.095 Sec
+... rate: 45.095 SPMR (Sec Per Million Rectangles)
+trying mode: 2
+>MODE 2: FrontBuffer + IMMEDIATE + Flat + ColorIndex + POLYGON + glVertex2i
+>Time for fetching Seis-Data: 7.502
+>Time for map color-table: 1.272
+>`gl_display(immediate)- rectangles rendered: 1000000
+>relative time: (immediate only)
+... elapsed time: 44.177 Sec
+... rate: 44.177 SPMR (Sec Per Million Rectangles)
+>absolute time: (immediate and calculations)
+... elapsed time: 53.002 Sec
+... rate: 53.002 SPMR (Sec Per Million Rectangles)
+trying mode: 3
+>MODE 3: FrontBuffer + IMMEDIATE + Flat + ColorIndex + QUADS + glVertex2i
+>Time for fetching Seis-Data: 7.626
+>Time for map color-table: 1.227
+>`gl_display(immediate)- rectangles rendered: 1000000
+>relative time: (immediate only)
+... elapsed time: 31.222 Sec
+... rate: 31.222 SPMR (Sec Per Million Rectangles)
+>absolute time: (immediate and calculations)
+... elapsed time: 40.135 Sec
+... rate: 40.135 SPMR (Sec Per Million Rectangles)
+trying mode: 100
+>MODE 100: FrontBuffer + COMPILED + Flat + ColorIndex + glRect
+>Time for fetching Seis-Data: 8.431
+>Time for map color-table: 0.435
+>`gl_display(displayList)- rectangles put in displayList: 1000000
+>relative time: (display-list only)
+... elapsed time: 15.316 Sec
+... rate: 15.316 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list and calculations)
+... elapsed time: 24.43 Sec
+... rate: 24.43 SPMR (Sec Per Million Rectangles)
+... elapsed time: 24.477 Sec
+... rate: 24.477 SPMR (Sec Per Million Rectangles)
+>relative time: (display-list called)
+... elapsed time: 0.065 Sec
+... rate: 0.065 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list compiled+called+calculations)
+... elapsed time: 24.555 Sec
+... rate: 24.555 SPMR (Sec Per Million Rectangles)
+trying mode: 101
+>MODE 101: FrontBuffer + COMPILED + Flat + ColorIndex + glRectiv
+>Time for fetching Seis-Data: 8.556
+>Time for map color-table: 0.405
+>`gl_display(displayList)- rectangles put in displayList: 1000000
+>relative time: (display-list only)
+... elapsed time: 23.98 Sec
+... rate: 23.98 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list and calculations)
+... elapsed time: 32.969 Sec
+... rate: 32.969 SPMR (Sec Per Million Rectangles)
+... elapsed time: 32.97 Sec
+... rate: 32.97 SPMR (Sec Per Million Rectangles)
+>relative time: (display-list called)
+... elapsed time: 0.0 Sec
+... rate: 0.0 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list compiled+called+calculations)
+... elapsed time: 32.971 Sec
+... rate: 32.971 SPMR (Sec Per Million Rectangles)
+trying mode: 102
+>MODE 102: FrontBuffer + COMPILED + Flat + ColorIndex + POLYGON + glVertex2i
+>Time for fetching Seis-Data: 8.849
+>Time for map color-table: 0.433
+>`gl_display(displayList)- rectangles put in displayList: 1000000
+>relative time: (display-list only)
+... elapsed time: 36.812 Sec
+... rate: 36.812 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list and calculations)
+... elapsed time: 46.114 Sec
+... rate: 46.114 SPMR (Sec Per Million Rectangles)
+... elapsed time: 46.115 Sec
+... rate: 46.115 SPMR (Sec Per Million Rectangles)
+>relative time: (display-list called)
+... elapsed time: 0.0 Sec
+... rate: 0.0 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list compiled+called+calculations)
+... elapsed time: 46.116 Sec
+... rate: 46.116 SPMR (Sec Per Million Rectangles)
+trying mode: 103
+>MODE 103: FrontBuffer + COMPILED + Flat + ColorIndex + QUADS + glVertex2i
+>Time for fetching Seis-Data: 8.511
+>Time for map color-table: 0.426
+>`gl_display(displayList)- rectangles put in displayList: 1000000
+>relative time: (display-list only)
+... elapsed time: 23.532 Sec
+... rate: 23.532 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list and calculations)
+... elapsed time: 32.524 Sec
+... rate: 32.524 SPMR (Sec Per Million Rectangles)
+... elapsed time: 32.55 Sec
+... rate: 32.55 SPMR (Sec Per Million Rectangles)
+>relative time: (display-list called)
+... elapsed time: 0.038 Sec
+... rate: 0.038 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list compiled+called+calculations)
+... elapsed time: 32.626 Sec
+... rate: 32.626 SPMR (Sec Per Million Rectangles)
diff --git a/demos/RectRenderSpeed/perfomance-Linux-350MHzPII-Mesa b/demos/RectRenderSpeed/perfomance-Linux-350MHzPII-Mesa
new file mode 100644
index 0000000..042252f
--- /dev/null
+++ b/demos/RectRenderSpeed/perfomance-Linux-350MHzPII-Mesa
@@ -0,0 +1 @@
+I used platform: RivaTNT2 with MesaNVidia driver und Linux glibc2 ! 120 MB RAM ! 350 MhZ PII ! Running under Java117NativeThreads+TYA & ShellScript GL4JTests2.sh ! args: help 0 1 2 3 100 101 102 103 args: help 0 1 2 3 100 101 102 103 Arguments: help - print this help dbl - use doublebuffer <mode> - render mode, where mode is one of the following integer values : 0 - Immediate + FLAT + ColorIndex + glRect 1 - Immediate + FLAT + ColorIndex + glRectiv 2 - Immediate + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2); 3 - Immediate + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2); 10 - Immediate + FLAT + RGB + glRect 11 - Immediate + FLAT + RGB + glRectiv 12 - Immediate + FLAT + RGB + POLYGON + glVertex2i(x2,y2); 13 - Immediate + FLAT + RGB + QUADS + glVertex2i(x2,y2); 20 - Immediate + SMOOTH + ColorIndex + glRect 21 - Immediate + SMOOTH + ColorIndex + glRectiv 22 - Immediate + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2); 23 - Immediate + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2); 30 - Immediate + SMOOTH + RGB + glRect 31 - Immediate + SMOOTH + RGB + glRectiv 32 - Immediate + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2); 33 - Immediate + SMOOTH + RGB + QUADS + glVertex2i(x2,y2); 100 - COMPILED + FLAT + ColorIndex + glRect 101 - COMPILED + FLAT + ColorIndex + glRectiv 102 - COMPILED + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2); 103 - COMPILED + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2); 110 - COMPILED + FLAT + RGB + glRect 111 - COMPILED + FLAT + RGB + glRectiv 112 - COMPILED + FLAT + RGB + POLYGON + glVertex2i(x2,y2); 113 - COMPILED + FLAT + RGB + QUADS + glVertex2i(x2,y2); 120 - COMPILED + SMOOTH + ColorIndex + glRect 121 - COMPILED + SMOOTH + ColorIndex + glRectiv 122 - COMPILED + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2); 123 - COMPILED + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2); 130 - COMPILED + SMOOTH + RGB + glRect 131 - COMPILED + SMOOTH + RGB + glRectiv 132 - COMPILED + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2); 133 - COMPILED + SMOOTH + RGB + GL_QUADS+ glVertex2i(x2,y2); trying mode: 0 >MODE 0: FrontBuffer + IMMEDIATE + Flat + ColorIndex + glRect >Time for fetching Seis-Data: 6.723 >Time for map color-table: 0.417 >`gl_display(immediate)- rectangles rendered: 1000000 >relative time: (immediate only) ... elapsed time: 34.165 Sec ... rate: 34.165 SPMR (Sec Per Million Rectangles) >absolute time: (immediate and calculations) ... elapsed time: 41.367 Sec ... rate: 41.367 SPMR (Sec Per Million Rectangles) trying mode: 1 >MODE 1: FrontBuffer + IMMEDIATE + Flat + ColorIndex + glRectiv >Time for fetching Seis-Data: 6.323 >Time for map color-table: 0.39 >`gl_display(immediate)- rectangles rendered: 1000000 >relative time: (immediate only) ... elapsed time: 45.265 Sec ... rate: 45.265 SPMR (Sec Per Million Rectangles) >absolute time: (immediate and calculations) ... elapsed time: 52.034 Sec ... rate: 52.034 SPMR (Sec Per Million Rectangles) trying mode: 2 >MODE 2: FrontBuffer + IMMEDIATE + Flat + ColorIndex + POLYGON + glVertex2i >Time for fetching Seis-Data: 6.878 >Time for map color-table: 0.4 >`gl_display(immediate)- rectangles rendered: 1000000 >relative time: (immediate only) ... elapsed time: 46.561 Sec ... rate: 46.561 SPMR (Sec Per Million Rectangles) >absolute time: (immediate and calculations) ... elapsed time: 53.894 Sec ... rate: 53.894 SPMR (Sec Per Million Rectangles) trying mode: 3 >MODE 3: FrontBuffer + IMMEDIATE + Flat + ColorIndex + QUADS + glVertex2i >Time for fetching Seis-Data: 6.831 >Time for map color-table: 0.404 >`gl_display(immediate)- rectangles rendered: 1000000 >relative time: (immediate only) ... elapsed time: 32.039 Sec ... rate: 32.039 SPMR (Sec Per Million Rectangles) >absolute time: (immediate and calculations) ... elapsed time: 39.329 Sec ... rate: 39.329 SPMR (Sec Per Million Rectangles) trying mode: 100 >MODE 100: FrontBuffer + COMPILED + Flat + ColorIndex + glRect >Time for fetching Seis-Data: 6.777 >Time for map color-table: 0.4 >`gl_display(displayList)- rectangles put in displayList: 1000000 >relative time: (display-list only) ... elapsed time: 10.559 Sec ... rate: 10.559 SPMR (Sec Per Million Rectangles) >absolute time: (display-list and calculations) ... elapsed time: 17.897 Sec ... rate: 17.897 SPMR (Sec Per Million Rectangles) ... elapsed time: 43.379 Sec ... rate: 43.379 SPMR (Sec Per Million Rectangles) >relative time: (display-list called) ... elapsed time: 25.516 Sec ... rate: 25.516 SPMR (Sec Per Million Rectangles) >absolute time: (display-list compiled+called+calculations) ... elapsed time: 43.455 Sec ... rate: 43.455 SPMR (Sec Per Million Rectangles) trying mode: 101 >MODE 101: FrontBuffer + COMPILED + Flat + ColorIndex + glRectiv >Time for fetching Seis-Data: 6.37 >Time for map color-table: 0.4 >`gl_display(displayList)- rectangles put in displayList: 1000000 >relative time: (display-list only) ... elapsed time: 15.623 Sec ... rate: 15.623 SPMR (Sec Per Million Rectangles) >absolute time: (display-list and calculations) ... elapsed time: 22.467 Sec ... rate: 22.467 SPMR (Sec Per Million Rectangles) ... elapsed time: 42.516 Sec ... rate: 42.516 SPMR (Sec Per Million Rectangles) >relative time: (display-list called) ... elapsed time: 20.062 Sec ... rate: 20.062 SPMR (Sec Per Million Rectangles) >absolute time: (display-list compiled+called+calculations) ... elapsed time: 42.594 Sec ... rate: 42.594 SPMR (Sec Per Million Rectangles) trying mode: 102 >MODE 102: FrontBuffer + COMPILED + Flat + ColorIndex + POLYGON + glVertex2i >Time for fetching Seis-Data: 6.319 >Time for map color-table: 0.401 >`gl_display(displayList)- rectangles put in displayList: 1000000 >relative time: (display-list only) ... elapsed time: 26.708 Sec ... rate: 26.708 SPMR (Sec Per Million Rectangles) >absolute time: (display-list and calculations) ... elapsed time: 33.641 Sec ... rate: 33.641 SPMR (Sec Per Million Rectangles) ... elapsed time: 67.779 Sec ... rate: 67.779 SPMR (Sec Per Million Rectangles) >relative time: (display-list called) ... elapsed time: 34.544 Sec ... rate: 34.544 SPMR (Sec Per Million Rectangles) >absolute time: (display-list compiled+called+calculations) ... elapsed time: 68.186 Sec ... rate: 68.186 SPMR (Sec Per Million Rectangles) trying mode: 103 >MODE 103: FrontBuffer + COMPILED + Flat + ColorIndex + QUADS + glVertex2i >Time for fetching Seis-Data: 6.671 >Time for map color-table: 0.409 >`gl_display(displayList)- rectangles put in displayList: 1000000 >relative time: (display-list only) ... elapsed time: 17.646 Sec ... rate: 17.646 SPMR (Sec Per Million Rectangles) >absolute time: (display-list and calculations) ... elapsed time: 25.173 Sec ... rate: 25.173 SPMR (Sec Per Million Rectangles) ... elapsed time: 58.663 Sec ... rate: 58.663 SPMR (Sec Per Million Rectangles) >relative time: (display-list called) ... elapsed time: 33.524 Sec ... rate: 33.524 SPMR (Sec Per Million Rectangles) >absolute time: (display-list compiled+called+calculations) ... elapsed time: 58.752 Sec ... rate: 58.752 SPMR (Sec Per Million Rectangles) \ No newline at end of file
diff --git a/demos/RectRenderSpeed/perfomance-Linux-350MHzPII-MesaRivaTNT2.txt b/demos/RectRenderSpeed/perfomance-Linux-350MHzPII-MesaRivaTNT2.txt
new file mode 100644
index 0000000..370ee97
--- /dev/null
+++ b/demos/RectRenderSpeed/perfomance-Linux-350MHzPII-MesaRivaTNT2.txt
@@ -0,0 +1,168 @@
+I used platform:
+
+RivaTNT2 with MesaNVidia driver und Linux glibc2 !
+120 MB RAM !
+350 MhZ PII !
+
+Running under Java117NativeThreads+TYA & ShellScript GL4JTests2.sh !
+
+args: help 0 1 2 3 100 101 102 103
+args: help 0 1 2 3 100 101 102 103
+Arguments:
+ help - print this help
+ dbl - use doublebuffer
+ <mode> - render mode, where mode is one of the following integer values :
+ 0 - Immediate + FLAT + ColorIndex + glRect
+ 1 - Immediate + FLAT + ColorIndex + glRectiv
+ 2 - Immediate + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2);
+ 3 - Immediate + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2);
+ 10 - Immediate + FLAT + RGB + glRect
+ 11 - Immediate + FLAT + RGB + glRectiv
+ 12 - Immediate + FLAT + RGB + POLYGON + glVertex2i(x2,y2);
+ 13 - Immediate + FLAT + RGB + QUADS + glVertex2i(x2,y2);
+ 20 - Immediate + SMOOTH + ColorIndex + glRect
+ 21 - Immediate + SMOOTH + ColorIndex + glRectiv
+ 22 - Immediate + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2);
+ 23 - Immediate + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2);
+ 30 - Immediate + SMOOTH + RGB + glRect
+ 31 - Immediate + SMOOTH + RGB + glRectiv
+ 32 - Immediate + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2);
+ 33 - Immediate + SMOOTH + RGB + QUADS + glVertex2i(x2,y2);
+100 - COMPILED + FLAT + ColorIndex + glRect
+101 - COMPILED + FLAT + ColorIndex + glRectiv
+102 - COMPILED + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2);
+103 - COMPILED + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2);
+110 - COMPILED + FLAT + RGB + glRect
+111 - COMPILED + FLAT + RGB + glRectiv
+112 - COMPILED + FLAT + RGB + POLYGON + glVertex2i(x2,y2);
+113 - COMPILED + FLAT + RGB + QUADS + glVertex2i(x2,y2);
+120 - COMPILED + SMOOTH + ColorIndex + glRect
+121 - COMPILED + SMOOTH + ColorIndex + glRectiv
+122 - COMPILED + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2);
+123 - COMPILED + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2);
+130 - COMPILED + SMOOTH + RGB + glRect
+131 - COMPILED + SMOOTH + RGB + glRectiv
+132 - COMPILED + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2);
+133 - COMPILED + SMOOTH + RGB + GL_QUADS+ glVertex2i(x2,y2);
+
+
+trying mode: 0
+>MODE 0: FrontBuffer + IMMEDIATE + Flat + ColorIndex + glRect
+>Time for fetching Seis-Data: 6.723
+>Time for map color-table: 0.417
+>`gl_display(immediate)- rectangles rendered: 1000000
+>relative time: (immediate only)
+... elapsed time: 34.165 Sec
+... rate: 34.165 SPMR (Sec Per Million Rectangles)
+>absolute time: (immediate and calculations)
+... elapsed time: 41.367 Sec
+... rate: 41.367 SPMR (Sec Per Million Rectangles)
+trying mode: 1
+>MODE 1: FrontBuffer + IMMEDIATE + Flat + ColorIndex + glRectiv
+>Time for fetching Seis-Data: 6.323
+>Time for map color-table: 0.39
+>`gl_display(immediate)- rectangles rendered: 1000000
+>relative time: (immediate only)
+... elapsed time: 45.265 Sec
+... rate: 45.265 SPMR (Sec Per Million Rectangles)
+>absolute time: (immediate and calculations)
+... elapsed time: 52.034 Sec
+... rate: 52.034 SPMR (Sec Per Million Rectangles)
+trying mode: 2
+>MODE 2: FrontBuffer + IMMEDIATE + Flat + ColorIndex + POLYGON + glVertex2i
+>Time for fetching Seis-Data: 6.878
+>Time for map color-table: 0.4
+>`gl_display(immediate)- rectangles rendered: 1000000
+>relative time: (immediate only)
+... elapsed time: 46.561 Sec
+... rate: 46.561 SPMR (Sec Per Million Rectangles)
+>absolute time: (immediate and calculations)
+... elapsed time: 53.894 Sec
+... rate: 53.894 SPMR (Sec Per Million Rectangles)
+trying mode: 3
+>MODE 3: FrontBuffer + IMMEDIATE + Flat + ColorIndex + QUADS + glVertex2i
+>Time for fetching Seis-Data: 6.831
+>Time for map color-table: 0.404
+>`gl_display(immediate)- rectangles rendered: 1000000
+>relative time: (immediate only)
+... elapsed time: 32.039 Sec
+... rate: 32.039 SPMR (Sec Per Million Rectangles)
+>absolute time: (immediate and calculations)
+... elapsed time: 39.329 Sec
+... rate: 39.329 SPMR (Sec Per Million Rectangles)
+trying mode: 100
+>MODE 100: FrontBuffer + COMPILED + Flat + ColorIndex + glRect
+>Time for fetching Seis-Data: 6.777
+>Time for map color-table: 0.4
+>`gl_display(displayList)- rectangles put in displayList: 1000000
+>relative time: (display-list only)
+... elapsed time: 10.559 Sec
+... rate: 10.559 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list and calculations)
+... elapsed time: 17.897 Sec
+... rate: 17.897 SPMR (Sec Per Million Rectangles)
+... elapsed time: 43.379 Sec
+... rate: 43.379 SPMR (Sec Per Million Rectangles)
+>relative time: (display-list called)
+... elapsed time: 25.516 Sec
+... rate: 25.516 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list compiled+called+calculations)
+... elapsed time: 43.455 Sec
+... rate: 43.455 SPMR (Sec Per Million Rectangles)
+trying mode: 101
+>MODE 101: FrontBuffer + COMPILED + Flat + ColorIndex + glRectiv
+>Time for fetching Seis-Data: 6.37
+>Time for map color-table: 0.4
+>`gl_display(displayList)- rectangles put in displayList: 1000000
+>relative time: (display-list only)
+... elapsed time: 15.623 Sec
+... rate: 15.623 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list and calculations)
+... elapsed time: 22.467 Sec
+... rate: 22.467 SPMR (Sec Per Million Rectangles)
+... elapsed time: 42.516 Sec
+... rate: 42.516 SPMR (Sec Per Million Rectangles)
+>relative time: (display-list called)
+... elapsed time: 20.062 Sec
+... rate: 20.062 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list compiled+called+calculations)
+... elapsed time: 42.594 Sec
+... rate: 42.594 SPMR (Sec Per Million Rectangles)
+trying mode: 102
+>MODE 102: FrontBuffer + COMPILED + Flat + ColorIndex + POLYGON + glVertex2i
+>Time for fetching Seis-Data: 6.319
+>Time for map color-table: 0.401
+>`gl_display(displayList)- rectangles put in displayList: 1000000
+>relative time: (display-list only)
+... elapsed time: 26.708 Sec
+... rate: 26.708 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list and calculations)
+... elapsed time: 33.641 Sec
+... rate: 33.641 SPMR (Sec Per Million Rectangles)
+... elapsed time: 67.779 Sec
+... rate: 67.779 SPMR (Sec Per Million Rectangles)
+>relative time: (display-list called)
+... elapsed time: 34.544 Sec
+... rate: 34.544 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list compiled+called+calculations)
+... elapsed time: 68.186 Sec
+... rate: 68.186 SPMR (Sec Per Million Rectangles)
+trying mode: 103
+>MODE 103: FrontBuffer + COMPILED + Flat + ColorIndex + QUADS + glVertex2i
+>Time for fetching Seis-Data: 6.671
+>Time for map color-table: 0.409
+>`gl_display(displayList)- rectangles put in displayList: 1000000
+>relative time: (display-list only)
+... elapsed time: 17.646 Sec
+... rate: 17.646 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list and calculations)
+... elapsed time: 25.173 Sec
+... rate: 25.173 SPMR (Sec Per Million Rectangles)
+... elapsed time: 58.663 Sec
+... rate: 58.663 SPMR (Sec Per Million Rectangles)
+>relative time: (display-list called)
+... elapsed time: 33.524 Sec
+... rate: 33.524 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list compiled+called+calculations)
+... elapsed time: 58.752 Sec
+... rate: 58.752 SPMR (Sec Per Million Rectangles)
diff --git a/demos/RectRenderSpeed/perfomance-Win32-400MHzPII-Matr b/demos/RectRenderSpeed/perfomance-Win32-400MHzPII-Matr
new file mode 100644
index 0000000..71ae1bc
--- /dev/null
+++ b/demos/RectRenderSpeed/perfomance-Win32-400MHzPII-Matr
@@ -0,0 +1 @@
+I used platform: Matrox G200 with new driver ! Windows NT 4.0 SP5 ! 329 MB RAM ! 400 MhZ PII ! Running under Java2 & Cygwin32-Bash & ShellScript GL4JTests2.sh ! args: help 0 1 2 3 100 101 102 103 Arguments: help - print this help dbl - use doublebuffer <mode> - render mode, where mode is one of the following integer values : 0 - Immediate + FLAT + ColorIndex + glRect 1 - Immediate + FLAT + ColorIndex + glRectiv 2 - Immediate + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2); 3 - Immediate + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2); 10 - Immediate + FLAT + RGB + glRect 11 - Immediate + FLAT + RGB + glRectiv 12 - Immediate + FLAT + RGB + POLYGON + glVertex2i(x2,y2); 13 - Immediate + FLAT + RGB + QUADS + glVertex2i(x2,y2); 20 - Immediate + SMOOTH + ColorIndex + glRect 21 - Immediate + SMOOTH + ColorIndex + glRectiv 22 - Immediate + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2); 23 - Immediate + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2); 30 - Immediate + SMOOTH + RGB + glRect 31 - Immediate + SMOOTH + RGB + glRectiv 32 - Immediate + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2); 33 - Immediate + SMOOTH + RGB + QUADS + glVertex2i(x2,y2); 100 - COMPILED + FLAT + ColorIndex + glRect 101 - COMPILED + FLAT + ColorIndex + glRectiv 102 - COMPILED + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2); 103 - COMPILED + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2); 110 - COMPILED + FLAT + RGB + glRect 111 - COMPILED + FLAT + RGB + glRectiv 112 - COMPILED + FLAT + RGB + POLYGON + glVertex2i(x2,y2); 113 - COMPILED + FLAT + RGB + QUADS + glVertex2i(x2,y2); 120 - COMPILED + SMOOTH + ColorIndex + glRect 121 - COMPILED + SMOOTH + ColorIndex + glRectiv 122 - COMPILED + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2); 123 - COMPILED + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2); 130 - COMPILED + SMOOTH + RGB + glRect 131 - COMPILED + SMOOTH + RGB + glRectiv 132 - COMPILED + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2); 133 - COMPILED + SMOOTH + RGB + GL_QUADS+ glVertex2i(x2,y2); trying mode: 0 >MODE 0: FrontBuffer + IMMEDIATE + Flat + ColorIndex + glRect >Time for fetching Seis-Data: 0.631 >Time for map color-table: 0.05 >`gl_display(immediate)- rectangles rendered: 1000000 >relative time: (immediate only) ... elapsed time: 60.858 Sec ... rate: 60.858000000000004 SPMR (Sec Per Million Rectangles) >absolute time: (immediate and calculations) ... elapsed time: 61.549 Sec ... rate: 61.549 SPMR (Sec Per Million Rectangles) trying mode: 1 >MODE 1: FrontBuffer + IMMEDIATE + Flat + ColorIndex + glRectiv >Time for fetching Seis-Data: 0.631 >Time for map color-table: 0.04 >`gl_display(immediate)- rectangles rendered: 1000000 >relative time: (immediate only) ... elapsed time: 67.547 Sec ... rate: 67.547 SPMR (Sec Per Million Rectangles) >absolute time: (immediate and calculations) ... elapsed time: 68.218 Sec ... rate: 68.218 SPMR (Sec Per Million Rectangles) trying mode: 2 >MODE 2: FrontBuffer + IMMEDIATE + Flat + ColorIndex + POLYGON + glVertex2i >Time for fetching Seis-Data: 0.631 >Time for map color-table: 0.05 >`gl_display(immediate)- rectangles rendered: 1000000 >relative time: (immediate only) ... elapsed time: 8.782 Sec ... rate: 8.782 SPMR (Sec Per Million Rectangles) >absolute time: (immediate and calculations) ... elapsed time: 9.473 Sec ... rate: 9.473 SPMR (Sec Per Million Rectangles) trying mode: 3 >MODE 3: FrontBuffer + IMMEDIATE + Flat + ColorIndex + QUADS + glVertex2i >Time for fetching Seis-Data: 0.631 >Time for map color-table: 0.04 >`gl_display(immediate)- rectangles rendered: 1000000 >relative time: (immediate only) ... elapsed time: 7.051 Sec ... rate: 7.051 SPMR (Sec Per Million Rectangles) >absolute time: (immediate and calculations) ... elapsed time: 7.722 Sec ... rate: 7.722 SPMR (Sec Per Million Rectangles) trying mode: 100 >MODE 100: FrontBuffer + COMPILED + Flat + ColorIndex + glRect >Time for fetching Seis-Data: 0.63 >Time for map color-table: 0.051 >`gl_display(displayList)- rectangles put in displayList: 1000000 >relative time: (display-list only) ... elapsed time: 2.894 Sec ... rate: 2.894 SPMR (Sec Per Million Rectangles) >absolute time: (display-list and calculations) ... elapsed time: 3.575 Sec ... rate: 3.575 SPMR (Sec Per Million Rectangles) ... elapsed time: 56.571 Sec ... rate: 56.571 SPMR (Sec Per Million Rectangles) >relative time: (display-list called) ... elapsed time: 52.996 Sec ... rate: 52.996 SPMR (Sec Per Million Rectangles) >absolute time: (display-list compiled+called+calculations) ... elapsed time: 56.571 Sec ... rate: 56.571 SPMR (Sec Per Million Rectangles) trying mode: 101 >MODE 101: FrontBuffer + COMPILED + Flat + ColorIndex + glRectiv >Time for fetching Seis-Data: 0.631 >Time for map color-table: 0.04 >`gl_display(displayList)- rectangles put in displayList: 1000000 >relative time: (display-list only) ... elapsed time: 4.867 Sec ... rate: 4.867 SPMR (Sec Per Million Rectangles) >absolute time: (display-list and calculations) ... elapsed time: 5.548 Sec ... rate: 5.548 SPMR (Sec Per Million Rectangles) ... elapsed time: 59.245 Sec ... rate: 59.245000000000005 SPMR (Sec Per Million Rectangles) >relative time: (display-list called) ... elapsed time: 53.707 Sec ... rate: 53.707 SPMR (Sec Per Million Rectangles) >absolute time: (display-list compiled+called+calculations) ... elapsed time: 59.255 Sec ... rate: 59.255 SPMR (Sec Per Million Rectangles) trying mode: 102 >MODE 102: FrontBuffer + COMPILED + Flat + ColorIndex + POLYGON + glVertex2i >Time for fetching Seis-Data: 0.641 >Time for map color-table: 0.05 >`gl_display(displayList)- rectangles put in displayList: 1000000 >relative time: (display-list only) ... elapsed time: 25.947 Sec ... rate: 25.947 SPMR (Sec Per Million Rectangles) >absolute time: (display-list and calculations) ... elapsed time: 26.899 Sec ... rate: 26.899 SPMR (Sec Per Million Rectangles) ... elapsed time: 34.35 Sec ... rate: 34.35 SPMR (Sec Per Million Rectangles) >relative time: (display-list called) ... elapsed time: 7.391 Sec ... rate: 7.391 SPMR (Sec Per Million Rectangles) >absolute time: (display-list compiled+called+calculations) ... elapsed time: 34.35 Sec ... rate: 34.35 SPMR (Sec Per Million Rectangles) trying mode: 103 >MODE 103: FrontBuffer + COMPILED + Flat + ColorIndex + QUADS + glVertex2i >Time for fetching Seis-Data: 0.791 >Time for map color-table: 0.05 >`gl_display(displayList)- rectangles put in displayList: 1000000 >relative time: (display-list only) ... elapsed time: 7.671 Sec ... rate: 7.671 SPMR (Sec Per Million Rectangles) >absolute time: (display-list and calculations) ... elapsed time: 10.796 Sec ... rate: 10.796 SPMR (Sec Per Million Rectangles) ... elapsed time: 16.314 Sec ... rate: 16.314 SPMR (Sec Per Million Rectangles) >relative time: (display-list called) ... elapsed time: 5.498 Sec ... rate: 5.498 SPMR (Sec Per Million Rectangles) >absolute time: (display-list compiled+called+calculations) ... elapsed time: 16.334 Sec ... rate: 16.334 SPMR (Sec Per Million Rectangles) args: help 112 113 Arguments: help - print this help dbl - use doublebuffer <mode> - render mode, where mode is one of the following integer values : 0 - Immediate + FLAT + ColorIndex + glRect 1 - Immediate + FLAT + ColorIndex + glRectiv 2 - Immediate + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2); 3 - Immediate + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2); 10 - Immediate + FLAT + RGB + glRect 11 - Immediate + FLAT + RGB + glRectiv 12 - Immediate + FLAT + RGB + POLYGON + glVertex2i(x2,y2); 13 - Immediate + FLAT + RGB + QUADS + glVertex2i(x2,y2); 20 - Immediate + SMOOTH + ColorIndex + glRect 21 - Immediate + SMOOTH + ColorIndex + glRectiv 22 - Immediate + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2); 23 - Immediate + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2); 30 - Immediate + SMOOTH + RGB + glRect 31 - Immediate + SMOOTH + RGB + glRectiv 32 - Immediate + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2); 33 - Immediate + SMOOTH + RGB + QUADS + glVertex2i(x2,y2); 100 - COMPILED + FLAT + ColorIndex + glRect 101 - COMPILED + FLAT + ColorIndex + glRectiv 102 - COMPILED + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2); 103 - COMPILED + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2); 110 - COMPILED + FLAT + RGB + glRect 111 - COMPILED + FLAT + RGB + glRectiv 112 - COMPILED + FLAT + RGB + POLYGON + glVertex2i(x2,y2); 113 - COMPILED + FLAT + RGB + QUADS + glVertex2i(x2,y2); 120 - COMPILED + SMOOTH + ColorIndex + glRect 121 - COMPILED + SMOOTH + ColorIndex + glRectiv 122 - COMPILED + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2); 123 - COMPILED + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2); 130 - COMPILED + SMOOTH + RGB + glRect 131 - COMPILED + SMOOTH + RGB + glRectiv 132 - COMPILED + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2); 133 - COMPILED + SMOOTH + RGB + GL_QUADS+ glVertex2i(x2,y2); trying mode: 112 >MODE 112: FrontBuffer + COMPILED + Flat + RGB + POLYGON + glVertex2i >Time for fetching Seis-Data: 0.641 >Time for map color-table: 0.05 >`gl_display(displayList)- rectangles put in displayList: 1000000 >relative time: (display-list only) ... elapsed time: 8.372 Sec ... rate: 8.372 SPMR (Sec Per Million Rectangles) >absolute time: (display-list and calculations) ... elapsed time: 9.073 Sec ... rate: 9.073 SPMR (Sec Per Million Rectangles) ... elapsed time: 15.563 Sec ... rate: 15.563 SPMR (Sec Per Million Rectangles) >relative time: (display-list called) ... elapsed time: 6.49 Sec ... rate: 6.49 SPMR (Sec Per Million Rectangles) >absolute time: (display-list compiled+called+calculations) ... elapsed time: 15.563 Sec ... rate: 15.563 SPMR (Sec Per Million Rectangles) trying mode: 113 >MODE 113: FrontBuffer + COMPILED + Flat + RGB + QUADS + glVertex2i >Time for fetching Seis-Data: 0.631 >Time for map color-table: 0.05 >`gl_display(displayList)- rectangles put in displayList: 1000000 >relative time: (display-list only) ... elapsed time: 6.159 Sec ... rate: 6.159 SPMR (Sec Per Million Rectangles) >absolute time: (display-list and calculations) ... elapsed time: 6.84 Sec ... rate: 6.84 SPMR (Sec Per Million Rectangles) ... elapsed time: 12.147 Sec ... rate: 12.147 SPMR (Sec Per Million Rectangles) >relative time: (display-list called) ... elapsed time: 5.317 Sec ... rate: 5.317 SPMR (Sec Per Million Rectangles) >absolute time: (display-list compiled+called+calculations) ... elapsed time: 12.157 Sec ... rate: 12.157 SPMR (Sec Per Million Rectangles) \ No newline at end of file
diff --git a/demos/RectRenderSpeed/perfomance-Win32-400MHzPII-MatroxG200.txt b/demos/RectRenderSpeed/perfomance-Win32-400MHzPII-MatroxG200.txt
new file mode 100644
index 0000000..4cba0c7
--- /dev/null
+++ b/demos/RectRenderSpeed/perfomance-Win32-400MHzPII-MatroxG200.txt
@@ -0,0 +1,247 @@
+I used platform:
+
+Matrox G200 with new driver !
+Windows NT 4.0 SP5 !
+329 MB RAM !
+400 MhZ PII !
+
+Running under Java2 & Cygwin32-Bash & ShellScript GL4JTests2.sh !
+
+
+args: help 0 1 2 3 100 101 102 103
+Arguments:
+ help - print this help
+ dbl - use doublebuffer
+ <mode> - render mode, where mode is one of the following integer values :
+ 0 - Immediate + FLAT + ColorIndex + glRect
+ 1 - Immediate + FLAT + ColorIndex + glRectiv
+ 2 - Immediate + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2);
+ 3 - Immediate + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2);
+ 10 - Immediate + FLAT + RGB + glRect
+ 11 - Immediate + FLAT + RGB + glRectiv
+ 12 - Immediate + FLAT + RGB + POLYGON + glVertex2i(x2,y2);
+ 13 - Immediate + FLAT + RGB + QUADS + glVertex2i(x2,y2);
+ 20 - Immediate + SMOOTH + ColorIndex + glRect
+ 21 - Immediate + SMOOTH + ColorIndex + glRectiv
+ 22 - Immediate + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2);
+ 23 - Immediate + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2);
+ 30 - Immediate + SMOOTH + RGB + glRect
+ 31 - Immediate + SMOOTH + RGB + glRectiv
+ 32 - Immediate + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2);
+ 33 - Immediate + SMOOTH + RGB + QUADS + glVertex2i(x2,y2);
+100 - COMPILED + FLAT + ColorIndex + glRect
+101 - COMPILED + FLAT + ColorIndex + glRectiv
+102 - COMPILED + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2);
+103 - COMPILED + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2);
+110 - COMPILED + FLAT + RGB + glRect
+111 - COMPILED + FLAT + RGB + glRectiv
+112 - COMPILED + FLAT + RGB + POLYGON + glVertex2i(x2,y2);
+113 - COMPILED + FLAT + RGB + QUADS + glVertex2i(x2,y2);
+120 - COMPILED + SMOOTH + ColorIndex + glRect
+121 - COMPILED + SMOOTH + ColorIndex + glRectiv
+122 - COMPILED + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2);
+123 - COMPILED + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2);
+130 - COMPILED + SMOOTH + RGB + glRect
+131 - COMPILED + SMOOTH + RGB + glRectiv
+132 - COMPILED + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2);
+133 - COMPILED + SMOOTH + RGB + GL_QUADS+ glVertex2i(x2,y2);
+
+
+trying mode: 0
+>MODE 0: FrontBuffer + IMMEDIATE + Flat + ColorIndex + glRect
+>Time for fetching Seis-Data: 0.631
+>Time for map color-table: 0.05
+>`gl_display(immediate)- rectangles rendered: 1000000
+>relative time: (immediate only)
+... elapsed time: 60.858 Sec
+... rate: 60.858000000000004 SPMR (Sec Per Million Rectangles)
+>absolute time: (immediate and calculations)
+... elapsed time: 61.549 Sec
+... rate: 61.549 SPMR (Sec Per Million Rectangles)
+trying mode: 1
+>MODE 1: FrontBuffer + IMMEDIATE + Flat + ColorIndex + glRectiv
+>Time for fetching Seis-Data: 0.631
+>Time for map color-table: 0.04
+>`gl_display(immediate)- rectangles rendered: 1000000
+>relative time: (immediate only)
+... elapsed time: 67.547 Sec
+... rate: 67.547 SPMR (Sec Per Million Rectangles)
+>absolute time: (immediate and calculations)
+... elapsed time: 68.218 Sec
+... rate: 68.218 SPMR (Sec Per Million Rectangles)
+trying mode: 2
+>MODE 2: FrontBuffer + IMMEDIATE + Flat + ColorIndex + POLYGON + glVertex2i
+>Time for fetching Seis-Data: 0.631
+>Time for map color-table: 0.05
+>`gl_display(immediate)- rectangles rendered: 1000000
+>relative time: (immediate only)
+... elapsed time: 8.782 Sec
+... rate: 8.782 SPMR (Sec Per Million Rectangles)
+>absolute time: (immediate and calculations)
+... elapsed time: 9.473 Sec
+... rate: 9.473 SPMR (Sec Per Million Rectangles)
+trying mode: 3
+>MODE 3: FrontBuffer + IMMEDIATE + Flat + ColorIndex + QUADS + glVertex2i
+>Time for fetching Seis-Data: 0.631
+>Time for map color-table: 0.04
+>`gl_display(immediate)- rectangles rendered: 1000000
+>relative time: (immediate only)
+... elapsed time: 7.051 Sec
+... rate: 7.051 SPMR (Sec Per Million Rectangles)
+>absolute time: (immediate and calculations)
+... elapsed time: 7.722 Sec
+... rate: 7.722 SPMR (Sec Per Million Rectangles)
+trying mode: 100
+>MODE 100: FrontBuffer + COMPILED + Flat + ColorIndex + glRect
+>Time for fetching Seis-Data: 0.63
+>Time for map color-table: 0.051
+>`gl_display(displayList)- rectangles put in displayList: 1000000
+>relative time: (display-list only)
+... elapsed time: 2.894 Sec
+... rate: 2.894 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list and calculations)
+... elapsed time: 3.575 Sec
+... rate: 3.575 SPMR (Sec Per Million Rectangles)
+... elapsed time: 56.571 Sec
+... rate: 56.571 SPMR (Sec Per Million Rectangles)
+>relative time: (display-list called)
+... elapsed time: 52.996 Sec
+... rate: 52.996 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list compiled+called+calculations)
+... elapsed time: 56.571 Sec
+... rate: 56.571 SPMR (Sec Per Million Rectangles)
+trying mode: 101
+>MODE 101: FrontBuffer + COMPILED + Flat + ColorIndex + glRectiv
+>Time for fetching Seis-Data: 0.631
+>Time for map color-table: 0.04
+>`gl_display(displayList)- rectangles put in displayList: 1000000
+>relative time: (display-list only)
+... elapsed time: 4.867 Sec
+... rate: 4.867 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list and calculations)
+... elapsed time: 5.548 Sec
+... rate: 5.548 SPMR (Sec Per Million Rectangles)
+... elapsed time: 59.245 Sec
+... rate: 59.245000000000005 SPMR (Sec Per Million Rectangles)
+>relative time: (display-list called)
+... elapsed time: 53.707 Sec
+... rate: 53.707 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list compiled+called+calculations)
+... elapsed time: 59.255 Sec
+... rate: 59.255 SPMR (Sec Per Million Rectangles)
+trying mode: 102
+>MODE 102: FrontBuffer + COMPILED + Flat + ColorIndex + POLYGON + glVertex2i
+>Time for fetching Seis-Data: 0.641
+>Time for map color-table: 0.05
+>`gl_display(displayList)- rectangles put in displayList: 1000000
+>relative time: (display-list only)
+... elapsed time: 25.947 Sec
+... rate: 25.947 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list and calculations)
+... elapsed time: 26.899 Sec
+... rate: 26.899 SPMR (Sec Per Million Rectangles)
+... elapsed time: 34.35 Sec
+... rate: 34.35 SPMR (Sec Per Million Rectangles)
+>relative time: (display-list called)
+... elapsed time: 7.391 Sec
+... rate: 7.391 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list compiled+called+calculations)
+... elapsed time: 34.35 Sec
+... rate: 34.35 SPMR (Sec Per Million Rectangles)
+trying mode: 103
+>MODE 103: FrontBuffer + COMPILED + Flat + ColorIndex + QUADS + glVertex2i
+>Time for fetching Seis-Data: 0.791
+>Time for map color-table: 0.05
+>`gl_display(displayList)- rectangles put in displayList: 1000000
+>relative time: (display-list only)
+... elapsed time: 7.671 Sec
+... rate: 7.671 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list and calculations)
+... elapsed time: 10.796 Sec
+... rate: 10.796 SPMR (Sec Per Million Rectangles)
+... elapsed time: 16.314 Sec
+... rate: 16.314 SPMR (Sec Per Million Rectangles)
+>relative time: (display-list called)
+... elapsed time: 5.498 Sec
+... rate: 5.498 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list compiled+called+calculations)
+... elapsed time: 16.334 Sec
+... rate: 16.334 SPMR (Sec Per Million Rectangles)
+
+args: help 112 113
+Arguments:
+ help - print this help
+ dbl - use doublebuffer
+ <mode> - render mode, where mode is one of the following integer values :
+ 0 - Immediate + FLAT + ColorIndex + glRect
+ 1 - Immediate + FLAT + ColorIndex + glRectiv
+ 2 - Immediate + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2);
+ 3 - Immediate + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2);
+ 10 - Immediate + FLAT + RGB + glRect
+ 11 - Immediate + FLAT + RGB + glRectiv
+ 12 - Immediate + FLAT + RGB + POLYGON + glVertex2i(x2,y2);
+ 13 - Immediate + FLAT + RGB + QUADS + glVertex2i(x2,y2);
+ 20 - Immediate + SMOOTH + ColorIndex + glRect
+ 21 - Immediate + SMOOTH + ColorIndex + glRectiv
+ 22 - Immediate + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2);
+ 23 - Immediate + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2);
+ 30 - Immediate + SMOOTH + RGB + glRect
+ 31 - Immediate + SMOOTH + RGB + glRectiv
+ 32 - Immediate + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2);
+ 33 - Immediate + SMOOTH + RGB + QUADS + glVertex2i(x2,y2);
+100 - COMPILED + FLAT + ColorIndex + glRect
+101 - COMPILED + FLAT + ColorIndex + glRectiv
+102 - COMPILED + FLAT + ColorIndex + POLYGON + glVertex2i(x2,y2);
+103 - COMPILED + FLAT + ColorIndex + QUADS + glVertex2i(x2,y2);
+110 - COMPILED + FLAT + RGB + glRect
+111 - COMPILED + FLAT + RGB + glRectiv
+112 - COMPILED + FLAT + RGB + POLYGON + glVertex2i(x2,y2);
+113 - COMPILED + FLAT + RGB + QUADS + glVertex2i(x2,y2);
+120 - COMPILED + SMOOTH + ColorIndex + glRect
+121 - COMPILED + SMOOTH + ColorIndex + glRectiv
+122 - COMPILED + SMOOTH + ColorIndex + POLYGON + glVertex2i(x2,y2);
+123 - COMPILED + SMOOTH + ColorIndex + QUADS + glVertex2i(x2,y2);
+130 - COMPILED + SMOOTH + RGB + glRect
+131 - COMPILED + SMOOTH + RGB + glRectiv
+132 - COMPILED + SMOOTH + RGB + POLYGON + glVertex2i(x2,y2);
+133 - COMPILED + SMOOTH + RGB + GL_QUADS+ glVertex2i(x2,y2);
+
+
+trying mode: 112
+>MODE 112: FrontBuffer + COMPILED + Flat + RGB + POLYGON + glVertex2i
+>Time for fetching Seis-Data: 0.641
+>Time for map color-table: 0.05
+>`gl_display(displayList)- rectangles put in displayList: 1000000
+>relative time: (display-list only)
+... elapsed time: 8.372 Sec
+... rate: 8.372 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list and calculations)
+... elapsed time: 9.073 Sec
+... rate: 9.073 SPMR (Sec Per Million Rectangles)
+... elapsed time: 15.563 Sec
+... rate: 15.563 SPMR (Sec Per Million Rectangles)
+>relative time: (display-list called)
+... elapsed time: 6.49 Sec
+... rate: 6.49 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list compiled+called+calculations)
+... elapsed time: 15.563 Sec
+... rate: 15.563 SPMR (Sec Per Million Rectangles)
+trying mode: 113
+>MODE 113: FrontBuffer + COMPILED + Flat + RGB + QUADS + glVertex2i
+>Time for fetching Seis-Data: 0.631
+>Time for map color-table: 0.05
+>`gl_display(displayList)- rectangles put in displayList: 1000000
+>relative time: (display-list only)
+... elapsed time: 6.159 Sec
+... rate: 6.159 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list and calculations)
+... elapsed time: 6.84 Sec
+... rate: 6.84 SPMR (Sec Per Million Rectangles)
+... elapsed time: 12.147 Sec
+... rate: 12.147 SPMR (Sec Per Million Rectangles)
+>relative time: (display-list called)
+... elapsed time: 5.317 Sec
+... rate: 5.317 SPMR (Sec Per Million Rectangles)
+>absolute time: (display-list compiled+called+calculations)
+... elapsed time: 12.157 Sec
+... rate: 12.157 SPMR (Sec Per Million Rectangles)
diff --git a/demos/RonsDemos/DemoTex1.java b/demos/RonsDemos/DemoTex1.java
new file mode 100644
index 0000000..60477f9
--- /dev/null
+++ b/demos/RonsDemos/DemoTex1.java
@@ -0,0 +1,4158 @@
+/**
+ * @(#) DemoTex1.java
+ * @(#) author: Ronald B. Cemer
+ * @(#) version: 1.0
+ */
+
+import java.io.*;
+import gl4java.GLEnum;
+
+public class DemoTex1 implements HardCodedTexture, GLEnum
+{
+ private static final int width = 64;
+ private static final int height = 64;
+ private static final byte bits[] =
+ {
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x29,(byte)0x20,(byte)0x20,
+ (byte)0x18,(byte)0x18,(byte)0x18,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x20,(byte)0x10,(byte)0x10,
+ (byte)0x29,(byte)0x18,(byte)0x18,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x31,(byte)0x18,(byte)0x18,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x18,(byte)0x08,(byte)0x10,
+ (byte)0x4a,(byte)0x39,(byte)0x41,
+ (byte)0x5a,(byte)0x4a,(byte)0x52,
+ (byte)0x7b,(byte)0x62,(byte)0x62,
+ (byte)0x7b,(byte)0x62,(byte)0x62,
+ (byte)0x83,(byte)0x73,(byte)0x6a,
+ (byte)0x6a,(byte)0x62,(byte)0x52,
+ (byte)0x6a,(byte)0x62,(byte)0x5a,
+ (byte)0x5a,(byte)0x52,(byte)0x4a,
+ (byte)0x39,(byte)0x31,(byte)0x31,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x08,(byte)0x00,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x20,(byte)0x20,(byte)0x20,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x5a,(byte)0x39,(byte)0x4a,
+ (byte)0x62,(byte)0x39,(byte)0x4a,
+ (byte)0x73,(byte)0x41,(byte)0x5a,
+ (byte)0x7b,(byte)0x41,(byte)0x52,
+ (byte)0x8b,(byte)0x41,(byte)0x5a,
+ (byte)0x83,(byte)0x39,(byte)0x4a,
+ (byte)0x73,(byte)0x41,(byte)0x41,
+ (byte)0x6a,(byte)0x52,(byte)0x41,
+ (byte)0x6a,(byte)0x5a,(byte)0x4a,
+ (byte)0x6a,(byte)0x62,(byte)0x4a,
+ (byte)0x39,(byte)0x39,(byte)0x29,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x18,(byte)0x18,(byte)0x20,
+ (byte)0x31,(byte)0x31,(byte)0x39,
+ (byte)0x41,(byte)0x41,(byte)0x4a,
+ (byte)0x4a,(byte)0x41,(byte)0x4a,
+ (byte)0x31,(byte)0x31,(byte)0x39,
+ (byte)0x39,(byte)0x39,(byte)0x39,
+ (byte)0x4a,(byte)0x39,(byte)0x31,
+ (byte)0x5a,(byte)0x31,(byte)0x31,
+ (byte)0x5a,(byte)0x31,(byte)0x41,
+ (byte)0x62,(byte)0x20,(byte)0x39,
+ (byte)0x6a,(byte)0x18,(byte)0x39,
+ (byte)0x6a,(byte)0x31,(byte)0x41,
+ (byte)0x5a,(byte)0x29,(byte)0x39,
+ (byte)0x41,(byte)0x10,(byte)0x18,
+ (byte)0x4a,(byte)0x20,(byte)0x31,
+ (byte)0x4a,(byte)0x31,(byte)0x41,
+ (byte)0x52,(byte)0x31,(byte)0x41,
+ (byte)0x62,(byte)0x41,(byte)0x4a,
+ (byte)0x5a,(byte)0x29,(byte)0x31,
+ (byte)0x39,(byte)0x20,(byte)0x18,
+ (byte)0x39,(byte)0x39,(byte)0x29,
+ (byte)0x52,(byte)0x52,(byte)0x41,
+ (byte)0x41,(byte)0x39,(byte)0x39,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x31,(byte)0x29,(byte)0x39,
+ (byte)0x29,(byte)0x29,(byte)0x39,
+ (byte)0x18,(byte)0x18,(byte)0x20,
+ (byte)0x20,(byte)0x20,(byte)0x29,
+ (byte)0x4a,(byte)0x4a,(byte)0x52,
+ (byte)0x73,(byte)0x7b,(byte)0x8b,
+ (byte)0x4a,(byte)0x4a,(byte)0x52,
+ (byte)0x41,(byte)0x39,(byte)0x39,
+ (byte)0x29,(byte)0x20,(byte)0x18,
+ (byte)0x62,(byte)0x41,(byte)0x52,
+ (byte)0x94,(byte)0x62,(byte)0x83,
+ (byte)0x9c,(byte)0x62,(byte)0x83,
+ (byte)0x8b,(byte)0x5a,(byte)0x83,
+ (byte)0x8b,(byte)0x62,(byte)0x94,
+ (byte)0x9c,(byte)0x83,(byte)0xb4,
+ (byte)0x9c,(byte)0x8b,(byte)0xbd,
+ (byte)0x83,(byte)0x6a,(byte)0x94,
+ (byte)0x83,(byte)0x6a,(byte)0x83,
+ (byte)0x8b,(byte)0x62,(byte)0x8b,
+ (byte)0x7b,(byte)0x6a,(byte)0x94,
+ (byte)0x83,(byte)0x6a,(byte)0x94,
+ (byte)0x94,(byte)0x94,(byte)0xb4,
+ (byte)0xa4,(byte)0x7b,(byte)0xac,
+ (byte)0x83,(byte)0x41,(byte)0x73,
+ (byte)0x41,(byte)0x18,(byte)0x29,
+ (byte)0x31,(byte)0x29,(byte)0x20,
+ (byte)0x5a,(byte)0x52,(byte)0x4a,
+ (byte)0x39,(byte)0x31,(byte)0x29,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x20,(byte)0x18,(byte)0x29,
+ (byte)0x31,(byte)0x31,(byte)0x39,
+ (byte)0x29,(byte)0x29,(byte)0x31,
+ (byte)0x10,(byte)0x10,(byte)0x18,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x52,(byte)0x41,(byte)0x52,
+ (byte)0x7b,(byte)0x6a,(byte)0x8b,
+ (byte)0x6a,(byte)0x6a,(byte)0x73,
+ (byte)0x41,(byte)0x41,(byte)0x4a,
+ (byte)0x41,(byte)0x29,(byte)0x41,
+ (byte)0x41,(byte)0x31,(byte)0x4a,
+ (byte)0x73,(byte)0x62,(byte)0x8b,
+ (byte)0x9c,(byte)0x9c,(byte)0xde,
+ (byte)0x7b,(byte)0xa4,(byte)0xde,
+ (byte)0x6a,(byte)0xac,(byte)0xde,
+ (byte)0x6a,(byte)0xa4,(byte)0xde,
+ (byte)0x62,(byte)0xa4,(byte)0xde,
+ (byte)0x6a,(byte)0xa4,(byte)0xde,
+ (byte)0x73,(byte)0xac,(byte)0xe6,
+ (byte)0x73,(byte)0xa4,(byte)0xde,
+ (byte)0x73,(byte)0xa4,(byte)0xd5,
+ (byte)0x73,(byte)0x9c,(byte)0xcd,
+ (byte)0x7b,(byte)0xac,(byte)0xde,
+ (byte)0x83,(byte)0xb4,(byte)0xe6,
+ (byte)0x9c,(byte)0xac,(byte)0xde,
+ (byte)0x94,(byte)0x62,(byte)0x8b,
+ (byte)0x39,(byte)0x18,(byte)0x18,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x20,(byte)0x20,(byte)0x20,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x29,(byte)0x20,(byte)0x18,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x31,(byte)0x20,(byte)0x29,
+ (byte)0x29,(byte)0x20,(byte)0x29,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x20,(byte)0x18,(byte)0x08,
+ (byte)0x31,(byte)0x20,(byte)0x18,
+ (byte)0x6a,(byte)0x41,(byte)0x52,
+ (byte)0xac,(byte)0x94,(byte)0xbd,
+ (byte)0xbd,(byte)0xbd,(byte)0xee,
+ (byte)0xa4,(byte)0x8b,(byte)0xb4,
+ (byte)0x8b,(byte)0x73,(byte)0x94,
+ (byte)0xa4,(byte)0x8b,(byte)0xbd,
+ (byte)0x94,(byte)0x94,(byte)0xc5,
+ (byte)0x8b,(byte)0xa4,(byte)0xd5,
+ (byte)0x83,(byte)0xac,(byte)0xde,
+ (byte)0x73,(byte)0xa4,(byte)0xde,
+ (byte)0x6a,(byte)0x9c,(byte)0xd5,
+ (byte)0x62,(byte)0x94,(byte)0xd5,
+ (byte)0x52,(byte)0x8b,(byte)0xc5,
+ (byte)0x4a,(byte)0x83,(byte)0xc5,
+ (byte)0x4a,(byte)0x83,(byte)0xc5,
+ (byte)0x52,(byte)0x8b,(byte)0xc5,
+ (byte)0x52,(byte)0x8b,(byte)0xcd,
+ (byte)0x52,(byte)0x94,(byte)0xcd,
+ (byte)0x5a,(byte)0x94,(byte)0xcd,
+ (byte)0x62,(byte)0x9c,(byte)0xd5,
+ (byte)0x73,(byte)0xac,(byte)0xe6,
+ (byte)0x9c,(byte)0x94,(byte)0xcd,
+ (byte)0x7b,(byte)0x41,(byte)0x62,
+ (byte)0x5a,(byte)0x39,(byte)0x39,
+ (byte)0x39,(byte)0x39,(byte)0x29,
+ (byte)0x29,(byte)0x20,(byte)0x20,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x29,(byte)0x29,(byte)0x20,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x29,(byte)0x18,(byte)0x10,
+ (byte)0x39,(byte)0x29,(byte)0x29,
+ (byte)0x31,(byte)0x20,(byte)0x18,
+ (byte)0x18,(byte)0x18,(byte)0x08,
+ (byte)0x41,(byte)0x39,(byte)0x29,
+ (byte)0x94,(byte)0x73,(byte)0x8b,
+ (byte)0xbd,(byte)0xa4,(byte)0xcd,
+ (byte)0xcd,(byte)0xcd,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xc5,(byte)0xcd,(byte)0xf6,
+ (byte)0xcd,(byte)0xc5,(byte)0xee,
+ (byte)0xc5,(byte)0xd5,(byte)0xff,
+ (byte)0xb4,(byte)0xcd,(byte)0xf6,
+ (byte)0xa4,(byte)0xc5,(byte)0xee,
+ (byte)0x94,(byte)0xbd,(byte)0xe6,
+ (byte)0x83,(byte)0xac,(byte)0xde,
+ (byte)0x7b,(byte)0xa4,(byte)0xde,
+ (byte)0x7b,(byte)0xa4,(byte)0xde,
+ (byte)0x62,(byte)0x94,(byte)0xcd,
+ (byte)0x5a,(byte)0x8b,(byte)0xc5,
+ (byte)0x52,(byte)0x83,(byte)0xc5,
+ (byte)0x4a,(byte)0x83,(byte)0xc5,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x4a,(byte)0x83,(byte)0xc5,
+ (byte)0x4a,(byte)0x83,(byte)0xc5,
+ (byte)0x52,(byte)0x8b,(byte)0xcd,
+ (byte)0x62,(byte)0x9c,(byte)0xd5,
+ (byte)0x7b,(byte)0x9c,(byte)0xd5,
+ (byte)0x94,(byte)0x5a,(byte)0x8b,
+ (byte)0x6a,(byte)0x31,(byte)0x31,
+ (byte)0x41,(byte)0x39,(byte)0x29,
+ (byte)0x39,(byte)0x31,(byte)0x31,
+ (byte)0x41,(byte)0x41,(byte)0x41,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x39,(byte)0x20,(byte)0x20,
+ (byte)0x41,(byte)0x31,(byte)0x31,
+ (byte)0x18,(byte)0x18,(byte)0x08,
+ (byte)0x29,(byte)0x20,(byte)0x10,
+ (byte)0x5a,(byte)0x41,(byte)0x41,
+ (byte)0x9c,(byte)0x73,(byte)0x9c,
+ (byte)0xac,(byte)0xa4,(byte)0xc5,
+ (byte)0xac,(byte)0xb4,(byte)0xd5,
+ (byte)0xbd,(byte)0xc5,(byte)0xee,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xc5,(byte)0xd5,(byte)0xf6,
+ (byte)0xb4,(byte)0xcd,(byte)0xf6,
+ (byte)0xac,(byte)0xc5,(byte)0xee,
+ (byte)0xac,(byte)0xc5,(byte)0xee,
+ (byte)0x9c,(byte)0xb4,(byte)0xe6,
+ (byte)0x8b,(byte)0xb4,(byte)0xde,
+ (byte)0x94,(byte)0xb4,(byte)0xe6,
+ (byte)0x83,(byte)0xa4,(byte)0xde,
+ (byte)0x6a,(byte)0x94,(byte)0xd5,
+ (byte)0x5a,(byte)0x8b,(byte)0xcd,
+ (byte)0x5a,(byte)0x8b,(byte)0xc5,
+ (byte)0x5a,(byte)0x83,(byte)0xc5,
+ (byte)0x41,(byte)0x73,(byte)0xbd,
+ (byte)0x39,(byte)0x6a,(byte)0xb4,
+ (byte)0x41,(byte)0x73,(byte)0xb4,
+ (byte)0x41,(byte)0x73,(byte)0xbd,
+ (byte)0x39,(byte)0x73,(byte)0xb4,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x4a,(byte)0x83,(byte)0xc5,
+ (byte)0x52,(byte)0x94,(byte)0xcd,
+ (byte)0x73,(byte)0xa4,(byte)0xde,
+ (byte)0x9c,(byte)0x62,(byte)0x9c,
+ (byte)0x7b,(byte)0x31,(byte)0x52,
+ (byte)0x5a,(byte)0x4a,(byte)0x52,
+ (byte)0x4a,(byte)0x4a,(byte)0x41,
+ (byte)0x41,(byte)0x39,(byte)0x39,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x29,(byte)0x18,(byte)0x18,
+ (byte)0x39,(byte)0x20,(byte)0x20,
+ (byte)0x41,(byte)0x31,(byte)0x41,
+ (byte)0x31,(byte)0x31,(byte)0x20,
+ (byte)0x41,(byte)0x41,(byte)0x20,
+ (byte)0x5a,(byte)0x39,(byte)0x41,
+ (byte)0x9c,(byte)0x83,(byte)0xa4,
+ (byte)0xc5,(byte)0xcd,(byte)0xee,
+ (byte)0xac,(byte)0xac,(byte)0xcd,
+ (byte)0xbd,(byte)0xbd,(byte)0xde,
+ (byte)0xd5,(byte)0xd5,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xc5,(byte)0xcd,(byte)0xf6,
+ (byte)0xb4,(byte)0xcd,(byte)0xf6,
+ (byte)0xac,(byte)0xc5,(byte)0xee,
+ (byte)0xa4,(byte)0xc5,(byte)0xee,
+ (byte)0x94,(byte)0xb4,(byte)0xe6,
+ (byte)0x8b,(byte)0xac,(byte)0xde,
+ (byte)0x8b,(byte)0xac,(byte)0xde,
+ (byte)0x8b,(byte)0xac,(byte)0xde,
+ (byte)0x83,(byte)0xa4,(byte)0xde,
+ (byte)0x73,(byte)0x9c,(byte)0xd5,
+ (byte)0x6a,(byte)0x94,(byte)0xcd,
+ (byte)0x5a,(byte)0x83,(byte)0xc5,
+ (byte)0x5a,(byte)0x83,(byte)0xc5,
+ (byte)0x5a,(byte)0x8b,(byte)0xc5,
+ (byte)0x4a,(byte)0x7b,(byte)0xbd,
+ (byte)0x41,(byte)0x6a,(byte)0xb4,
+ (byte)0x39,(byte)0x73,(byte)0xb4,
+ (byte)0x39,(byte)0x6a,(byte)0xb4,
+ (byte)0x39,(byte)0x73,(byte)0xb4,
+ (byte)0x39,(byte)0x73,(byte)0xb4,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x52,(byte)0x8b,(byte)0xcd,
+ (byte)0x6a,(byte)0x94,(byte)0xd5,
+ (byte)0x8b,(byte)0x6a,(byte)0xa4,
+ (byte)0x7b,(byte)0x4a,(byte)0x73,
+ (byte)0x52,(byte)0x41,(byte)0x4a,
+ (byte)0x41,(byte)0x39,(byte)0x39,
+ (byte)0x29,(byte)0x29,(byte)0x20,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x39,(byte)0x29,(byte)0x20,
+ (byte)0x29,(byte)0x20,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x08,
+ (byte)0x29,(byte)0x10,(byte)0x10,
+ (byte)0x31,(byte)0x29,(byte)0x29,
+ (byte)0x4a,(byte)0x4a,(byte)0x41,
+ (byte)0x41,(byte)0x4a,(byte)0x4a,
+ (byte)0x4a,(byte)0x4a,(byte)0x5a,
+ (byte)0x41,(byte)0x41,(byte)0x62,
+ (byte)0xb4,(byte)0xbd,(byte)0xe6,
+ (byte)0xd5,(byte)0xde,(byte)0xff,
+ (byte)0xd5,(byte)0xde,(byte)0xff,
+ (byte)0xd5,(byte)0xde,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xc5,(byte)0xd5,(byte)0xf6,
+ (byte)0xc5,(byte)0xcd,(byte)0xf6,
+ (byte)0xb4,(byte)0xcd,(byte)0xf6,
+ (byte)0xac,(byte)0xc5,(byte)0xee,
+ (byte)0x9c,(byte)0xbd,(byte)0xe6,
+ (byte)0x9c,(byte)0xb4,(byte)0xe6,
+ (byte)0x94,(byte)0xb4,(byte)0xe6,
+ (byte)0x94,(byte)0xb4,(byte)0xe6,
+ (byte)0x83,(byte)0xac,(byte)0xde,
+ (byte)0x6a,(byte)0x94,(byte)0xd5,
+ (byte)0x5a,(byte)0x8b,(byte)0xcd,
+ (byte)0x5a,(byte)0x8b,(byte)0xc5,
+ (byte)0x5a,(byte)0x83,(byte)0xc5,
+ (byte)0x52,(byte)0x7b,(byte)0xbd,
+ (byte)0x4a,(byte)0x7b,(byte)0xbd,
+ (byte)0x41,(byte)0x6a,(byte)0xb4,
+ (byte)0x31,(byte)0x62,(byte)0xa4,
+ (byte)0x31,(byte)0x62,(byte)0xa4,
+ (byte)0x39,(byte)0x6a,(byte)0xb4,
+ (byte)0x39,(byte)0x6a,(byte)0xac,
+ (byte)0x31,(byte)0x6a,(byte)0xb4,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x4a,(byte)0x8b,(byte)0xcd,
+ (byte)0x62,(byte)0x9c,(byte)0xd5,
+ (byte)0x7b,(byte)0x83,(byte)0xb4,
+ (byte)0x7b,(byte)0x5a,(byte)0x7b,
+ (byte)0x29,(byte)0x18,(byte)0x20,
+ (byte)0x20,(byte)0x10,(byte)0x10,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x41,(byte)0x41,(byte)0x39,
+ (byte)0x39,(byte)0x31,(byte)0x31,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x39,(byte)0x31,(byte)0x29,
+ (byte)0x5a,(byte)0x52,(byte)0x5a,
+ (byte)0x4a,(byte)0x52,(byte)0x6a,
+ (byte)0x31,(byte)0x39,(byte)0x62,
+ (byte)0x29,(byte)0x29,(byte)0x41,
+ (byte)0x6a,(byte)0x73,(byte)0x8b,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xc5,(byte)0xcd,(byte)0xf6,
+ (byte)0xac,(byte)0xc5,(byte)0xee,
+ (byte)0xac,(byte)0xc5,(byte)0xee,
+ (byte)0xb4,(byte)0xc5,(byte)0xee,
+ (byte)0xa4,(byte)0xc5,(byte)0xee,
+ (byte)0x8b,(byte)0xb4,(byte)0xde,
+ (byte)0x7b,(byte)0xa4,(byte)0xde,
+ (byte)0x73,(byte)0x9c,(byte)0xd5,
+ (byte)0x62,(byte)0x94,(byte)0xcd,
+ (byte)0x5a,(byte)0x8b,(byte)0xc5,
+ (byte)0x52,(byte)0x83,(byte)0xc5,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x39,(byte)0x6a,(byte)0xb4,
+ (byte)0x39,(byte)0x6a,(byte)0xb4,
+ (byte)0x41,(byte)0x73,(byte)0xb4,
+ (byte)0x39,(byte)0x6a,(byte)0xac,
+ (byte)0x31,(byte)0x62,(byte)0xa4,
+ (byte)0x39,(byte)0x6a,(byte)0xac,
+ (byte)0x39,(byte)0x6a,(byte)0xac,
+ (byte)0x31,(byte)0x62,(byte)0xac,
+ (byte)0x31,(byte)0x6a,(byte)0xb4,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x52,(byte)0x8b,(byte)0xcd,
+ (byte)0x6a,(byte)0xa4,(byte)0xde,
+ (byte)0x9c,(byte)0xb4,(byte)0xe6,
+ (byte)0x6a,(byte)0x5a,(byte)0x73,
+ (byte)0x20,(byte)0x20,(byte)0x29,
+ (byte)0x20,(byte)0x18,(byte)0x20,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x10,(byte)0x18,
+ (byte)0x29,(byte)0x20,(byte)0x20,
+ (byte)0x39,(byte)0x31,(byte)0x29,
+ (byte)0x52,(byte)0x41,(byte)0x39,
+ (byte)0x39,(byte)0x39,(byte)0x5a,
+ (byte)0x39,(byte)0x41,(byte)0x73,
+ (byte)0x31,(byte)0x39,(byte)0x5a,
+ (byte)0x29,(byte)0x29,(byte)0x41,
+ (byte)0x94,(byte)0xa4,(byte)0xc5,
+ (byte)0xd5,(byte)0xde,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xd5,(byte)0xde,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xc5,(byte)0xcd,(byte)0xf6,
+ (byte)0xbd,(byte)0xcd,(byte)0xf6,
+ (byte)0xbd,(byte)0xcd,(byte)0xf6,
+ (byte)0xb4,(byte)0xcd,(byte)0xf6,
+ (byte)0x9c,(byte)0xbd,(byte)0xee,
+ (byte)0x8b,(byte)0xb4,(byte)0xe6,
+ (byte)0x7b,(byte)0xac,(byte)0xde,
+ (byte)0x73,(byte)0x9c,(byte)0xd5,
+ (byte)0x62,(byte)0x94,(byte)0xcd,
+ (byte)0x52,(byte)0x83,(byte)0xc5,
+ (byte)0x4a,(byte)0x83,(byte)0xc5,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x39,(byte)0x73,(byte)0xb4,
+ (byte)0x39,(byte)0x73,(byte)0xb4,
+ (byte)0x39,(byte)0x73,(byte)0xb4,
+ (byte)0x39,(byte)0x6a,(byte)0xb4,
+ (byte)0x31,(byte)0x6a,(byte)0xac,
+ (byte)0x31,(byte)0x62,(byte)0xac,
+ (byte)0x31,(byte)0x62,(byte)0xac,
+ (byte)0x31,(byte)0x6a,(byte)0xb4,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x5a,(byte)0x94,(byte)0xcd,
+ (byte)0x7b,(byte)0xac,(byte)0xde,
+ (byte)0x94,(byte)0xac,(byte)0xde,
+ (byte)0xa4,(byte)0xb4,(byte)0xde,
+ (byte)0x73,(byte)0x73,(byte)0x8b,
+ (byte)0x10,(byte)0x08,(byte)0x10,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x20,(byte)0x10,(byte)0x10,
+ (byte)0x39,(byte)0x39,(byte)0x29,
+ (byte)0x4a,(byte)0x4a,(byte)0x39,
+ (byte)0x18,(byte)0x18,(byte)0x20,
+ (byte)0x20,(byte)0x20,(byte)0x39,
+ (byte)0x41,(byte)0x4a,(byte)0x73,
+ (byte)0x31,(byte)0x31,(byte)0x5a,
+ (byte)0x31,(byte)0x39,(byte)0x52,
+ (byte)0xb4,(byte)0xbd,(byte)0xe6,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xc5,(byte)0xd5,(byte)0xf6,
+ (byte)0xbd,(byte)0xcd,(byte)0xf6,
+ (byte)0xac,(byte)0xb4,(byte)0xe6,
+ (byte)0x94,(byte)0x9c,(byte)0xcd,
+ (byte)0x83,(byte)0x9c,(byte)0xd5,
+ (byte)0x62,(byte)0x9c,(byte)0xd5,
+ (byte)0x5a,(byte)0x94,(byte)0xcd,
+ (byte)0x52,(byte)0x8b,(byte)0xcd,
+ (byte)0x52,(byte)0x8b,(byte)0xcd,
+ (byte)0x52,(byte)0x8b,(byte)0xc5,
+ (byte)0x4a,(byte)0x83,(byte)0xc5,
+ (byte)0x41,(byte)0x83,(byte)0xc5,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x39,(byte)0x73,(byte)0xb4,
+ (byte)0x31,(byte)0x6a,(byte)0xb4,
+ (byte)0x31,(byte)0x6a,(byte)0xac,
+ (byte)0x31,(byte)0x62,(byte)0xac,
+ (byte)0x31,(byte)0x62,(byte)0xac,
+ (byte)0x29,(byte)0x62,(byte)0xac,
+ (byte)0x39,(byte)0x73,(byte)0xb4,
+ (byte)0x4a,(byte)0x83,(byte)0xc5,
+ (byte)0x6a,(byte)0x9c,(byte)0xd5,
+ (byte)0x83,(byte)0xb4,(byte)0xe6,
+ (byte)0x9c,(byte)0xc5,(byte)0xee,
+ (byte)0xbd,(byte)0xc5,(byte)0xf6,
+ (byte)0x73,(byte)0x62,(byte)0x83,
+ (byte)0x20,(byte)0x10,(byte)0x18,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x4a,(byte)0x4a,(byte)0x41,
+ (byte)0x31,(byte)0x31,(byte)0x4a,
+ (byte)0x18,(byte)0x20,(byte)0x31,
+ (byte)0x18,(byte)0x18,(byte)0x29,
+ (byte)0x39,(byte)0x41,(byte)0x6a,
+ (byte)0x29,(byte)0x31,(byte)0x52,
+ (byte)0x4a,(byte)0x52,(byte)0x6a,
+ (byte)0xc5,(byte)0xcd,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xc5,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xd5,(byte)0xd5,(byte)0xff,
+ (byte)0xd5,(byte)0xd5,(byte)0xff,
+ (byte)0xc5,(byte)0xcd,(byte)0xee,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xc5,(byte)0xac,(byte)0xde,
+ (byte)0x94,(byte)0x62,(byte)0x94,
+ (byte)0x6a,(byte)0x41,(byte)0x6a,
+ (byte)0x5a,(byte)0x39,(byte)0x5a,
+ (byte)0x83,(byte)0x94,(byte)0xcd,
+ (byte)0x7b,(byte)0xac,(byte)0xe6,
+ (byte)0x7b,(byte)0xac,(byte)0xde,
+ (byte)0x73,(byte)0xa4,(byte)0xde,
+ (byte)0x6a,(byte)0xa4,(byte)0xd5,
+ (byte)0x62,(byte)0x9c,(byte)0xd5,
+ (byte)0x52,(byte)0x94,(byte)0xcd,
+ (byte)0x52,(byte)0x8b,(byte)0xcd,
+ (byte)0x4a,(byte)0x8b,(byte)0xc5,
+ (byte)0x4a,(byte)0x83,(byte)0xc5,
+ (byte)0x41,(byte)0x83,(byte)0xbd,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x39,(byte)0x7b,(byte)0xbd,
+ (byte)0x39,(byte)0x73,(byte)0xb4,
+ (byte)0x31,(byte)0x6a,(byte)0xb4,
+ (byte)0x31,(byte)0x6a,(byte)0xac,
+ (byte)0x31,(byte)0x6a,(byte)0xb4,
+ (byte)0x41,(byte)0x83,(byte)0xbd,
+ (byte)0x5a,(byte)0x94,(byte)0xcd,
+ (byte)0x83,(byte)0xac,(byte)0xe6,
+ (byte)0x94,(byte)0xb4,(byte)0xe6,
+ (byte)0xb4,(byte)0xcd,(byte)0xf6,
+ (byte)0xbd,(byte)0xb4,(byte)0xe6,
+ (byte)0x52,(byte)0x41,(byte)0x4a,
+ (byte)0x29,(byte)0x10,(byte)0x10,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x29,(byte)0x20,(byte)0x10,
+ (byte)0x4a,(byte)0x41,(byte)0x39,
+ (byte)0x31,(byte)0x31,(byte)0x4a,
+ (byte)0x20,(byte)0x29,(byte)0x4a,
+ (byte)0x20,(byte)0x29,(byte)0x41,
+ (byte)0x18,(byte)0x20,(byte)0x31,
+ (byte)0x29,(byte)0x31,(byte)0x52,
+ (byte)0x29,(byte)0x39,(byte)0x5a,
+ (byte)0x62,(byte)0x6a,(byte)0x83,
+ (byte)0xd5,(byte)0xde,(byte)0xff,
+ (byte)0xd5,(byte)0xde,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xd5,(byte)0xd5,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xa4,(byte)0xa4,(byte)0xc5,
+ (byte)0xac,(byte)0xb4,(byte)0xd5,
+ (byte)0xcd,(byte)0xde,(byte)0xff,
+ (byte)0xbd,(byte)0xcd,(byte)0xf6,
+ (byte)0x7b,(byte)0x8b,(byte)0xa4,
+ (byte)0x29,(byte)0x29,(byte)0x29,
+ (byte)0x4a,(byte)0x4a,(byte)0x62,
+ (byte)0x94,(byte)0x83,(byte)0xb4,
+ (byte)0x8b,(byte)0x62,(byte)0x94,
+ (byte)0x9c,(byte)0x9c,(byte)0xcd,
+ (byte)0x94,(byte)0xa4,(byte)0xde,
+ (byte)0x83,(byte)0xa4,(byte)0xde,
+ (byte)0x73,(byte)0xac,(byte)0xde,
+ (byte)0x62,(byte)0x9c,(byte)0xd5,
+ (byte)0x62,(byte)0x9c,(byte)0xd5,
+ (byte)0x5a,(byte)0x94,(byte)0xd5,
+ (byte)0x5a,(byte)0x94,(byte)0xcd,
+ (byte)0x52,(byte)0x94,(byte)0xcd,
+ (byte)0x52,(byte)0x8b,(byte)0xcd,
+ (byte)0x4a,(byte)0x8b,(byte)0xc5,
+ (byte)0x4a,(byte)0x83,(byte)0xc5,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x39,(byte)0x73,(byte)0xbd,
+ (byte)0x41,(byte)0x7b,(byte)0xbd,
+ (byte)0x52,(byte)0x8b,(byte)0xcd,
+ (byte)0x83,(byte)0xac,(byte)0xde,
+ (byte)0x8b,(byte)0xb4,(byte)0xe6,
+ (byte)0xa4,(byte)0xc5,(byte)0xee,
+ (byte)0xc5,(byte)0xd5,(byte)0xff,
+ (byte)0xb4,(byte)0x94,(byte)0xbd,
+ (byte)0x5a,(byte)0x41,(byte)0x4a,
+ (byte)0x18,(byte)0x08,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x4a,(byte)0x4a,(byte)0x31,
+ (byte)0x62,(byte)0x4a,(byte)0x4a,
+ (byte)0x29,(byte)0x29,(byte)0x41,
+ (byte)0x29,(byte)0x29,(byte)0x41,
+ (byte)0x31,(byte)0x29,(byte)0x4a,
+ (byte)0x20,(byte)0x20,(byte)0x41,
+ (byte)0x18,(byte)0x20,(byte)0x31,
+ (byte)0x20,(byte)0x29,(byte)0x4a,
+ (byte)0x6a,(byte)0x6a,(byte)0x8b,
+ (byte)0xac,(byte)0xb4,(byte)0xd5,
+ (byte)0xa4,(byte)0xa4,(byte)0xc5,
+ (byte)0x9c,(byte)0xa4,(byte)0xcd,
+ (byte)0xa4,(byte)0xac,(byte)0xcd,
+ (byte)0xbd,(byte)0xc5,(byte)0xe6,
+ (byte)0xc5,(byte)0xcd,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xff,
+ (byte)0xa4,(byte)0xa4,(byte)0xc5,
+ (byte)0xc5,(byte)0xc5,(byte)0xee,
+ (byte)0xc5,(byte)0xb4,(byte)0xe6,
+ (byte)0xbd,(byte)0x9c,(byte)0xc5,
+ (byte)0x8b,(byte)0x7b,(byte)0x9c,
+ (byte)0x31,(byte)0x39,(byte)0x31,
+ (byte)0x5a,(byte)0x29,(byte)0x41,
+ (byte)0x8b,(byte)0x31,(byte)0x4a,
+ (byte)0x83,(byte)0x29,(byte)0x4a,
+ (byte)0x94,(byte)0x39,(byte)0x6a,
+ (byte)0x94,(byte)0x39,(byte)0x4a,
+ (byte)0x94,(byte)0x4a,(byte)0x6a,
+ (byte)0x8b,(byte)0x7b,(byte)0xac,
+ (byte)0x7b,(byte)0xac,(byte)0xde,
+ (byte)0x7b,(byte)0xa4,(byte)0xde,
+ (byte)0x7b,(byte)0xa4,(byte)0xde,
+ (byte)0x73,(byte)0x9c,(byte)0xde,
+ (byte)0x73,(byte)0x94,(byte)0xd5,
+ (byte)0x6a,(byte)0x9c,(byte)0xd5,
+ (byte)0x62,(byte)0x9c,(byte)0xd5,
+ (byte)0x62,(byte)0x94,(byte)0xd5,
+ (byte)0x5a,(byte)0x94,(byte)0xcd,
+ (byte)0x52,(byte)0x94,(byte)0xcd,
+ (byte)0x52,(byte)0x8b,(byte)0xcd,
+ (byte)0x4a,(byte)0x83,(byte)0xc5,
+ (byte)0x4a,(byte)0x8b,(byte)0xc5,
+ (byte)0x7b,(byte)0xac,(byte)0xde,
+ (byte)0x94,(byte)0xb4,(byte)0xe6,
+ (byte)0xa4,(byte)0xc5,(byte)0xee,
+ (byte)0xbd,(byte)0xcd,(byte)0xf6,
+ (byte)0xcd,(byte)0xcd,(byte)0xf6,
+ (byte)0xbd,(byte)0xac,(byte)0xcd,
+ (byte)0x52,(byte)0x39,(byte)0x41,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x08,(byte)0x10,
+ (byte)0x31,(byte)0x29,(byte)0x18,
+ (byte)0x6a,(byte)0x62,(byte)0x4a,
+ (byte)0x31,(byte)0x29,(byte)0x39,
+ (byte)0x08,(byte)0x08,(byte)0x10,
+ (byte)0x18,(byte)0x08,(byte)0x18,
+ (byte)0x29,(byte)0x29,(byte)0x4a,
+ (byte)0x20,(byte)0x29,(byte)0x41,
+ (byte)0x10,(byte)0x10,(byte)0x18,
+ (byte)0x18,(byte)0x18,(byte)0x29,
+ (byte)0x41,(byte)0x41,(byte)0x5a,
+ (byte)0x31,(byte)0x39,(byte)0x5a,
+ (byte)0x31,(byte)0x39,(byte)0x52,
+ (byte)0x29,(byte)0x31,(byte)0x4a,
+ (byte)0x31,(byte)0x39,(byte)0x52,
+ (byte)0x39,(byte)0x39,(byte)0x5a,
+ (byte)0x4a,(byte)0x52,(byte)0x6a,
+ (byte)0x73,(byte)0x73,(byte)0x8b,
+ (byte)0xac,(byte)0x83,(byte)0xac,
+ (byte)0xbd,(byte)0x8b,(byte)0xbd,
+ (byte)0x7b,(byte)0x41,(byte)0x5a,
+ (byte)0x4a,(byte)0x20,(byte)0x29,
+ (byte)0x5a,(byte)0x4a,(byte)0x62,
+ (byte)0x29,(byte)0x29,(byte)0x20,
+ (byte)0x41,(byte)0x31,(byte)0x29,
+ (byte)0x6a,(byte)0x4a,(byte)0x4a,
+ (byte)0x94,(byte)0x5a,(byte)0x7b,
+ (byte)0x73,(byte)0x29,(byte)0x41,
+ (byte)0x4a,(byte)0x20,(byte)0x29,
+ (byte)0x62,(byte)0x41,(byte)0x5a,
+ (byte)0x94,(byte)0x73,(byte)0xa4,
+ (byte)0x9c,(byte)0xbd,(byte)0xee,
+ (byte)0xa4,(byte)0xa4,(byte)0xcd,
+ (byte)0x9c,(byte)0x52,(byte)0x83,
+ (byte)0x9c,(byte)0x52,(byte)0x8b,
+ (byte)0x9c,(byte)0x4a,(byte)0x8b,
+ (byte)0x73,(byte)0x5a,(byte)0x8b,
+ (byte)0x7b,(byte)0xa4,(byte)0xde,
+ (byte)0x7b,(byte)0xac,(byte)0xde,
+ (byte)0x7b,(byte)0xac,(byte)0xde,
+ (byte)0x7b,(byte)0xac,(byte)0xde,
+ (byte)0x7b,(byte)0xa4,(byte)0xde,
+ (byte)0x73,(byte)0xa4,(byte)0xde,
+ (byte)0x62,(byte)0x94,(byte)0xcd,
+ (byte)0x73,(byte)0xa4,(byte)0xde,
+ (byte)0xa4,(byte)0xbd,(byte)0xee,
+ (byte)0xa4,(byte)0xc5,(byte)0xee,
+ (byte)0xbd,(byte)0xcd,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xde,(byte)0xde,(byte)0xff,
+ (byte)0x8b,(byte)0x7b,(byte)0x8b,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x10,(byte)0x10,
+ (byte)0x31,(byte)0x10,(byte)0x10,
+ (byte)0x41,(byte)0x39,(byte)0x20,
+ (byte)0x41,(byte)0x41,(byte)0x29,
+ (byte)0x08,(byte)0x08,(byte)0x10,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x29,(byte)0x20,(byte)0x39,
+ (byte)0x29,(byte)0x31,(byte)0x52,
+ (byte)0x20,(byte)0x20,(byte)0x39,
+ (byte)0x18,(byte)0x18,(byte)0x18,
+ (byte)0x10,(byte)0x08,(byte)0x10,
+ (byte)0x18,(byte)0x10,(byte)0x20,
+ (byte)0x20,(byte)0x29,(byte)0x41,
+ (byte)0x31,(byte)0x39,(byte)0x62,
+ (byte)0x31,(byte)0x41,(byte)0x62,
+ (byte)0x31,(byte)0x39,(byte)0x62,
+ (byte)0x29,(byte)0x31,(byte)0x52,
+ (byte)0x29,(byte)0x29,(byte)0x41,
+ (byte)0x4a,(byte)0x39,(byte)0x5a,
+ (byte)0x73,(byte)0x41,(byte)0x52,
+ (byte)0x52,(byte)0x41,(byte)0x39,
+ (byte)0x41,(byte)0x39,(byte)0x20,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x39,(byte)0x41,(byte)0x4a,
+ (byte)0x62,(byte)0x5a,(byte)0x73,
+ (byte)0x39,(byte)0x31,(byte)0x31,
+ (byte)0x39,(byte)0x31,(byte)0x29,
+ (byte)0x31,(byte)0x18,(byte)0x18,
+ (byte)0x4a,(byte)0x41,(byte)0x41,
+ (byte)0x52,(byte)0x4a,(byte)0x5a,
+ (byte)0x41,(byte)0x41,(byte)0x4a,
+ (byte)0x7b,(byte)0x6a,(byte)0x83,
+ (byte)0x94,(byte)0x6a,(byte)0x9c,
+ (byte)0x8b,(byte)0x52,(byte)0x73,
+ (byte)0x73,(byte)0x4a,(byte)0x4a,
+ (byte)0x5a,(byte)0x29,(byte)0x31,
+ (byte)0x8b,(byte)0x41,(byte)0x6a,
+ (byte)0x7b,(byte)0x52,(byte)0x73,
+ (byte)0x9c,(byte)0x83,(byte)0xb4,
+ (byte)0x94,(byte)0xac,(byte)0xd5,
+ (byte)0x8b,(byte)0xb4,(byte)0xe6,
+ (byte)0x8b,(byte)0xb4,(byte)0xe6,
+ (byte)0x8b,(byte)0xb4,(byte)0xe6,
+ (byte)0x94,(byte)0xb4,(byte)0xe6,
+ (byte)0x9c,(byte)0xbd,(byte)0xe6,
+ (byte)0x94,(byte)0xb4,(byte)0xe6,
+ (byte)0xac,(byte)0xbd,(byte)0xee,
+ (byte)0xac,(byte)0xc5,(byte)0xee,
+ (byte)0xc5,(byte)0xcd,(byte)0xf6,
+ (byte)0xc5,(byte)0xcd,(byte)0xf6,
+ (byte)0xde,(byte)0xde,(byte)0xff,
+ (byte)0xb4,(byte)0xac,(byte)0xc5,
+ (byte)0x4a,(byte)0x41,(byte)0x41,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x39,(byte)0x20,(byte)0x29,
+ (byte)0x4a,(byte)0x29,(byte)0x29,
+ (byte)0x4a,(byte)0x41,(byte)0x31,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x29,(byte)0x10,(byte)0x29,
+ (byte)0x31,(byte)0x31,(byte)0x52,
+ (byte)0x20,(byte)0x29,(byte)0x41,
+ (byte)0x31,(byte)0x31,(byte)0x41,
+ (byte)0x41,(byte)0x39,(byte)0x41,
+ (byte)0x20,(byte)0x20,(byte)0x29,
+ (byte)0x08,(byte)0x10,(byte)0x18,
+ (byte)0x18,(byte)0x18,(byte)0x31,
+ (byte)0x18,(byte)0x20,(byte)0x31,
+ (byte)0x29,(byte)0x31,(byte)0x4a,
+ (byte)0x39,(byte)0x41,(byte)0x6a,
+ (byte)0x39,(byte)0x4a,(byte)0x6a,
+ (byte)0x39,(byte)0x41,(byte)0x6a,
+ (byte)0x52,(byte)0x52,(byte)0x5a,
+ (byte)0x39,(byte)0x41,(byte)0x20,
+ (byte)0x20,(byte)0x20,(byte)0x10,
+ (byte)0x20,(byte)0x20,(byte)0x10,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x18,(byte)0x18,(byte)0x18,
+ (byte)0x73,(byte)0x73,(byte)0x83,
+ (byte)0x4a,(byte)0x41,(byte)0x52,
+ (byte)0x20,(byte)0x20,(byte)0x29,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x62,(byte)0x41,(byte)0x52,
+ (byte)0x94,(byte)0x52,(byte)0x73,
+ (byte)0x62,(byte)0x39,(byte)0x4a,
+ (byte)0x94,(byte)0x62,(byte)0x8b,
+ (byte)0x83,(byte)0x41,(byte)0x6a,
+ (byte)0x39,(byte)0x10,(byte)0x10,
+ (byte)0x4a,(byte)0x39,(byte)0x31,
+ (byte)0x4a,(byte)0x41,(byte)0x39,
+ (byte)0x62,(byte)0x5a,(byte)0x62,
+ (byte)0x31,(byte)0x29,(byte)0x31,
+ (byte)0x4a,(byte)0x39,(byte)0x4a,
+ (byte)0x9c,(byte)0xac,(byte)0xd5,
+ (byte)0xa4,(byte)0xc5,(byte)0xee,
+ (byte)0x9c,(byte)0xbd,(byte)0xee,
+ (byte)0x9c,(byte)0xbd,(byte)0xee,
+ (byte)0x9c,(byte)0xbd,(byte)0xe6,
+ (byte)0x9c,(byte)0xbd,(byte)0xee,
+ (byte)0xac,(byte)0xc5,(byte)0xee,
+ (byte)0xb4,(byte)0xc5,(byte)0xee,
+ (byte)0xb4,(byte)0xc5,(byte)0xee,
+ (byte)0xc5,(byte)0xcd,(byte)0xf6,
+ (byte)0xc5,(byte)0xd5,(byte)0xf6,
+ (byte)0xde,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xc5,(byte)0xde,
+ (byte)0x8b,(byte)0x8b,(byte)0x9c,
+ (byte)0x41,(byte)0x41,(byte)0x39,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x10,
+ (byte)0x62,(byte)0x29,(byte)0x41,
+ (byte)0x73,(byte)0x4a,(byte)0x52,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x10,(byte)0x18,
+ (byte)0x31,(byte)0x29,(byte)0x4a,
+ (byte)0x20,(byte)0x29,(byte)0x4a,
+ (byte)0x29,(byte)0x31,(byte)0x4a,
+ (byte)0x20,(byte)0x29,(byte)0x41,
+ (byte)0x20,(byte)0x29,(byte)0x31,
+ (byte)0x29,(byte)0x31,(byte)0x41,
+ (byte)0x18,(byte)0x20,(byte)0x39,
+ (byte)0x20,(byte)0x29,(byte)0x41,
+ (byte)0x29,(byte)0x29,(byte)0x4a,
+ (byte)0x20,(byte)0x29,(byte)0x41,
+ (byte)0x18,(byte)0x20,(byte)0x31,
+ (byte)0x29,(byte)0x29,(byte)0x41,
+ (byte)0x39,(byte)0x41,(byte)0x6a,
+ (byte)0x4a,(byte)0x52,(byte)0x5a,
+ (byte)0x29,(byte)0x31,(byte)0x20,
+ (byte)0x31,(byte)0x29,(byte)0x10,
+ (byte)0x29,(byte)0x20,(byte)0x10,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x29,(byte)0x18,(byte)0x20,
+ (byte)0x4a,(byte)0x4a,(byte)0x52,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x41,(byte)0x20,(byte)0x31,
+ (byte)0x94,(byte)0x31,(byte)0x5a,
+ (byte)0x7b,(byte)0x08,(byte)0x20,
+ (byte)0x6a,(byte)0x29,(byte)0x39,
+ (byte)0x62,(byte)0x29,(byte)0x41,
+ (byte)0x31,(byte)0x18,(byte)0x20,
+ (byte)0x18,(byte)0x18,(byte)0x18,
+ (byte)0x20,(byte)0x20,(byte)0x18,
+ (byte)0x39,(byte)0x31,(byte)0x29,
+ (byte)0x41,(byte)0x31,(byte)0x31,
+ (byte)0x18,(byte)0x18,(byte)0x20,
+ (byte)0x41,(byte)0x41,(byte)0x4a,
+ (byte)0xbd,(byte)0xc5,(byte)0xee,
+ (byte)0xbd,(byte)0xcd,(byte)0xf6,
+ (byte)0xb4,(byte)0xcd,(byte)0xf6,
+ (byte)0xbd,(byte)0xcd,(byte)0xf6,
+ (byte)0xbd,(byte)0xcd,(byte)0xf6,
+ (byte)0xbd,(byte)0xcd,(byte)0xf6,
+ (byte)0xb4,(byte)0xcd,(byte)0xee,
+ (byte)0xbd,(byte)0xcd,(byte)0xee,
+ (byte)0xbd,(byte)0xcd,(byte)0xee,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xde,(byte)0xd5,(byte)0xf6,
+ (byte)0xd5,(byte)0xcd,(byte)0xee,
+ (byte)0x9c,(byte)0x9c,(byte)0xac,
+ (byte)0x5a,(byte)0x5a,(byte)0x5a,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x4a,(byte)0x20,(byte)0x39,
+ (byte)0x9c,(byte)0x4a,(byte)0x73,
+ (byte)0x4a,(byte)0x39,(byte)0x29,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x10,
+ (byte)0x29,(byte)0x20,(byte)0x39,
+ (byte)0x29,(byte)0x29,(byte)0x4a,
+ (byte)0x29,(byte)0x29,(byte)0x41,
+ (byte)0x29,(byte)0x31,(byte)0x4a,
+ (byte)0x08,(byte)0x18,(byte)0x29,
+ (byte)0x18,(byte)0x20,(byte)0x39,
+ (byte)0x29,(byte)0x31,(byte)0x41,
+ (byte)0x29,(byte)0x29,(byte)0x4a,
+ (byte)0x31,(byte)0x31,(byte)0x5a,
+ (byte)0x31,(byte)0x20,(byte)0x39,
+ (byte)0x31,(byte)0x29,(byte)0x4a,
+ (byte)0x20,(byte)0x29,(byte)0x41,
+ (byte)0x18,(byte)0x18,(byte)0x31,
+ (byte)0x18,(byte)0x18,(byte)0x29,
+ (byte)0x52,(byte)0x4a,(byte)0x62,
+ (byte)0x52,(byte)0x4a,(byte)0x39,
+ (byte)0x31,(byte)0x29,(byte)0x29,
+ (byte)0x29,(byte)0x18,(byte)0x18,
+ (byte)0x20,(byte)0x10,(byte)0x18,
+ (byte)0x10,(byte)0x10,(byte)0x18,
+ (byte)0x18,(byte)0x18,(byte)0x29,
+ (byte)0x10,(byte)0x10,(byte)0x18,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x73,(byte)0x41,(byte)0x4a,
+ (byte)0x83,(byte)0x4a,(byte)0x4a,
+ (byte)0x39,(byte)0x29,(byte)0x18,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x31,(byte)0x31,(byte)0x29,
+ (byte)0x62,(byte)0x62,(byte)0x5a,
+ (byte)0x41,(byte)0x41,(byte)0x39,
+ (byte)0x29,(byte)0x20,(byte)0x20,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x31,(byte)0x29,(byte)0x31,
+ (byte)0x8b,(byte)0x62,(byte)0x8b,
+ (byte)0xbd,(byte)0xac,(byte)0xde,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xc5,(byte)0xcd,(byte)0xf6,
+ (byte)0xbd,(byte)0xcd,(byte)0xf6,
+ (byte)0xc5,(byte)0xcd,(byte)0xf6,
+ (byte)0xc5,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xcd,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xde,(byte)0xd5,(byte)0xf6,
+ (byte)0xd5,(byte)0xd5,(byte)0xf6,
+ (byte)0xac,(byte)0xac,(byte)0xbd,
+ (byte)0x73,(byte)0x73,(byte)0x62,
+ (byte)0x20,(byte)0x20,(byte)0x18,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x6a,(byte)0x29,(byte)0x52,
+ (byte)0xac,(byte)0x62,(byte)0x8b,
+ (byte)0x29,(byte)0x20,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x10,(byte)0x20,
+ (byte)0x29,(byte)0x29,(byte)0x41,
+ (byte)0x31,(byte)0x39,(byte)0x52,
+ (byte)0x18,(byte)0x20,(byte)0x31,
+ (byte)0x08,(byte)0x18,(byte)0x31,
+ (byte)0x29,(byte)0x31,(byte)0x4a,
+ (byte)0x29,(byte)0x29,(byte)0x41,
+ (byte)0x29,(byte)0x31,(byte)0x52,
+ (byte)0x39,(byte)0x29,(byte)0x4a,
+ (byte)0x18,(byte)0x08,(byte)0x10,
+ (byte)0x10,(byte)0x10,(byte)0x18,
+ (byte)0x20,(byte)0x29,(byte)0x41,
+ (byte)0x29,(byte)0x29,(byte)0x4a,
+ (byte)0x29,(byte)0x29,(byte)0x39,
+ (byte)0x62,(byte)0x52,(byte)0x41,
+ (byte)0x52,(byte)0x4a,(byte)0x41,
+ (byte)0x31,(byte)0x29,(byte)0x39,
+ (byte)0x4a,(byte)0x39,(byte)0x41,
+ (byte)0x31,(byte)0x20,(byte)0x20,
+ (byte)0x31,(byte)0x31,(byte)0x39,
+ (byte)0x18,(byte)0x18,(byte)0x29,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x20,(byte)0x18,(byte)0x20,
+ (byte)0x73,(byte)0x6a,(byte)0x6a,
+ (byte)0x83,(byte)0x7b,(byte)0x73,
+ (byte)0x6a,(byte)0x5a,(byte)0x4a,
+ (byte)0x52,(byte)0x4a,(byte)0x39,
+ (byte)0x31,(byte)0x29,(byte)0x20,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x41,(byte)0x41,(byte)0x39,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x18,(byte)0x08,(byte)0x10,
+ (byte)0x10,(byte)0x08,(byte)0x10,
+ (byte)0x52,(byte)0x41,(byte)0x41,
+ (byte)0xb4,(byte)0x8b,(byte)0xb4,
+ (byte)0xd5,(byte)0xd5,(byte)0xf6,
+ (byte)0xd5,(byte)0xd5,(byte)0xf6,
+ (byte)0xd5,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xc5,(byte)0xcd,(byte)0xf6,
+ (byte)0xc5,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xd5,(byte)0xd5,(byte)0xf6,
+ (byte)0xde,(byte)0xd5,(byte)0xee,
+ (byte)0xd5,(byte)0xd5,(byte)0xf6,
+ (byte)0xac,(byte)0xac,(byte)0xbd,
+ (byte)0xa4,(byte)0x9c,(byte)0x94,
+ (byte)0x39,(byte)0x29,(byte)0x20,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x8b,(byte)0x39,(byte)0x6a,
+ (byte)0x9c,(byte)0x5a,(byte)0x8b,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x20,(byte)0x10,(byte)0x18,
+ (byte)0x31,(byte)0x31,(byte)0x4a,
+ (byte)0x31,(byte)0x31,(byte)0x41,
+ (byte)0x18,(byte)0x20,(byte)0x31,
+ (byte)0x18,(byte)0x18,(byte)0x31,
+ (byte)0x31,(byte)0x31,(byte)0x4a,
+ (byte)0x20,(byte)0x29,(byte)0x41,
+ (byte)0x29,(byte)0x31,(byte)0x52,
+ (byte)0x31,(byte)0x20,(byte)0x39,
+ (byte)0x10,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x20,(byte)0x29,
+ (byte)0x39,(byte)0x31,(byte)0x5a,
+ (byte)0x41,(byte)0x39,(byte)0x4a,
+ (byte)0x5a,(byte)0x5a,(byte)0x41,
+ (byte)0x41,(byte)0x39,(byte)0x31,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x31,(byte)0x20,(byte)0x20,
+ (byte)0x41,(byte)0x29,(byte)0x20,
+ (byte)0x39,(byte)0x29,(byte)0x31,
+ (byte)0x29,(byte)0x20,(byte)0x29,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x10,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x52,(byte)0x41,(byte)0x39,
+ (byte)0x73,(byte)0x6a,(byte)0x62,
+ (byte)0x7b,(byte)0x73,(byte)0x62,
+ (byte)0x4a,(byte)0x41,(byte)0x31,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x29,(byte)0x10,(byte)0x18,
+ (byte)0x31,(byte)0x08,(byte)0x10,
+ (byte)0x4a,(byte)0x39,(byte)0x39,
+ (byte)0xa4,(byte)0x94,(byte)0xa4,
+ (byte)0xc5,(byte)0xc5,(byte)0xe6,
+ (byte)0xde,(byte)0xd5,(byte)0xf6,
+ (byte)0xde,(byte)0xd5,(byte)0xf6,
+ (byte)0xde,(byte)0xd5,(byte)0xf6,
+ (byte)0xd5,(byte)0xd5,(byte)0xf6,
+ (byte)0xd5,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xcd,(byte)0xd5,(byte)0xf6,
+ (byte)0xd5,(byte)0xd5,(byte)0xee,
+ (byte)0xde,(byte)0xd5,(byte)0xf6,
+ (byte)0xde,(byte)0xd5,(byte)0xf6,
+ (byte)0xac,(byte)0xac,(byte)0xbd,
+ (byte)0xb4,(byte)0xac,(byte)0xb4,
+ (byte)0x6a,(byte)0x52,(byte)0x4a,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x08,(byte)0x18,
+ (byte)0x9c,(byte)0x39,(byte)0x73,
+ (byte)0x6a,(byte)0x39,(byte)0x5a,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x10,
+ (byte)0x18,(byte)0x08,(byte)0x18,
+ (byte)0x31,(byte)0x29,(byte)0x39,
+ (byte)0x29,(byte)0x29,(byte)0x29,
+ (byte)0x18,(byte)0x18,(byte)0x29,
+ (byte)0x29,(byte)0x29,(byte)0x31,
+ (byte)0x31,(byte)0x39,(byte)0x4a,
+ (byte)0x29,(byte)0x29,(byte)0x41,
+ (byte)0x31,(byte)0x29,(byte)0x41,
+ (byte)0x20,(byte)0x20,(byte)0x31,
+ (byte)0x10,(byte)0x08,(byte)0x18,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x18,
+ (byte)0x39,(byte)0x29,(byte)0x31,
+ (byte)0x62,(byte)0x52,(byte)0x39,
+ (byte)0x62,(byte)0x62,(byte)0x4a,
+ (byte)0x20,(byte)0x20,(byte)0x20,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x31,(byte)0x18,(byte)0x10,
+ (byte)0x31,(byte)0x18,(byte)0x10,
+ (byte)0x31,(byte)0x29,(byte)0x29,
+ (byte)0x39,(byte)0x39,(byte)0x52,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x29,(byte)0x20,(byte)0x20,
+ (byte)0x83,(byte)0x7b,(byte)0x73,
+ (byte)0x8b,(byte)0x83,(byte)0x7b,
+ (byte)0x41,(byte)0x39,(byte)0x31,
+ (byte)0x41,(byte)0x41,(byte)0x31,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x20,(byte)0x10,(byte)0x10,
+ (byte)0x29,(byte)0x20,(byte)0x18,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x31,(byte)0x10,(byte)0x10,
+ (byte)0x39,(byte)0x20,(byte)0x20,
+ (byte)0x62,(byte)0x52,(byte)0x62,
+ (byte)0x94,(byte)0x94,(byte)0xac,
+ (byte)0xb4,(byte)0xb4,(byte)0xcd,
+ (byte)0xd5,(byte)0xcd,(byte)0xee,
+ (byte)0xde,(byte)0xde,(byte)0xf6,
+ (byte)0xde,(byte)0xd5,(byte)0xf6,
+ (byte)0xde,(byte)0xd5,(byte)0xee,
+ (byte)0xde,(byte)0xd5,(byte)0xee,
+ (byte)0xd5,(byte)0xcd,(byte)0xee,
+ (byte)0xde,(byte)0xd5,(byte)0xee,
+ (byte)0xde,(byte)0xde,(byte)0xf6,
+ (byte)0xd5,(byte)0xd5,(byte)0xee,
+ (byte)0xb4,(byte)0xac,(byte)0xbd,
+ (byte)0xbd,(byte)0xb4,(byte)0xc5,
+ (byte)0xac,(byte)0x9c,(byte)0xac,
+ (byte)0x29,(byte)0x20,(byte)0x18,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x31,(byte)0x08,(byte)0x18,
+ (byte)0x94,(byte)0x29,(byte)0x5a,
+ (byte)0x4a,(byte)0x29,(byte)0x41,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x10,(byte)0x29,
+ (byte)0x08,(byte)0x10,(byte)0x18,
+ (byte)0x18,(byte)0x08,(byte)0x18,
+ (byte)0x39,(byte)0x20,(byte)0x29,
+ (byte)0x31,(byte)0x31,(byte)0x29,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x31,(byte)0x29,(byte)0x29,
+ (byte)0x31,(byte)0x29,(byte)0x4a,
+ (byte)0x31,(byte)0x18,(byte)0x31,
+ (byte)0x18,(byte)0x08,(byte)0x18,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x10,(byte)0x10,(byte)0x18,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x41,(byte)0x41,(byte)0x31,
+ (byte)0x62,(byte)0x5a,(byte)0x39,
+ (byte)0x52,(byte)0x52,(byte)0x39,
+ (byte)0x29,(byte)0x29,(byte)0x18,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x39,(byte)0x20,(byte)0x20,
+ (byte)0x52,(byte)0x39,(byte)0x39,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x10,(byte)0x10,(byte)0x18,
+ (byte)0x29,(byte)0x18,(byte)0x20,
+ (byte)0x31,(byte)0x18,(byte)0x18,
+ (byte)0x4a,(byte)0x29,(byte)0x20,
+ (byte)0x7b,(byte)0x62,(byte)0x5a,
+ (byte)0x73,(byte)0x6a,(byte)0x52,
+ (byte)0x4a,(byte)0x4a,(byte)0x39,
+ (byte)0x4a,(byte)0x41,(byte)0x39,
+ (byte)0x29,(byte)0x20,(byte)0x18,
+ (byte)0x39,(byte)0x29,(byte)0x20,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x20,(byte)0x18,
+ (byte)0x41,(byte)0x41,(byte)0x31,
+ (byte)0x62,(byte)0x6a,(byte)0x6a,
+ (byte)0x94,(byte)0x94,(byte)0x9c,
+ (byte)0xa4,(byte)0xa4,(byte)0xa4,
+ (byte)0xac,(byte)0xa4,(byte)0xb4,
+ (byte)0xcd,(byte)0xc5,(byte)0xde,
+ (byte)0xde,(byte)0xd5,(byte)0xf6,
+ (byte)0xde,(byte)0xde,(byte)0xf6,
+ (byte)0xde,(byte)0xde,(byte)0xf6,
+ (byte)0xde,(byte)0xd5,(byte)0xf6,
+ (byte)0xde,(byte)0xd5,(byte)0xf6,
+ (byte)0xde,(byte)0xde,(byte)0xf6,
+ (byte)0xd5,(byte)0xcd,(byte)0xee,
+ (byte)0xb4,(byte)0xac,(byte)0xbd,
+ (byte)0xb4,(byte)0xa4,(byte)0xb4,
+ (byte)0xcd,(byte)0xbd,(byte)0xde,
+ (byte)0x52,(byte)0x31,(byte)0x39,
+ (byte)0x20,(byte)0x20,(byte)0x20,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x39,(byte)0x08,(byte)0x18,
+ (byte)0x8b,(byte)0x20,(byte)0x41,
+ (byte)0x39,(byte)0x18,(byte)0x29,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x18,
+ (byte)0x00,(byte)0x08,(byte)0x08,
+ (byte)0x20,(byte)0x08,(byte)0x10,
+ (byte)0x41,(byte)0x20,(byte)0x29,
+ (byte)0x52,(byte)0x4a,(byte)0x4a,
+ (byte)0x41,(byte)0x39,(byte)0x39,
+ (byte)0x41,(byte)0x31,(byte)0x31,
+ (byte)0x31,(byte)0x18,(byte)0x29,
+ (byte)0x18,(byte)0x08,(byte)0x18,
+ (byte)0x08,(byte)0x08,(byte)0x10,
+ (byte)0x08,(byte)0x08,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x31,(byte)0x29,(byte)0x18,
+ (byte)0x5a,(byte)0x52,(byte)0x31,
+ (byte)0x4a,(byte)0x39,(byte)0x31,
+ (byte)0x20,(byte)0x10,(byte)0x08,
+ (byte)0x20,(byte)0x18,(byte)0x08,
+ (byte)0x29,(byte)0x18,(byte)0x10,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x29,(byte)0x10,(byte)0x08,
+ (byte)0x39,(byte)0x18,(byte)0x10,
+ (byte)0x31,(byte)0x20,(byte)0x20,
+ (byte)0x41,(byte)0x41,(byte)0x31,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x31,(byte)0x31,(byte)0x29,
+ (byte)0x31,(byte)0x29,(byte)0x20,
+ (byte)0x9c,(byte)0x8b,(byte)0x7b,
+ (byte)0xb4,(byte)0xac,(byte)0xac,
+ (byte)0xa4,(byte)0x9c,(byte)0xac,
+ (byte)0xac,(byte)0xac,(byte)0xbd,
+ (byte)0xc5,(byte)0xc5,(byte)0xd5,
+ (byte)0xd5,(byte)0xd5,(byte)0xee,
+ (byte)0xde,(byte)0xde,(byte)0xf6,
+ (byte)0xde,(byte)0xd5,(byte)0xf6,
+ (byte)0xde,(byte)0xd5,(byte)0xf6,
+ (byte)0xde,(byte)0xd5,(byte)0xee,
+ (byte)0xd5,(byte)0xcd,(byte)0xde,
+ (byte)0xbd,(byte)0xac,(byte)0xc5,
+ (byte)0xa4,(byte)0x7b,(byte)0x8b,
+ (byte)0xcd,(byte)0xbd,(byte)0xd5,
+ (byte)0x5a,(byte)0x29,(byte)0x31,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x4a,(byte)0x08,(byte)0x10,
+ (byte)0x8b,(byte)0x20,(byte)0x41,
+ (byte)0x41,(byte)0x20,(byte)0x31,
+ (byte)0x00,(byte)0x08,(byte)0x10,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x08,(byte)0x08,
+ (byte)0x18,(byte)0x08,(byte)0x10,
+ (byte)0x29,(byte)0x10,(byte)0x20,
+ (byte)0x29,(byte)0x20,(byte)0x20,
+ (byte)0x39,(byte)0x31,(byte)0x31,
+ (byte)0x29,(byte)0x10,(byte)0x18,
+ (byte)0x29,(byte)0x08,(byte)0x10,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x10,
+ (byte)0x18,(byte)0x18,(byte)0x31,
+ (byte)0x08,(byte)0x08,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x29,(byte)0x18,(byte)0x10,
+ (byte)0x73,(byte)0x4a,(byte)0x41,
+ (byte)0x94,(byte)0x52,(byte)0x73,
+ (byte)0x6a,(byte)0x39,(byte)0x5a,
+ (byte)0x31,(byte)0x18,(byte)0x20,
+ (byte)0x18,(byte)0x08,(byte)0x00,
+ (byte)0x18,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x10,(byte)0x18,
+ (byte)0x10,(byte)0x08,(byte)0x10,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x08,(byte)0x00,
+ (byte)0x20,(byte)0x08,(byte)0x08,
+ (byte)0x20,(byte)0x18,(byte)0x29,
+ (byte)0x52,(byte)0x41,(byte)0x39,
+ (byte)0x39,(byte)0x29,(byte)0x18,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x20,(byte)0x29,(byte)0x18,
+ (byte)0x31,(byte)0x20,(byte)0x18,
+ (byte)0xb4,(byte)0x9c,(byte)0xac,
+ (byte)0xd5,(byte)0xd5,(byte)0xee,
+ (byte)0xb4,(byte)0xa4,(byte)0xb4,
+ (byte)0xa4,(byte)0x8b,(byte)0x9c,
+ (byte)0xbd,(byte)0xb4,(byte)0xc5,
+ (byte)0xcd,(byte)0xc5,(byte)0xde,
+ (byte)0xd5,(byte)0xcd,(byte)0xcd,
+ (byte)0xde,(byte)0xd5,(byte)0xee,
+ (byte)0xde,(byte)0xd5,(byte)0xf6,
+ (byte)0xd5,(byte)0xcd,(byte)0xd5,
+ (byte)0xcd,(byte)0xc5,(byte)0xc5,
+ (byte)0xc5,(byte)0xac,(byte)0xbd,
+ (byte)0xa4,(byte)0x7b,(byte)0x83,
+ (byte)0xbd,(byte)0xac,(byte)0xbd,
+ (byte)0x52,(byte)0x31,(byte)0x31,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x4a,(byte)0x00,(byte)0x08,
+ (byte)0x94,(byte)0x31,(byte)0x4a,
+ (byte)0x52,(byte)0x39,(byte)0x52,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x18,(byte)0x08,(byte)0x10,
+ (byte)0x08,(byte)0x08,(byte)0x10,
+ (byte)0x18,(byte)0x10,(byte)0x18,
+ (byte)0x29,(byte)0x00,(byte)0x18,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x18,
+ (byte)0x08,(byte)0x08,(byte)0x10,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x00,(byte)0x08,
+ (byte)0x9c,(byte)0x5a,(byte)0x8b,
+ (byte)0xb4,(byte)0x62,(byte)0xa4,
+ (byte)0xa4,(byte)0x5a,(byte)0x8b,
+ (byte)0x8b,(byte)0x39,(byte)0x6a,
+ (byte)0x6a,(byte)0x29,(byte)0x41,
+ (byte)0x6a,(byte)0x31,(byte)0x41,
+ (byte)0x41,(byte)0x20,(byte)0x31,
+ (byte)0x10,(byte)0x08,(byte)0x10,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x08,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x52,(byte)0x39,(byte)0x29,
+ (byte)0x52,(byte)0x41,(byte)0x10,
+ (byte)0x41,(byte)0x31,(byte)0x29,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x39,(byte)0x39,(byte)0x31,
+ (byte)0x18,(byte)0x18,(byte)0x18,
+ (byte)0x41,(byte)0x18,(byte)0x18,
+ (byte)0xac,(byte)0x7b,(byte)0x8b,
+ (byte)0xde,(byte)0xde,(byte)0xff,
+ (byte)0xac,(byte)0x9c,(byte)0xa4,
+ (byte)0xa4,(byte)0x62,(byte)0x73,
+ (byte)0xbd,(byte)0xa4,(byte)0xbd,
+ (byte)0xc5,(byte)0xbd,(byte)0xbd,
+ (byte)0xcd,(byte)0xbd,(byte)0x9c,
+ (byte)0xd5,(byte)0xc5,(byte)0xac,
+ (byte)0xcd,(byte)0xc5,(byte)0xb4,
+ (byte)0xd5,(byte)0xc5,(byte)0xa4,
+ (byte)0xd5,(byte)0xc5,(byte)0xa4,
+ (byte)0xbd,(byte)0xa4,(byte)0xa4,
+ (byte)0x9c,(byte)0x8b,(byte)0x8b,
+ (byte)0x9c,(byte)0x8b,(byte)0x94,
+ (byte)0x5a,(byte)0x39,(byte)0x41,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x4a,(byte)0x00,(byte)0x08,
+ (byte)0x9c,(byte)0x4a,(byte)0x5a,
+ (byte)0x5a,(byte)0x39,(byte)0x5a,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x18,(byte)0x18,(byte)0x29,
+ (byte)0x18,(byte)0x10,(byte)0x18,
+ (byte)0x10,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x20,(byte)0x10,(byte)0x18,
+ (byte)0x8b,(byte)0x62,(byte)0x83,
+ (byte)0x9c,(byte)0x41,(byte)0x6a,
+ (byte)0x83,(byte)0x18,(byte)0x41,
+ (byte)0x73,(byte)0x08,(byte)0x18,
+ (byte)0x7b,(byte)0x18,(byte)0x39,
+ (byte)0x8b,(byte)0x29,(byte)0x52,
+ (byte)0x8b,(byte)0x39,(byte)0x62,
+ (byte)0x29,(byte)0x10,(byte)0x18,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x39,(byte)0x20,(byte)0x08,
+ (byte)0x4a,(byte)0x39,(byte)0x10,
+ (byte)0x29,(byte)0x20,(byte)0x18,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x18,(byte)0x18,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x62,(byte)0x29,(byte)0x31,
+ (byte)0xc5,(byte)0xa4,(byte)0xcd,
+ (byte)0x94,(byte)0x83,(byte)0x8b,
+ (byte)0x83,(byte)0x73,(byte)0x6a,
+ (byte)0xbd,(byte)0xa4,(byte)0xb4,
+ (byte)0xc5,(byte)0xb4,(byte)0xac,
+ (byte)0xcd,(byte)0xb4,(byte)0x83,
+ (byte)0xcd,(byte)0xbd,(byte)0x8b,
+ (byte)0xc5,(byte)0xb4,(byte)0x8b,
+ (byte)0xcd,(byte)0xbd,(byte)0x9c,
+ (byte)0xc5,(byte)0xb4,(byte)0x7b,
+ (byte)0xcd,(byte)0xc5,(byte)0xc5,
+ (byte)0x8b,(byte)0x7b,(byte)0x73,
+ (byte)0x8b,(byte)0x62,(byte)0x73,
+ (byte)0x5a,(byte)0x31,(byte)0x41,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x4a,(byte)0x08,(byte)0x10,
+ (byte)0xa4,(byte)0x52,(byte)0x6a,
+ (byte)0x4a,(byte)0x29,(byte)0x41,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x10,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x18,(byte)0x31,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x52,(byte)0x29,(byte)0x4a,
+ (byte)0xcd,(byte)0x94,(byte)0xd5,
+ (byte)0x9c,(byte)0x41,(byte)0x6a,
+ (byte)0x7b,(byte)0x10,(byte)0x08,
+ (byte)0x6a,(byte)0x10,(byte)0x00,
+ (byte)0x6a,(byte)0x08,(byte)0x18,
+ (byte)0x73,(byte)0x10,(byte)0x31,
+ (byte)0x4a,(byte)0x10,(byte)0x20,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x39,(byte)0x29,(byte)0x10,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x39,(byte)0x29,(byte)0x20,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x4a,(byte)0x18,(byte)0x20,
+ (byte)0x9c,(byte)0x5a,(byte)0x7b,
+ (byte)0x83,(byte)0x52,(byte)0x62,
+ (byte)0x6a,(byte)0x52,(byte)0x41,
+ (byte)0xbd,(byte)0xb4,(byte)0xa4,
+ (byte)0xde,(byte)0xd5,(byte)0xd5,
+ (byte)0xc5,(byte)0xac,(byte)0x8b,
+ (byte)0xc5,(byte)0xac,(byte)0x8b,
+ (byte)0xd5,(byte)0xc5,(byte)0xbd,
+ (byte)0xc5,(byte)0xac,(byte)0x8b,
+ (byte)0xc5,(byte)0xac,(byte)0x94,
+ (byte)0xde,(byte)0xd5,(byte)0xcd,
+ (byte)0x94,(byte)0x83,(byte)0x73,
+ (byte)0x83,(byte)0x4a,(byte)0x52,
+ (byte)0x52,(byte)0x31,(byte)0x31,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x52,(byte)0x10,(byte)0x18,
+ (byte)0xa4,(byte)0x4a,(byte)0x5a,
+ (byte)0x52,(byte)0x31,(byte)0x4a,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x10,
+ (byte)0x4a,(byte)0x20,(byte)0x39,
+ (byte)0x18,(byte)0x10,(byte)0x18,
+ (byte)0x10,(byte)0x18,(byte)0x29,
+ (byte)0x08,(byte)0x08,(byte)0x10,
+ (byte)0x4a,(byte)0x18,(byte)0x31,
+ (byte)0x20,(byte)0x18,(byte)0x20,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x08,
+ (byte)0x20,(byte)0x08,(byte)0x10,
+ (byte)0x31,(byte)0x18,(byte)0x20,
+ (byte)0x20,(byte)0x00,(byte)0x08,
+ (byte)0x73,(byte)0x4a,(byte)0x6a,
+ (byte)0xac,(byte)0x52,(byte)0x94,
+ (byte)0x8b,(byte)0x20,(byte)0x4a,
+ (byte)0x83,(byte)0x20,(byte)0x08,
+ (byte)0x62,(byte)0x18,(byte)0x00,
+ (byte)0x6a,(byte)0x10,(byte)0x31,
+ (byte)0x73,(byte)0x18,(byte)0x41,
+ (byte)0x5a,(byte)0x20,(byte)0x31,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x39,(byte)0x10,(byte)0x18,
+ (byte)0x31,(byte)0x10,(byte)0x08,
+ (byte)0x31,(byte)0x10,(byte)0x18,
+ (byte)0x83,(byte)0x41,(byte)0x73,
+ (byte)0x8b,(byte)0x52,(byte)0x73,
+ (byte)0x73,(byte)0x41,(byte)0x41,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x20,(byte)0x10,(byte)0x10,
+ (byte)0x20,(byte)0x10,(byte)0x10,
+ (byte)0x8b,(byte)0x6a,(byte)0x52,
+ (byte)0xbd,(byte)0xac,(byte)0x83,
+ (byte)0xc5,(byte)0xac,(byte)0x73,
+ (byte)0xc5,(byte)0xac,(byte)0x8b,
+ (byte)0xcd,(byte)0xc5,(byte)0xc5,
+ (byte)0xc5,(byte)0xbd,(byte)0x9c,
+ (byte)0xcd,(byte)0xc5,(byte)0xbd,
+ (byte)0xc5,(byte)0xb4,(byte)0xa4,
+ (byte)0xcd,(byte)0xb4,(byte)0x83,
+ (byte)0xac,(byte)0x94,(byte)0x73,
+ (byte)0x39,(byte)0x20,(byte)0x20,
+ (byte)0x39,(byte)0x20,(byte)0x20,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x52,(byte)0x10,(byte)0x18,
+ (byte)0x94,(byte)0x31,(byte)0x41,
+ (byte)0x73,(byte)0x39,(byte)0x62,
+ (byte)0x31,(byte)0x10,(byte)0x18,
+ (byte)0x4a,(byte)0x20,(byte)0x31,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x4a,(byte)0x39,(byte)0x4a,
+ (byte)0x6a,(byte)0x62,(byte)0x8b,
+ (byte)0x29,(byte)0x29,(byte)0x41,
+ (byte)0x62,(byte)0x62,(byte)0x83,
+ (byte)0x73,(byte)0x62,(byte)0x8b,
+ (byte)0x31,(byte)0x31,(byte)0x39,
+ (byte)0x31,(byte)0x18,(byte)0x20,
+ (byte)0x83,(byte)0x39,(byte)0x6a,
+ (byte)0x83,(byte)0x31,(byte)0x62,
+ (byte)0x9c,(byte)0x5a,(byte)0x8b,
+ (byte)0x94,(byte)0x4a,(byte)0x7b,
+ (byte)0x83,(byte)0x4a,(byte)0x6a,
+ (byte)0xa4,(byte)0x52,(byte)0x83,
+ (byte)0x8b,(byte)0x20,(byte)0x52,
+ (byte)0x7b,(byte)0x10,(byte)0x31,
+ (byte)0x6a,(byte)0x08,(byte)0x20,
+ (byte)0x73,(byte)0x10,(byte)0x31,
+ (byte)0x5a,(byte)0x20,(byte)0x31,
+ (byte)0x39,(byte)0x31,(byte)0x18,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x10,(byte)0x10,(byte)0x20,
+ (byte)0x5a,(byte)0x18,(byte)0x29,
+ (byte)0x94,(byte)0x29,(byte)0x4a,
+ (byte)0x7b,(byte)0x31,(byte)0x4a,
+ (byte)0x73,(byte)0x29,(byte)0x41,
+ (byte)0xac,(byte)0x5a,(byte)0x7b,
+ (byte)0xc5,(byte)0x94,(byte)0x8b,
+ (byte)0xac,(byte)0x83,(byte)0x9c,
+ (byte)0x39,(byte)0x20,(byte)0x20,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x5a,(byte)0x41,(byte)0x31,
+ (byte)0xa4,(byte)0x94,(byte)0x5a,
+ (byte)0xac,(byte)0x8b,(byte)0x31,
+ (byte)0xa4,(byte)0x8b,(byte)0x52,
+ (byte)0xc5,(byte)0xbd,(byte)0xb4,
+ (byte)0x8b,(byte)0x7b,(byte)0x41,
+ (byte)0xc5,(byte)0xb4,(byte)0xac,
+ (byte)0xb4,(byte)0x9c,(byte)0x73,
+ (byte)0xbd,(byte)0xa4,(byte)0x5a,
+ (byte)0xbd,(byte)0x9c,(byte)0x83,
+ (byte)0x20,(byte)0x10,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x20,(byte)0x10,(byte)0x10,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x52,(byte)0x10,(byte)0x20,
+ (byte)0x8b,(byte)0x29,(byte)0x39,
+ (byte)0x8b,(byte)0x39,(byte)0x6a,
+ (byte)0x83,(byte)0x41,(byte)0x62,
+ (byte)0x94,(byte)0x41,(byte)0x73,
+ (byte)0x4a,(byte)0x31,(byte)0x41,
+ (byte)0x6a,(byte)0x6a,(byte)0x83,
+ (byte)0x9c,(byte)0x9c,(byte)0xcd,
+ (byte)0x8b,(byte)0x9c,(byte)0xc5,
+ (byte)0x9c,(byte)0xa4,(byte)0xcd,
+ (byte)0xa4,(byte)0xac,(byte)0xd5,
+ (byte)0x8b,(byte)0x8b,(byte)0xa4,
+ (byte)0x8b,(byte)0x41,(byte)0x73,
+ (byte)0xac,(byte)0x52,(byte)0x94,
+ (byte)0xb4,(byte)0x5a,(byte)0xa4,
+ (byte)0xa4,(byte)0x41,(byte)0x83,
+ (byte)0xb4,(byte)0x6a,(byte)0xa4,
+ (byte)0xac,(byte)0x7b,(byte)0xa4,
+ (byte)0xb4,(byte)0x73,(byte)0xa4,
+ (byte)0xa4,(byte)0x4a,(byte)0x8b,
+ (byte)0x94,(byte)0x31,(byte)0x73,
+ (byte)0x94,(byte)0x39,(byte)0x73,
+ (byte)0x73,(byte)0x18,(byte)0x39,
+ (byte)0x4a,(byte)0x08,(byte)0x18,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x18,(byte)0x10,(byte)0x18,
+ (byte)0x83,(byte)0x31,(byte)0x39,
+ (byte)0xb4,(byte)0x73,(byte)0x39,
+ (byte)0xbd,(byte)0x6a,(byte)0x73,
+ (byte)0x94,(byte)0x62,(byte)0x7b,
+ (byte)0xa4,(byte)0x62,(byte)0x5a,
+ (byte)0xbd,(byte)0x7b,(byte)0x5a,
+ (byte)0xc5,(byte)0x8b,(byte)0xb4,
+ (byte)0x62,(byte)0x41,(byte)0x4a,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x10,(byte)0x10,(byte)0x00,
+ (byte)0x4a,(byte)0x41,(byte)0x10,
+ (byte)0x73,(byte)0x62,(byte)0x20,
+ (byte)0x7b,(byte)0x6a,(byte)0x41,
+ (byte)0x9c,(byte)0x94,(byte)0x83,
+ (byte)0xa4,(byte)0x94,(byte)0x73,
+ (byte)0xb4,(byte)0xa4,(byte)0x9c,
+ (byte)0x83,(byte)0x6a,(byte)0x29,
+ (byte)0xac,(byte)0x8b,(byte)0x41,
+ (byte)0x4a,(byte)0x41,(byte)0x20,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x29,(byte)0x10,(byte)0x18,
+ (byte)0x20,(byte)0x10,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x4a,(byte)0x08,(byte)0x20,
+ (byte)0x7b,(byte)0x18,(byte)0x29,
+ (byte)0x83,(byte)0x31,(byte)0x5a,
+ (byte)0xa4,(byte)0x5a,(byte)0x94,
+ (byte)0xac,(byte)0x52,(byte)0x94,
+ (byte)0x9c,(byte)0x52,(byte)0x8b,
+ (byte)0x9c,(byte)0x9c,(byte)0xbd,
+ (byte)0xa4,(byte)0xac,(byte)0xd5,
+ (byte)0x9c,(byte)0xa4,(byte)0xcd,
+ (byte)0xa4,(byte)0xac,(byte)0xd5,
+ (byte)0xac,(byte)0xb4,(byte)0xd5,
+ (byte)0xb4,(byte)0x9c,(byte)0xcd,
+ (byte)0xa4,(byte)0x41,(byte)0x83,
+ (byte)0xa4,(byte)0x39,(byte)0x6a,
+ (byte)0xb4,(byte)0x62,(byte)0x39,
+ (byte)0xa4,(byte)0x41,(byte)0x5a,
+ (byte)0xb4,(byte)0x73,(byte)0xb4,
+ (byte)0xc5,(byte)0x8b,(byte)0xc5,
+ (byte)0xb4,(byte)0x6a,(byte)0x9c,
+ (byte)0x83,(byte)0x20,(byte)0x4a,
+ (byte)0x94,(byte)0x31,(byte)0x62,
+ (byte)0xc5,(byte)0x94,(byte)0xb4,
+ (byte)0x83,(byte)0x41,(byte)0x5a,
+ (byte)0x29,(byte)0x08,(byte)0x08,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x08,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x41,(byte)0x31,(byte)0x20,
+ (byte)0x7b,(byte)0x5a,(byte)0x29,
+ (byte)0x6a,(byte)0x41,(byte)0x29,
+ (byte)0x4a,(byte)0x31,(byte)0x29,
+ (byte)0x5a,(byte)0x39,(byte)0x39,
+ (byte)0x94,(byte)0x6a,(byte)0x83,
+ (byte)0x6a,(byte)0x4a,(byte)0x52,
+ (byte)0x29,(byte)0x10,(byte)0x10,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x39,(byte)0x31,(byte)0x29,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x10,
+ (byte)0x62,(byte)0x29,(byte)0x41,
+ (byte)0x5a,(byte)0x20,(byte)0x29,
+ (byte)0x39,(byte)0x31,(byte)0x10,
+ (byte)0x62,(byte)0x5a,(byte)0x39,
+ (byte)0xa4,(byte)0x94,(byte)0x6a,
+ (byte)0x83,(byte)0x73,(byte)0x39,
+ (byte)0xac,(byte)0xa4,(byte)0x7b,
+ (byte)0x73,(byte)0x62,(byte)0x39,
+ (byte)0x83,(byte)0x73,(byte)0x4a,
+ (byte)0x52,(byte)0x4a,(byte)0x10,
+ (byte)0x18,(byte)0x18,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x31,(byte)0x18,(byte)0x20,
+ (byte)0x29,(byte)0x18,(byte)0x20,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x29,(byte)0x08,(byte)0x10,
+ (byte)0x7b,(byte)0x18,(byte)0x39,
+ (byte)0xa4,(byte)0x62,(byte)0x8b,
+ (byte)0xac,(byte)0x5a,(byte)0x9c,
+ (byte)0xa4,(byte)0x4a,(byte)0x8b,
+ (byte)0xa4,(byte)0x41,(byte)0x8b,
+ (byte)0xb4,(byte)0x83,(byte)0xb4,
+ (byte)0xac,(byte)0xb4,(byte)0xd5,
+ (byte)0xa4,(byte)0xac,(byte)0xd5,
+ (byte)0xa4,(byte)0xac,(byte)0xd5,
+ (byte)0xac,(byte)0xb4,(byte)0xde,
+ (byte)0xbd,(byte)0xa4,(byte)0xd5,
+ (byte)0xb4,(byte)0x5a,(byte)0x9c,
+ (byte)0xac,(byte)0x4a,(byte)0x4a,
+ (byte)0xbd,(byte)0x73,(byte)0x20,
+ (byte)0xa4,(byte)0x52,(byte)0x52,
+ (byte)0xbd,(byte)0x7b,(byte)0xbd,
+ (byte)0xac,(byte)0x52,(byte)0x9c,
+ (byte)0x9c,(byte)0x41,(byte)0x73,
+ (byte)0x73,(byte)0x08,(byte)0x20,
+ (byte)0x8b,(byte)0x29,(byte)0x4a,
+ (byte)0xb4,(byte)0x6a,(byte)0x94,
+ (byte)0x9c,(byte)0x6a,(byte)0x83,
+ (byte)0x7b,(byte)0x6a,(byte)0x6a,
+ (byte)0x52,(byte)0x4a,(byte)0x41,
+ (byte)0x6a,(byte)0x62,(byte)0x5a,
+ (byte)0x39,(byte)0x39,(byte)0x31,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x31,(byte)0x29,(byte)0x20,
+ (byte)0x20,(byte)0x20,(byte)0x10,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x4a,(byte)0x41,(byte)0x31,
+ (byte)0x29,(byte)0x20,(byte)0x18,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x31,(byte)0x20,(byte)0x18,
+ (byte)0x39,(byte)0x29,(byte)0x29,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x41,(byte)0x18,(byte)0x18,
+ (byte)0x62,(byte)0x31,(byte)0x31,
+ (byte)0x18,(byte)0x10,(byte)0x00,
+ (byte)0x4a,(byte)0x4a,(byte)0x20,
+ (byte)0xac,(byte)0x9c,(byte)0x62,
+ (byte)0xa4,(byte)0x94,(byte)0x73,
+ (byte)0x9c,(byte)0x8b,(byte)0x6a,
+ (byte)0x94,(byte)0x83,(byte)0x5a,
+ (byte)0x8b,(byte)0x7b,(byte)0x5a,
+ (byte)0x52,(byte)0x41,(byte)0x18,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x5a,(byte)0x31,(byte)0x4a,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x7b,(byte)0x18,(byte)0x39,
+ (byte)0xb4,(byte)0x6a,(byte)0xa4,
+ (byte)0xac,(byte)0x62,(byte)0x9c,
+ (byte)0xac,(byte)0x52,(byte)0x62,
+ (byte)0xa4,(byte)0x4a,(byte)0x5a,
+ (byte)0xac,(byte)0x5a,(byte)0x94,
+ (byte)0xbd,(byte)0xb4,(byte)0xde,
+ (byte)0xac,(byte)0xb4,(byte)0xd5,
+ (byte)0xac,(byte)0xb4,(byte)0xde,
+ (byte)0xb4,(byte)0xb4,(byte)0xd5,
+ (byte)0xc5,(byte)0xc5,(byte)0xe6,
+ (byte)0xb4,(byte)0x73,(byte)0xac,
+ (byte)0x94,(byte)0x29,(byte)0x5a,
+ (byte)0xb4,(byte)0x6a,(byte)0x7b,
+ (byte)0xc5,(byte)0x9c,(byte)0xcd,
+ (byte)0xc5,(byte)0x94,(byte)0xac,
+ (byte)0xc5,(byte)0x94,(byte)0xb4,
+ (byte)0x9c,(byte)0x41,(byte)0x7b,
+ (byte)0x94,(byte)0x31,(byte)0x52,
+ (byte)0x94,(byte)0x31,(byte)0x41,
+ (byte)0x94,(byte)0x39,(byte)0x62,
+ (byte)0x94,(byte)0x73,(byte)0x7b,
+ (byte)0x73,(byte)0x6a,(byte)0x62,
+ (byte)0x5a,(byte)0x5a,(byte)0x52,
+ (byte)0x94,(byte)0x8b,(byte)0x94,
+ (byte)0x41,(byte)0x39,(byte)0x39,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x39,(byte)0x31,(byte)0x29,
+ (byte)0x4a,(byte)0x41,(byte)0x39,
+ (byte)0x4a,(byte)0x41,(byte)0x39,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x10,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x29,(byte)0x20,(byte)0x10,
+ (byte)0xac,(byte)0x9c,(byte)0x62,
+ (byte)0xac,(byte)0x9c,(byte)0x52,
+ (byte)0xc5,(byte)0xb4,(byte)0x9c,
+ (byte)0xb4,(byte)0xa4,(byte)0x83,
+ (byte)0xac,(byte)0x9c,(byte)0x6a,
+ (byte)0x29,(byte)0x29,(byte)0x10,
+ (byte)0x41,(byte)0x20,(byte)0x20,
+ (byte)0x52,(byte)0x20,(byte)0x39,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x62,(byte)0x39,(byte)0x52,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x73,(byte)0x20,(byte)0x39,
+ (byte)0x9c,(byte)0x41,(byte)0x7b,
+ (byte)0xbd,(byte)0x83,(byte)0xc5,
+ (byte)0xb4,(byte)0x6a,(byte)0x5a,
+ (byte)0xb4,(byte)0x6a,(byte)0x29,
+ (byte)0xb4,(byte)0x6a,(byte)0x9c,
+ (byte)0xcd,(byte)0xbd,(byte)0xe6,
+ (byte)0xb4,(byte)0xb4,(byte)0xde,
+ (byte)0xac,(byte)0xb4,(byte)0xde,
+ (byte)0xb4,(byte)0xb4,(byte)0xde,
+ (byte)0xbd,(byte)0xbd,(byte)0xde,
+ (byte)0xb4,(byte)0x6a,(byte)0xac,
+ (byte)0x94,(byte)0x29,(byte)0x62,
+ (byte)0x9c,(byte)0x31,(byte)0x83,
+ (byte)0xb4,(byte)0x6a,(byte)0xac,
+ (byte)0xd5,(byte)0xb4,(byte)0x7b,
+ (byte)0xcd,(byte)0xa4,(byte)0x4a,
+ (byte)0xb4,(byte)0x73,(byte)0x9c,
+ (byte)0x9c,(byte)0x41,(byte)0x52,
+ (byte)0x73,(byte)0x10,(byte)0x00,
+ (byte)0x7b,(byte)0x29,(byte)0x39,
+ (byte)0xc5,(byte)0xbd,(byte)0xc5,
+ (byte)0x7b,(byte)0x73,(byte)0x6a,
+ (byte)0x6a,(byte)0x62,(byte)0x62,
+ (byte)0xa4,(byte)0x9c,(byte)0x9c,
+ (byte)0x5a,(byte)0x5a,(byte)0x5a,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x4a,(byte)0x41,(byte)0x39,
+ (byte)0x41,(byte)0x41,(byte)0x31,
+ (byte)0x31,(byte)0x31,(byte)0x20,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x08,(byte)0x00,
+ (byte)0x18,(byte)0x00,(byte)0x08,
+ (byte)0x39,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x29,(byte)0x41,(byte)0x41,
+ (byte)0x62,(byte)0x4a,(byte)0x31,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x08,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x4a,(byte)0x41,(byte)0x31,
+ (byte)0xac,(byte)0x9c,(byte)0x62,
+ (byte)0xac,(byte)0x9c,(byte)0x62,
+ (byte)0xcd,(byte)0xc5,(byte)0x94,
+ (byte)0xbd,(byte)0xac,(byte)0x7b,
+ (byte)0xac,(byte)0x9c,(byte)0x62,
+ (byte)0x41,(byte)0x41,(byte)0x20,
+ (byte)0x52,(byte)0x29,(byte)0x29,
+ (byte)0x52,(byte)0x18,(byte)0x29,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x31,(byte)0x29,(byte)0x29,
+ (byte)0x6a,(byte)0x41,(byte)0x5a,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x5a,(byte)0x18,(byte)0x29,
+ (byte)0xa4,(byte)0x4a,(byte)0x7b,
+ (byte)0xbd,(byte)0x83,(byte)0xbd,
+ (byte)0xa4,(byte)0x5a,(byte)0x7b,
+ (byte)0xa4,(byte)0x52,(byte)0x18,
+ (byte)0x9c,(byte)0x39,(byte)0x5a,
+ (byte)0xb4,(byte)0x8b,(byte)0xbd,
+ (byte)0xb4,(byte)0xbd,(byte)0xe6,
+ (byte)0xb4,(byte)0xbd,(byte)0xde,
+ (byte)0xb4,(byte)0xbd,(byte)0xde,
+ (byte)0xb4,(byte)0xb4,(byte)0xd5,
+ (byte)0xb4,(byte)0x8b,(byte)0xb4,
+ (byte)0x9c,(byte)0x4a,(byte)0x7b,
+ (byte)0x9c,(byte)0x41,(byte)0x7b,
+ (byte)0xc5,(byte)0x9c,(byte)0xcd,
+ (byte)0xcd,(byte)0xac,(byte)0x6a,
+ (byte)0xc5,(byte)0x7b,(byte)0x08,
+ (byte)0xc5,(byte)0x8b,(byte)0x83,
+ (byte)0xa4,(byte)0x4a,(byte)0x7b,
+ (byte)0x7b,(byte)0x20,(byte)0x41,
+ (byte)0x5a,(byte)0x31,(byte)0x29,
+ (byte)0xa4,(byte)0x94,(byte)0x8b,
+ (byte)0x83,(byte)0x7b,(byte)0x6a,
+ (byte)0x7b,(byte)0x6a,(byte)0x6a,
+ (byte)0x29,(byte)0x29,(byte)0x20,
+ (byte)0x29,(byte)0x29,(byte)0x20,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x18,(byte)0x00,(byte)0x08,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x83,(byte)0x7b,(byte)0x6a,
+ (byte)0x4a,(byte)0x4a,(byte)0x39,
+ (byte)0x18,(byte)0x20,(byte)0x10,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x08,(byte)0x00,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x7b,(byte)0x6a,(byte)0x52,
+ (byte)0x73,(byte)0x4a,(byte)0x39,
+ (byte)0x20,(byte)0x18,(byte)0x08,
+ (byte)0x4a,(byte)0x4a,(byte)0x10,
+ (byte)0x41,(byte)0x41,(byte)0x10,
+ (byte)0x29,(byte)0x29,(byte)0x08,
+ (byte)0x31,(byte)0x31,(byte)0x18,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x18,(byte)0x18,(byte)0x08,
+ (byte)0x8b,(byte)0x7b,(byte)0x41,
+ (byte)0xa4,(byte)0x94,(byte)0x4a,
+ (byte)0xac,(byte)0x9c,(byte)0x5a,
+ (byte)0xc5,(byte)0xbd,(byte)0x83,
+ (byte)0xac,(byte)0xa4,(byte)0x6a,
+ (byte)0x9c,(byte)0x8b,(byte)0x52,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x29,(byte)0x10,(byte)0x10,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x52,(byte)0x39,(byte)0x4a,
+ (byte)0x5a,(byte)0x39,(byte)0x52,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x39,(byte)0x10,(byte)0x20,
+ (byte)0x8b,(byte)0x31,(byte)0x5a,
+ (byte)0xa4,(byte)0x52,(byte)0x83,
+ (byte)0xbd,(byte)0x7b,(byte)0xb4,
+ (byte)0xb4,(byte)0x7b,(byte)0x94,
+ (byte)0xa4,(byte)0x4a,(byte)0x6a,
+ (byte)0x9c,(byte)0x41,(byte)0x83,
+ (byte)0xbd,(byte)0xac,(byte)0xd5,
+ (byte)0xb4,(byte)0xbd,(byte)0xde,
+ (byte)0xb4,(byte)0xbd,(byte)0xde,
+ (byte)0x8b,(byte)0x83,(byte)0xa4,
+ (byte)0x7b,(byte)0x5a,(byte)0x6a,
+ (byte)0xa4,(byte)0x5a,(byte)0x83,
+ (byte)0x94,(byte)0x41,(byte)0x73,
+ (byte)0xb4,(byte)0x73,(byte)0xa4,
+ (byte)0xcd,(byte)0xa4,(byte)0x52,
+ (byte)0xb4,(byte)0x62,(byte)0x00,
+ (byte)0xa4,(byte)0x5a,(byte)0x62,
+ (byte)0x94,(byte)0x31,(byte)0x6a,
+ (byte)0x6a,(byte)0x10,(byte)0x29,
+ (byte)0x41,(byte)0x20,(byte)0x10,
+ (byte)0x83,(byte)0x73,(byte)0x6a,
+ (byte)0x62,(byte)0x52,(byte)0x52,
+ (byte)0x41,(byte)0x39,(byte)0x31,
+ (byte)0x4a,(byte)0x4a,(byte)0x41,
+ (byte)0x29,(byte)0x29,(byte)0x20,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x08,(byte)0x10,(byte)0x08,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x29,(byte)0x20,(byte)0x10,
+ (byte)0x29,(byte)0x29,(byte)0x18,
+ (byte)0x20,(byte)0x20,(byte)0x18,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x29,(byte)0x18,(byte)0x10,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x39,(byte)0x31,(byte)0x18,
+ (byte)0x7b,(byte)0x73,(byte)0x31,
+ (byte)0x5a,(byte)0x5a,(byte)0x20,
+ (byte)0x4a,(byte)0x41,(byte)0x10,
+ (byte)0x29,(byte)0x29,(byte)0x08,
+ (byte)0x18,(byte)0x18,(byte)0x08,
+ (byte)0x73,(byte)0x6a,(byte)0x39,
+ (byte)0x9c,(byte)0x83,(byte)0x41,
+ (byte)0x8b,(byte)0x6a,(byte)0x31,
+ (byte)0xbd,(byte)0xac,(byte)0x6a,
+ (byte)0xac,(byte)0x9c,(byte)0x5a,
+ (byte)0xac,(byte)0x94,(byte)0x52,
+ (byte)0x6a,(byte)0x62,(byte)0x4a,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x7b,(byte)0x52,(byte)0x62,
+ (byte)0x31,(byte)0x18,(byte)0x20,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x8b,(byte)0x39,(byte)0x5a,
+ (byte)0x8b,(byte)0x29,(byte)0x5a,
+ (byte)0xac,(byte)0x5a,(byte)0x94,
+ (byte)0xc5,(byte)0x8b,(byte)0xc5,
+ (byte)0xa4,(byte)0x52,(byte)0x94,
+ (byte)0x9c,(byte)0x39,(byte)0x73,
+ (byte)0xac,(byte)0x83,(byte)0xac,
+ (byte)0x83,(byte)0x73,(byte)0x8b,
+ (byte)0x83,(byte)0x7b,(byte)0x94,
+ (byte)0x62,(byte)0x4a,(byte)0x5a,
+ (byte)0x5a,(byte)0x41,(byte)0x4a,
+ (byte)0x5a,(byte)0x31,(byte)0x41,
+ (byte)0x94,(byte)0x62,(byte)0x8b,
+ (byte)0xc5,(byte)0x8b,(byte)0xc5,
+ (byte)0xcd,(byte)0x9c,(byte)0x8b,
+ (byte)0xa4,(byte)0x52,(byte)0x18,
+ (byte)0x8b,(byte)0x31,(byte)0x4a,
+ (byte)0xac,(byte)0x73,(byte)0x94,
+ (byte)0x6a,(byte)0x20,(byte)0x31,
+ (byte)0x18,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x39,(byte)0x39,(byte)0x31,
+ (byte)0x7b,(byte)0x73,(byte)0x7b,
+ (byte)0x41,(byte)0x39,(byte)0x39,
+ (byte)0x08,(byte)0x10,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x29,(byte)0x20,(byte)0x18,
+ (byte)0x20,(byte)0x20,(byte)0x18,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x39,(byte)0x31,(byte)0x18,
+ (byte)0x5a,(byte)0x4a,(byte)0x29,
+ (byte)0x31,(byte)0x29,(byte)0x10,
+ (byte)0x39,(byte)0x31,(byte)0x10,
+ (byte)0x20,(byte)0x18,(byte)0x08,
+ (byte)0x83,(byte)0x6a,(byte)0x39,
+ (byte)0xbd,(byte)0xac,(byte)0x73,
+ (byte)0xa4,(byte)0x94,(byte)0x52,
+ (byte)0xa4,(byte)0x94,(byte)0x5a,
+ (byte)0xb4,(byte)0xa4,(byte)0x73,
+ (byte)0x94,(byte)0x7b,(byte)0x41,
+ (byte)0xa4,(byte)0x8b,(byte)0x41,
+ (byte)0x31,(byte)0x29,(byte)0x18,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x29,(byte)0x20,(byte)0x20,
+ (byte)0x83,(byte)0x52,(byte)0x52,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x5a,(byte)0x31,(byte)0x41,
+ (byte)0x94,(byte)0x39,(byte)0x62,
+ (byte)0x94,(byte)0x31,(byte)0x62,
+ (byte)0xc5,(byte)0x9c,(byte)0xb4,
+ (byte)0xb4,(byte)0x6a,(byte)0xac,
+ (byte)0x94,(byte)0x31,(byte)0x73,
+ (byte)0x9c,(byte)0x52,(byte)0x7b,
+ (byte)0x62,(byte)0x41,(byte)0x52,
+ (byte)0x52,(byte)0x39,(byte)0x4a,
+ (byte)0x5a,(byte)0x41,(byte)0x52,
+ (byte)0x4a,(byte)0x39,(byte)0x4a,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x5a,(byte)0x39,(byte)0x52,
+ (byte)0xcd,(byte)0x9c,(byte)0xd5,
+ (byte)0xcd,(byte)0xb4,(byte)0xe6,
+ (byte)0xbd,(byte)0x94,(byte)0xb4,
+ (byte)0xb4,(byte)0x83,(byte)0xa4,
+ (byte)0xa4,(byte)0x73,(byte)0x94,
+ (byte)0xbd,(byte)0x9c,(byte)0xbd,
+ (byte)0x4a,(byte)0x20,(byte)0x20,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x18,(byte)0x10,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x08,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x20,(byte)0x08,
+ (byte)0x18,(byte)0x18,(byte)0x00,
+ (byte)0x39,(byte)0x29,(byte)0x18,
+ (byte)0x73,(byte)0x62,(byte)0x41,
+ (byte)0x94,(byte)0x83,(byte)0x6a,
+ (byte)0x7b,(byte)0x73,(byte)0x41,
+ (byte)0xa4,(byte)0x94,(byte)0x62,
+ (byte)0x94,(byte)0x8b,(byte)0x52,
+ (byte)0xac,(byte)0x9c,(byte)0x5a,
+ (byte)0x94,(byte)0x7b,(byte)0x39,
+ (byte)0x83,(byte)0x7b,(byte)0x39,
+ (byte)0x10,(byte)0x18,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x6a,(byte)0x4a,(byte)0x4a,
+ (byte)0x62,(byte)0x39,(byte)0x39,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x10,(byte)0x10,
+ (byte)0x94,(byte)0x4a,(byte)0x6a,
+ (byte)0x8b,(byte)0x20,(byte)0x4a,
+ (byte)0xc5,(byte)0x94,(byte)0x94,
+ (byte)0xcd,(byte)0xac,(byte)0x83,
+ (byte)0xbd,(byte)0x7b,(byte)0xbd,
+ (byte)0x9c,(byte)0x4a,(byte)0x7b,
+ (byte)0x73,(byte)0x4a,(byte)0x62,
+ (byte)0x52,(byte)0x39,(byte)0x4a,
+ (byte)0x41,(byte)0x31,(byte)0x41,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x52,(byte)0x29,(byte)0x41,
+ (byte)0xcd,(byte)0xa4,(byte)0xde,
+ (byte)0xcd,(byte)0xb4,(byte)0xe6,
+ (byte)0xc5,(byte)0xac,(byte)0xd5,
+ (byte)0xcd,(byte)0xc5,(byte)0xee,
+ (byte)0x94,(byte)0x4a,(byte)0x62,
+ (byte)0x83,(byte)0x41,(byte)0x62,
+ (byte)0x8b,(byte)0x6a,(byte)0x7b,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x29,(byte)0x20,(byte)0x08,
+ (byte)0x6a,(byte)0x5a,(byte)0x31,
+ (byte)0xd5,(byte)0xc5,(byte)0x94,
+ (byte)0x9c,(byte)0x8b,(byte)0x5a,
+ (byte)0x9c,(byte)0x8b,(byte)0x5a,
+ (byte)0x73,(byte)0x6a,(byte)0x31,
+ (byte)0x4a,(byte)0x4a,(byte)0x10,
+ (byte)0xa4,(byte)0x94,(byte)0x5a,
+ (byte)0xc5,(byte)0xb4,(byte)0x73,
+ (byte)0x62,(byte)0x5a,(byte)0x31,
+ (byte)0x18,(byte)0x18,(byte)0x08,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x39,(byte)0x31,(byte)0x31,
+ (byte)0x94,(byte)0x5a,(byte)0x5a,
+ (byte)0x20,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x52,(byte)0x31,(byte)0x39,
+ (byte)0x9c,(byte)0x4a,(byte)0x6a,
+ (byte)0x9c,(byte)0x39,(byte)0x62,
+ (byte)0xcd,(byte)0x94,(byte)0x41,
+ (byte)0xcd,(byte)0xb4,(byte)0xa4,
+ (byte)0xac,(byte)0x62,(byte)0xa4,
+ (byte)0x7b,(byte)0x4a,(byte)0x6a,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x08,(byte)0x10,
+ (byte)0xac,(byte)0x73,(byte)0xac,
+ (byte)0xcd,(byte)0xbd,(byte)0xee,
+ (byte)0xa4,(byte)0x83,(byte)0x9c,
+ (byte)0xac,(byte)0x83,(byte)0xac,
+ (byte)0xb4,(byte)0x8b,(byte)0xac,
+ (byte)0x31,(byte)0x00,(byte)0x08,
+ (byte)0x52,(byte)0x39,(byte)0x41,
+ (byte)0x39,(byte)0x29,(byte)0x29,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x41,(byte)0x10,(byte)0x31,
+ (byte)0x31,(byte)0x18,(byte)0x31,
+ (byte)0x10,(byte)0x10,(byte)0x20,
+ (byte)0x10,(byte)0x10,(byte)0x18,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x31,(byte)0x20,(byte)0x08,
+ (byte)0x29,(byte)0x18,(byte)0x08,
+ (byte)0x20,(byte)0x10,(byte)0x08,
+ (byte)0x52,(byte)0x41,(byte)0x10,
+ (byte)0x7b,(byte)0x6a,(byte)0x41,
+ (byte)0x8b,(byte)0x7b,(byte)0x52,
+ (byte)0x8b,(byte)0x7b,(byte)0x62,
+ (byte)0x29,(byte)0x20,(byte)0x00,
+ (byte)0x8b,(byte)0x7b,(byte)0x41,
+ (byte)0x6a,(byte)0x62,(byte)0x31,
+ (byte)0xa4,(byte)0x94,(byte)0x5a,
+ (byte)0x4a,(byte)0x41,(byte)0x20,
+ (byte)0x29,(byte)0x29,(byte)0x10,
+ (byte)0x10,(byte)0x18,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x18,(byte)0x10,
+ (byte)0x7b,(byte)0x5a,(byte)0x52,
+ (byte)0x7b,(byte)0x41,(byte)0x39,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x8b,(byte)0x4a,(byte)0x62,
+ (byte)0x9c,(byte)0x39,(byte)0x62,
+ (byte)0xbd,(byte)0x73,(byte)0x73,
+ (byte)0xcd,(byte)0x94,(byte)0x29,
+ (byte)0xc5,(byte)0x8b,(byte)0x7b,
+ (byte)0xc5,(byte)0x94,(byte)0xcd,
+ (byte)0x62,(byte)0x39,(byte)0x52,
+ (byte)0x10,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x6a,(byte)0x39,(byte)0x5a,
+ (byte)0xd5,(byte)0xbd,(byte)0xee,
+ (byte)0x83,(byte)0x5a,(byte)0x73,
+ (byte)0x7b,(byte)0x41,(byte)0x62,
+ (byte)0x62,(byte)0x39,(byte)0x52,
+ (byte)0x18,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x10,
+ (byte)0x18,(byte)0x10,(byte)0x20,
+ (byte)0x10,(byte)0x18,(byte)0x29,
+ (byte)0x18,(byte)0x18,(byte)0x29,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x18,(byte)0x18,(byte)0x08,
+ (byte)0x29,(byte)0x18,(byte)0x08,
+ (byte)0x39,(byte)0x29,(byte)0x10,
+ (byte)0x29,(byte)0x20,(byte)0x00,
+ (byte)0x39,(byte)0x31,(byte)0x18,
+ (byte)0xa4,(byte)0x94,(byte)0x6a,
+ (byte)0x39,(byte)0x39,(byte)0x18,
+ (byte)0x52,(byte)0x52,(byte)0x31,
+ (byte)0xa4,(byte)0x94,(byte)0x62,
+ (byte)0x8b,(byte)0x7b,(byte)0x5a,
+ (byte)0x62,(byte)0x52,(byte)0x41,
+ (byte)0x31,(byte)0x31,(byte)0x10,
+ (byte)0x52,(byte)0x4a,(byte)0x10,
+ (byte)0x10,(byte)0x10,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x83,(byte)0x52,(byte)0x4a,
+ (byte)0x29,(byte)0x10,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x5a,(byte)0x39,(byte)0x4a,
+ (byte)0xa4,(byte)0x4a,(byte)0x6a,
+ (byte)0xa4,(byte)0x5a,(byte)0x62,
+ (byte)0xbd,(byte)0x73,(byte)0x4a,
+ (byte)0xc5,(byte)0x7b,(byte)0x10,
+ (byte)0xc5,(byte)0x94,(byte)0xa4,
+ (byte)0xc5,(byte)0x94,(byte)0xd5,
+ (byte)0xa4,(byte)0x7b,(byte)0xac,
+ (byte)0x29,(byte)0x10,(byte)0x20,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x29,(byte)0x10,(byte)0x20,
+ (byte)0x62,(byte)0x41,(byte)0x5a,
+ (byte)0x31,(byte)0x08,(byte)0x18,
+ (byte)0x62,(byte)0x41,(byte)0x5a,
+ (byte)0x18,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x10,(byte)0x18,(byte)0x00,
+ (byte)0x31,(byte)0x20,(byte)0x08,
+ (byte)0x29,(byte)0x20,(byte)0x08,
+ (byte)0x39,(byte)0x31,(byte)0x10,
+ (byte)0x41,(byte)0x41,(byte)0x20,
+ (byte)0x62,(byte)0x5a,(byte)0x39,
+ (byte)0x9c,(byte)0x8b,(byte)0x62,
+ (byte)0x9c,(byte)0x83,(byte)0x52,
+ (byte)0xac,(byte)0x9c,(byte)0x73,
+ (byte)0x39,(byte)0x29,(byte)0x10,
+ (byte)0x4a,(byte)0x41,(byte)0x10,
+ (byte)0x52,(byte)0x52,(byte)0x18,
+ (byte)0x10,(byte)0x10,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x39,(byte)0x20,(byte)0x20,
+ (byte)0x6a,(byte)0x31,(byte)0x39,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x73,(byte)0x39,(byte)0x52,
+ (byte)0x83,(byte)0x10,(byte)0x20,
+ (byte)0x9c,(byte)0x41,(byte)0x52,
+ (byte)0xac,(byte)0x62,(byte)0x4a,
+ (byte)0xb4,(byte)0x73,(byte)0x41,
+ (byte)0xcd,(byte)0xbd,(byte)0xde,
+ (byte)0xcd,(byte)0xb4,(byte)0xe6,
+ (byte)0xac,(byte)0x83,(byte)0xb4,
+ (byte)0x4a,(byte)0x20,(byte)0x39,
+ (byte)0x10,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x31,(byte)0x18,(byte)0x29,
+ (byte)0x10,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x10,(byte)0x00,
+ (byte)0x08,(byte)0x10,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x52,(byte)0x41,(byte)0x29,
+ (byte)0x6a,(byte)0x52,(byte)0x31,
+ (byte)0x41,(byte)0x39,(byte)0x20,
+ (byte)0x62,(byte)0x52,(byte)0x31,
+ (byte)0x62,(byte)0x52,(byte)0x31,
+ (byte)0xac,(byte)0x9c,(byte)0x6a,
+ (byte)0x6a,(byte)0x62,(byte)0x41,
+ (byte)0x20,(byte)0x18,(byte)0x00,
+ (byte)0x5a,(byte)0x5a,(byte)0x20,
+ (byte)0x41,(byte)0x41,(byte)0x10,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x7b,(byte)0x41,(byte)0x52,
+ (byte)0x18,(byte)0x08,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x7b,(byte)0x41,(byte)0x4a,
+ (byte)0x83,(byte)0x20,(byte)0x39,
+ (byte)0xa4,(byte)0x52,(byte)0x8b,
+ (byte)0x8b,(byte)0x29,(byte)0x29,
+ (byte)0xb4,(byte)0x7b,(byte)0x94,
+ (byte)0xcd,(byte)0xbd,(byte)0xe6,
+ (byte)0xcd,(byte)0xb4,(byte)0xe6,
+ (byte)0xcd,(byte)0xbd,(byte)0xee,
+ (byte)0x52,(byte)0x31,(byte)0x4a,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x08,
+ (byte)0x18,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x29,(byte)0x18,(byte)0x18,
+ (byte)0xb4,(byte)0x9c,(byte)0x7b,
+ (byte)0x94,(byte)0x7b,(byte)0x52,
+ (byte)0x29,(byte)0x20,(byte)0x08,
+ (byte)0x20,(byte)0x20,(byte)0x08,
+ (byte)0x31,(byte)0x29,(byte)0x08,
+ (byte)0x5a,(byte)0x4a,(byte)0x20,
+ (byte)0x10,(byte)0x10,(byte)0x00,
+ (byte)0x31,(byte)0x31,(byte)0x10,
+ (byte)0x52,(byte)0x4a,(byte)0x20,
+ (byte)0x4a,(byte)0x39,(byte)0x20,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x52,(byte)0x39,(byte)0x41,
+ (byte)0x62,(byte)0x39,(byte)0x4a,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x62,(byte)0x62,(byte)0x62,
+ (byte)0x94,(byte)0x62,(byte)0x6a,
+ (byte)0x7b,(byte)0x18,(byte)0x39,
+ (byte)0x8b,(byte)0x29,(byte)0x52,
+ (byte)0xbd,(byte)0x8b,(byte)0xac,
+ (byte)0xc5,(byte)0xac,(byte)0xd5,
+ (byte)0xa4,(byte)0x7b,(byte)0x9c,
+ (byte)0x94,(byte)0x62,(byte)0x83,
+ (byte)0x39,(byte)0x10,(byte)0x20,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x31,(byte)0x20,(byte)0x18,
+ (byte)0x52,(byte)0x41,(byte)0x31,
+ (byte)0x29,(byte)0x18,(byte)0x10,
+ (byte)0x20,(byte)0x18,(byte)0x08,
+ (byte)0x31,(byte)0x20,(byte)0x08,
+ (byte)0x20,(byte)0x18,(byte)0x08,
+ (byte)0x20,(byte)0x18,(byte)0x08,
+ (byte)0x39,(byte)0x39,(byte)0x10,
+ (byte)0x5a,(byte)0x52,(byte)0x31,
+ (byte)0x62,(byte)0x52,(byte)0x41,
+ (byte)0x39,(byte)0x39,(byte)0x31,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x73,(byte)0x41,(byte)0x52,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x8b,(byte)0x83,(byte)0x83,
+ (byte)0x94,(byte)0x6a,(byte)0x7b,
+ (byte)0x62,(byte)0x20,(byte)0x20,
+ (byte)0x8b,(byte)0x4a,(byte)0x6a,
+ (byte)0xb4,(byte)0x83,(byte)0xa4,
+ (byte)0xbd,(byte)0x94,(byte)0xbd,
+ (byte)0xa4,(byte)0x7b,(byte)0xa4,
+ (byte)0x6a,(byte)0x41,(byte)0x5a,
+ (byte)0x52,(byte)0x29,(byte)0x41,
+ (byte)0x18,(byte)0x08,(byte)0x18,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x31,(byte)0x29,(byte)0x10,
+ (byte)0x29,(byte)0x18,(byte)0x08,
+ (byte)0x18,(byte)0x08,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x29,(byte)0x18,(byte)0x10,
+ (byte)0x52,(byte)0x4a,(byte)0x41,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x5a,(byte)0x31,(byte)0x31,
+ (byte)0x20,(byte)0x10,(byte)0x18,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x29,(byte)0x31,(byte)0x29,
+ (byte)0x94,(byte)0x94,(byte)0x94,
+ (byte)0x9c,(byte)0x8b,(byte)0x8b,
+ (byte)0x4a,(byte)0x18,(byte)0x10,
+ (byte)0x83,(byte)0x52,(byte)0x6a,
+ (byte)0xa4,(byte)0x5a,(byte)0x83,
+ (byte)0xa4,(byte)0x73,(byte)0x94,
+ (byte)0x83,(byte)0x5a,(byte)0x73,
+ (byte)0x31,(byte)0x08,(byte)0x18,
+ (byte)0x10,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x00,(byte)0x08,
+ (byte)0x29,(byte)0x08,(byte)0x10,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x08,
+ (byte)0x39,(byte)0x10,(byte)0x10,
+ (byte)0x20,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x18,(byte)0x08,
+ (byte)0x10,(byte)0x10,(byte)0x00,
+ (byte)0x20,(byte)0x20,(byte)0x08,
+ (byte)0x41,(byte)0x29,(byte)0x10,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x39,(byte)0x31,(byte)0x20,
+ (byte)0x10,(byte)0x08,(byte)0x10,
+ (byte)0x31,(byte)0x20,(byte)0x18,
+ (byte)0x39,(byte)0x20,(byte)0x29,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x20,(byte)0x20,
+ (byte)0x62,(byte)0x62,(byte)0x52,
+ (byte)0x6a,(byte)0x62,(byte)0x41,
+ (byte)0x41,(byte)0x29,(byte)0x18,
+ (byte)0x62,(byte)0x39,(byte)0x52,
+ (byte)0x83,(byte)0x4a,(byte)0x62,
+ (byte)0x39,(byte)0x10,(byte)0x20,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x00,(byte)0x08,
+ (byte)0x5a,(byte)0x18,(byte)0x29,
+ (byte)0x31,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x08,
+ (byte)0x18,(byte)0x00,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x10,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x10,(byte)0x10,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x20,(byte)0x08,(byte)0x08,
+ (byte)0x39,(byte)0x20,(byte)0x20,
+ (byte)0x41,(byte)0x20,(byte)0x29,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x31,(byte)0x31,(byte)0x31,
+ (byte)0x62,(byte)0x62,(byte)0x52,
+ (byte)0x8b,(byte)0x83,(byte)0x83,
+ (byte)0x29,(byte)0x18,(byte)0x18,
+ (byte)0x41,(byte)0x29,(byte)0x31,
+ (byte)0x62,(byte)0x39,(byte)0x52,
+ (byte)0x39,(byte)0x20,(byte)0x29,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x00,(byte)0x08,
+ (byte)0x41,(byte)0x08,(byte)0x18,
+ (byte)0x29,(byte)0x00,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x08,(byte)0x08,
+ (byte)0x41,(byte)0x29,(byte)0x29,
+ (byte)0x41,(byte)0x20,(byte)0x31,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x4a,(byte)0x41,(byte)0x4a,
+ (byte)0xac,(byte)0xa4,(byte)0xac,
+ (byte)0x73,(byte)0x6a,(byte)0x62,
+ (byte)0x10,(byte)0x08,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x39,(byte)0x29,(byte)0x29,
+ (byte)0x29,(byte)0x18,(byte)0x18,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x31,(byte)0x08,(byte)0x18,
+ (byte)0x4a,(byte)0x10,(byte)0x10,
+ (byte)0x18,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x31,(byte)0x08,(byte)0x10,
+ (byte)0x29,(byte)0x08,(byte)0x10,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x41,(byte)0x31,(byte)0x29,
+ (byte)0x41,(byte)0x29,(byte)0x29,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x41,(byte)0x41,(byte)0x41,
+ (byte)0x7b,(byte)0x6a,(byte)0x6a,
+ (byte)0x62,(byte)0x5a,(byte)0x52,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x39,(byte)0x29,(byte)0x20,
+ (byte)0x39,(byte)0x20,(byte)0x20,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x4a,(byte)0x4a,(byte)0x4a,
+ (byte)0x5a,(byte)0x5a,(byte)0x52,
+ (byte)0x41,(byte)0x39,(byte)0x31,
+ (byte)0x20,(byte)0x20,(byte)0x20,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x10,(byte)0x08,
+ (byte)0x41,(byte)0x29,(byte)0x18,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x20,(byte)0x20,
+ (byte)0x39,(byte)0x39,(byte)0x31,
+ (byte)0x41,(byte)0x41,(byte)0x39,
+ (byte)0x52,(byte)0x52,(byte)0x4a,
+ (byte)0x20,(byte)0x20,(byte)0x20,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x18,(byte)0x00,(byte)0x10,
+ (byte)0x10,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x08,(byte)0x08,
+ (byte)0x10,(byte)0x18,(byte)0x10,
+ (byte)0x29,(byte)0x18,(byte)0x10,
+ (byte)0x39,(byte)0x20,(byte)0x10,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x29,(byte)0x29,(byte)0x20,
+ (byte)0x41,(byte)0x41,(byte)0x41,
+ (byte)0x29,(byte)0x29,(byte)0x20,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x18,(byte)0x08,(byte)0x10,
+ (byte)0x29,(byte)0x08,(byte)0x20,
+ (byte)0x29,(byte)0x10,(byte)0x29,
+ (byte)0x18,(byte)0x10,(byte)0x20,
+ (byte)0x10,(byte)0x10,(byte)0x18,
+ (byte)0x08,(byte)0x08,(byte)0x10,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x10,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x18,(byte)0x18,(byte)0x10,
+ (byte)0x29,(byte)0x20,(byte)0x10,
+ (byte)0x31,(byte)0x18,(byte)0x08,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x10,(byte)0x08,(byte)0x10,
+ (byte)0x10,(byte)0x10,(byte)0x18,
+ (byte)0x10,(byte)0x10,(byte)0x20,
+ (byte)0x10,(byte)0x10,(byte)0x18,
+ (byte)0x10,(byte)0x10,(byte)0x18,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x20,(byte)0x18,
+ (byte)0x29,(byte)0x29,(byte)0x20,
+ (byte)0x31,(byte)0x31,(byte)0x20,
+ (byte)0x39,(byte)0x31,(byte)0x20,
+ (byte)0x41,(byte)0x31,(byte)0x29,
+ (byte)0x41,(byte)0x31,(byte)0x18,
+ (byte)0x20,(byte)0x10,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x10,(byte)0x08,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x20,(byte)0x20,(byte)0x18,
+ (byte)0x4a,(byte)0x41,(byte)0x31,
+ (byte)0x4a,(byte)0x4a,(byte)0x39,
+ (byte)0x4a,(byte)0x41,(byte)0x39,
+ (byte)0x4a,(byte)0x41,(byte)0x31,
+ (byte)0x39,(byte)0x29,(byte)0x20,
+ (byte)0x29,(byte)0x18,(byte)0x10,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x08,(byte)0x00,(byte)0x08,
+ (byte)0x10,(byte)0x00,(byte)0x08,
+ (byte)0x18,(byte)0x08,(byte)0x08,
+ (byte)0x29,(byte)0x18,(byte)0x18,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x10,(byte)0x10,(byte)0x08,
+ (byte)0x18,(byte)0x10,(byte)0x10,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x41,(byte)0x41,(byte)0x31,
+ (byte)0x52,(byte)0x4a,(byte)0x39,
+ (byte)0x39,(byte)0x29,(byte)0x20,
+ (byte)0x29,(byte)0x18,(byte)0x10,
+ (byte)0x20,(byte)0x10,(byte)0x10,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x18,(byte)0x08,(byte)0x10,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x08,(byte)0x08,(byte)0x08,
+ (byte)0x08,(byte)0x08,(byte)0x00,
+ (byte)0x10,(byte)0x10,(byte)0x10,
+ (byte)0x20,(byte)0x18,(byte)0x18,
+ (byte)0x10,(byte)0x08,(byte)0x08,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ (byte)0x00,(byte)0x00,(byte)0x00,
+ };
+
+ public DemoTex1()
+ {
+ }
+
+ public void dispose()
+ {
+ }
+
+ /* GL_RGBA, etc. arg #3 in glTexImage2D() */
+ public int getComponents()
+ {
+ return(GL_RGB);
+ }
+
+ /* arg #4 in glTexImage2D() */
+ public int getWidth()
+ {
+ return(width);
+ }
+
+ /* arg #5 in glTexImage2D() */
+ public int getHeight()
+ {
+ return(height);
+ }
+
+ /* GL_RGBA, etc. arg #7 in glTexImage2D() */
+ public int getFormat()
+ {
+ return(GL_RGB);
+ }
+
+ /* GL_UNSIGNED_BYTE, etc. arg #8 in glTexImage2D() */
+ public int getType()
+ {
+ return(GL_UNSIGNED_BYTE);
+ }
+
+ /* arg #9 in glTexImage2D() */
+ public byte[] getBits()
+ {
+ return(bits);
+ }
+}
+
diff --git a/demos/RonsDemos/FullScreenGears.java b/demos/RonsDemos/FullScreenGears.java
new file mode 100644
index 0000000..e0d6151
--- /dev/null
+++ b/demos/RonsDemos/FullScreenGears.java
@@ -0,0 +1,18 @@
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+
+public class FullScreenGears {
+ public static void main(String[] args) {
+ final Applet a = new gears(); /*from ronsdemos*/
+ final Window w = new Window(new Frame());
+ w.setLayout(new BorderLayout());
+ w.add("Center",a);
+ a.init();
+ a.start();
+ Toolkit tk = Toolkit.getDefaultToolkit();
+ Dimension screensize = tk.getScreenSize();
+ w.setBounds(0,0,screensize.width,screensize.height);
+ w.setVisible(true);
+ }
+}
diff --git a/demos/RonsDemos/GL4JDemos.pvk b/demos/RonsDemos/GL4JDemos.pvk
new file mode 100644
index 0000000..46cc77a
--- /dev/null
+++ b/demos/RonsDemos/GL4JDemos.pvk
Binary files differ
diff --git a/demos/RonsDemos/GL4JDemos.spc b/demos/RonsDemos/GL4JDemos.spc
new file mode 100644
index 0000000..643bed1
--- /dev/null
+++ b/demos/RonsDemos/GL4JDemos.spc
Binary files differ
diff --git a/demos/RonsDemos/HardCodedTexture.java b/demos/RonsDemos/HardCodedTexture.java
new file mode 100644
index 0000000..6395c8a
--- /dev/null
+++ b/demos/RonsDemos/HardCodedTexture.java
@@ -0,0 +1,31 @@
+/**
+ * @(#) HardCodedTexture.java
+ * @(#) author: Ronald B. Cemer
+ * @(#) version: 1.0
+ */
+
+import java.io.*;
+
+public interface HardCodedTexture
+{
+ public void dispose();
+
+ /* GL_RGBA, etc. arg #3 in glTexImage2D() */
+ public int getComponents();
+
+ /* arg #4 in glTexImage2D() */
+ public int getWidth();
+
+ /* arg #5 in glTexImage2D() */
+ public int getHeight();
+
+ /* GL_RGBA, etc. arg #7 in glTexImage2D() */
+ public int getFormat();
+
+ /* GL_UNSIGNED_BYTE, etc. arg #8 in glTexImage2D() */
+ public int getType();
+
+ /* arg #9 in glTexImage2D() */
+ public byte[] getBits();
+}
+
diff --git a/demos/RonsDemos/MatrixFuncs.java b/demos/RonsDemos/MatrixFuncs.java
new file mode 100644
index 0000000..75493a2
--- /dev/null
+++ b/demos/RonsDemos/MatrixFuncs.java
@@ -0,0 +1,200 @@
+/**
+ * @(#) MatrixFuncs.java
+ * @(#) author: Ronald B. Cemer
+ * @(#) version: 1.0
+ */
+
+import java.io.*;
+
+public class MatrixFuncs
+{
+ public static final float M_PI = 3.14159265359f;
+
+ // Given the angle in degs, create a 4x4 matrix
+ // in mtx which rotates around the X axis.
+ public void rotateAroundX(float degs, float mtx[])
+ {
+ float rads, rsin, rcos;
+
+ rads = degs*(M_PI/180.0f);
+ rsin = (float)Math.sin(rads);
+ rcos = (float)Math.cos(rads);
+ mtx[0] = 1.0f;
+ mtx[1] = 0.0f;
+ mtx[2] = 0.0f;
+ mtx[3] = 0.0f;
+ mtx[4] = 0.0f;
+ mtx[5] = rcos;
+ mtx[6] = rsin;
+ mtx[7] = 0.0f;
+ mtx[8] = 0.0f;
+ mtx[9] = -rsin;
+ mtx[10] = rcos;
+ mtx[11] = 0.0f;
+ mtx[12] = 0.0f;
+ mtx[13] = 0.0f;
+ mtx[14] = 0.0f;
+ mtx[15] = 1.0f;
+ }
+
+ // Given the angle in degs, create a 4x4 matrix
+ // in mtx which rotates around the Y axis.
+ public void rotateAroundY(float degs, float mtx[])
+ {
+ float rads, rsin, rcos;
+
+ rads = degs*(M_PI/180.0f);
+ rsin = (float)Math.sin(rads);
+ rcos = (float)Math.cos(rads);
+ mtx[0] = rcos;
+ mtx[1] = 0.0f;
+ mtx[2] = -rsin;
+ mtx[3] = 0.0f;
+ mtx[4] = 0.0f;
+ mtx[5] = 1.0f;
+ mtx[6] = 0.0f;
+ mtx[7] = 0.0f;
+ mtx[8] = rsin;
+ mtx[9] = 0.0f;
+ mtx[10] = rcos;
+ mtx[11] = 0.0f;
+ mtx[12] = 0.0f;
+ mtx[13] = 0.0f;
+ mtx[14] = 0.0f;
+ mtx[15] = 1.0f;
+ }
+
+ // Given the angle in degs, create a 4x4 matrix
+ // in mtx which rotates around the Z axis.
+ public void rotateAroundZ(float degs, float mtx[])
+ {
+ float rads, rsin, rcos;
+
+ rads = degs*(M_PI/180.0f);
+ rsin = (float)Math.sin(rads);
+ rcos = (float)Math.cos(rads);
+ mtx[0] = rcos;
+ mtx[1] = rsin;
+ mtx[2] = 0.0f;
+ mtx[3] = 0.0f;
+ mtx[4] = -rsin;
+ mtx[5] = rcos;
+ mtx[6] = 0.0f;
+ mtx[7] = 0.0f;
+ mtx[8] = 0.0f;
+ mtx[9] = 0.0f;
+ mtx[10] = 1.0f;
+ mtx[11] = 0.0f;
+ mtx[12] = 0.0f;
+ mtx[13] = 0.0f;
+ mtx[14] = 0.0f;
+ mtx[15] = 1.0f;
+ }
+
+ // Given two 4x4 matrices in mtx1 and mtx2, multiply
+ // them and put the result in dest.
+ // This routine uses a temporary buffer for the result,
+ // so if dest is the same as mtx1 or mtx2, it will still
+ // work properly.
+ public void multiplyMatrices(float mtx1[], float mtx2[], float dest[])
+ {
+ float nmtx[] = new float[16];
+
+ nmtx[0] =
+ (mtx1[0]*mtx2[0]) +
+ (mtx1[1]*mtx2[4]) +
+ (mtx1[2]*mtx2[8]) +
+ (mtx1[3]*mtx2[12]);
+ nmtx[1] =
+ (mtx1[0]*mtx2[1]) +
+ (mtx1[1]*mtx2[5]) +
+ (mtx1[2]*mtx2[9]) +
+ (mtx1[3]*mtx2[13]);
+ nmtx[2] =
+ (mtx1[0]*mtx2[2]) +
+ (mtx1[1]*mtx2[6]) +
+ (mtx1[2]*mtx2[10]) +
+ (mtx1[3]*mtx2[14]);
+ nmtx[3] =
+ (mtx1[0]*mtx2[3]) +
+ (mtx1[1]*mtx2[7]) +
+ (mtx1[2]*mtx2[11]) +
+ (mtx1[3]*mtx2[15]);
+ nmtx[4] =
+ (mtx1[4]*mtx2[0]) +
+ (mtx1[5]*mtx2[4]) +
+ (mtx1[6]*mtx2[8]) +
+ (mtx1[7]*mtx2[12]);
+ nmtx[5] =
+ (mtx1[4]*mtx2[1]) +
+ (mtx1[5]*mtx2[5]) +
+ (mtx1[6]*mtx2[9]) +
+ (mtx1[7]*mtx2[13]);
+ nmtx[6] =
+ (mtx1[4]*mtx2[2]) +
+ (mtx1[5]*mtx2[6]) +
+ (mtx1[6]*mtx2[10]) +
+ (mtx1[7]*mtx2[14]);
+ nmtx[7] =
+ (mtx1[4]*mtx2[3]) +
+ (mtx1[5]*mtx2[7]) +
+ (mtx1[6]*mtx2[11]) +
+ (mtx1[7]*mtx2[15]);
+ nmtx[8] =
+ (mtx1[8]*mtx2[0]) +
+ (mtx1[9]*mtx2[4]) +
+ (mtx1[10]*mtx2[8]) +
+ (mtx1[11]*mtx2[12]);
+ nmtx[9] =
+ (mtx1[8]*mtx2[1]) +
+ (mtx1[9]*mtx2[5]) +
+ (mtx1[10]*mtx2[9]) +
+ (mtx1[11]*mtx2[13]);
+ nmtx[10] =
+ (mtx1[8]*mtx2[2]) +
+ (mtx1[9]*mtx2[6]) +
+ (mtx1[10]*mtx2[10]) +
+ (mtx1[11]*mtx2[14]);
+ nmtx[11] =
+ (mtx1[8]*mtx2[3]) +
+ (mtx1[9]*mtx2[7]) +
+ (mtx1[10]*mtx2[11]) +
+ (mtx1[11]*mtx2[15]);
+ nmtx[12] =
+ (mtx1[12]*mtx2[0]) +
+ (mtx1[13]*mtx2[4]) +
+ (mtx1[14]*mtx2[8]) +
+ (mtx1[15]*mtx2[12]);
+ nmtx[13] =
+ (mtx1[12]*mtx2[1]) +
+ (mtx1[13]*mtx2[5]) +
+ (mtx1[14]*mtx2[9]) +
+ (mtx1[15]*mtx2[13]);
+ nmtx[14] =
+ (mtx1[12]*mtx2[2]) +
+ (mtx1[13]*mtx2[6]) +
+ (mtx1[14]*mtx2[10]) +
+ (mtx1[15]*mtx2[14]);
+ nmtx[15] =
+ (mtx1[12]*mtx2[3]) +
+ (mtx1[13]*mtx2[7]) +
+ (mtx1[14]*mtx2[11]) +
+ (mtx1[15]*mtx2[15]);
+ dest[0] = nmtx[0];
+ dest[1] = nmtx[1];
+ dest[2] = nmtx[2];
+ dest[3] = nmtx[3];
+ dest[4] = nmtx[4];
+ dest[5] = nmtx[5];
+ dest[6] = nmtx[6];
+ dest[7] = nmtx[7];
+ dest[8] = nmtx[8];
+ dest[9] = nmtx[9];
+ dest[10] = nmtx[10];
+ dest[11] = nmtx[11];
+ dest[12] = nmtx[12];
+ dest[13] = nmtx[13];
+ dest[14] = nmtx[14];
+ dest[15] = nmtx[15];
+ }
+}
diff --git a/demos/RonsDemos/animApplet.skel b/demos/RonsDemos/animApplet.skel
new file mode 100644
index 0000000..ebbd52e
--- /dev/null
+++ b/demos/RonsDemos/animApplet.skel
@@ -0,0 +1,125 @@
+/**
+ * Skeleton for animated applets (applets which automatically and
+ * continually redraw without intervention).
+ */
+
+/**
+ * @(#) [place applet name here].java
+ * @(#) author: [place author here] (converted to Java by Ron Cemer)
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+
+public class myapplet extends Applet
+{
+ myappletCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new myappletCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ canvas.start();
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ canvas.stop();
+ }
+
+
+ /* Destroy the applet */
+
+
+ public void destroy()
+ {
+ canvas.stop();
+ canvas.destroy();
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class myappletCanvas extends GLAnimCanvas
+ {
+ public myappletCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(60.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+// Put OpenGL initialization code here.
+
+ glj.gljCheckGL();
+ }
+
+ public void destroy()
+ {
+ System.out.println("destroy(): " + this);
+
+// Put any special takedown code here.
+
+ cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+
+// Put any custom reshape code here.
+
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent(true) == false) return;
+
+// Put drawing code here.
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+ }
+}
diff --git a/demos/RonsDemos/dinoshade.html b/demos/RonsDemos/dinoshade.html
new file mode 100644
index 0000000..1b4fe08
--- /dev/null
+++ b/demos/RonsDemos/dinoshade.html
@@ -0,0 +1,21 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Dinoshade by Mark J. Kilgard; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Dinoshade applet
+<br>Originially written by Mark J. Kilgard
+<br>Ported to Java by Ron Cemer
+<br>Press and hold left mouse button, then drag to rotate view.
+<br>Press and hold left mouse button, then press and hold right mouse button, then drag to rotate light.
+<br>Click right mouse button for a menu of options.
+<br>NOTE: If your system does not support hardware-accelerated stenciling, this demo will run slowly unless you disable stenciling for shadows and reflections.
+<br>
+<applet code="dinoshade.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/dinoshade.java b/demos/RonsDemos/dinoshade.java
new file mode 100755
index 0000000..344fd00
--- /dev/null
+++ b/demos/RonsDemos/dinoshade.java
@@ -0,0 +1,1104 @@
+/**
+ * @(#) dinoshade.java
+ * @(#) author: Mark J. Kilgard (converted to Java by Ron Cemer)
+ */
+
+/* Copyright (c) Mark J. Kilgard, 1994, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+/* Example for PC game developers to show how to *combine* texturing,
+ reflections, and projected shadows all in real-time with OpenGL.
+ Robust reflections use stenciling. Robust projected shadows
+ use both stenciling and polygon offset. PC game programmers
+ should realize that neither stenciling nor polygon offset are
+ supported by Direct3D, so these real-time rendering algorithms
+ are only really viable with OpenGL.
+
+ The program has modes for disabling the stenciling and polygon
+ offset uses. It is worth running this example with these features
+ toggled off so you can see the sort of artifacts that result.
+
+ Notice that the floor texturing, reflections, and shadowing
+ all co-exist properly. */
+
+/* When you run this program: Left mouse button controls the
+ view. Middle mouse button controls light position (left &
+ right rotates light around dino; up & down moves light
+ position up and down). Right mouse button pops up menu. */
+
+/* Check out the comments in the "redraw" routine to see how the
+ reflection blending and surface stenciling is done. You can
+ also see in "redraw" how the projected shadows are rendered,
+ including the use of stenciling and polygon offset. */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class dinoshade extends SimpleGLAnimApplet1
+{
+ static final float[][] bodyVerts =
+ {
+ { 0.0f, 3.0f, 0.0f},
+ { 1.0f, 1.0f, 0.0f},
+ { 5.0f, 1.0f, 0.0f},
+ { 8.0f, 4.0f, 0.0f},
+ { 10.0f, 4.0f, 0.0f},
+ { 11.0f, 5.0f, 0.0f},
+ { 11.0f, 11.5f, 0.0f},
+ { 13.0f, 12.0f, 0.0f},
+ { 13.0f, 13.0f, 0.0f},
+ { 10.0f, 13.5f, 0.0f},
+ { 13.0f, 14.0f, 0.0f},
+ { 13.0f, 15.0f, 0.0f},
+ { 11.0f, 16.0f, 0.0f},
+ { 8.0f, 16.0f, 0.0f},
+ { 7.0f, 15.0f, 0.0f},
+ { 7.0f, 13.0f, 0.0f},
+ { 8.0f, 12.0f, 0.0f},
+ { 7.0f, 11.0f, 0.0f},
+ { 6.0f, 6.0f, 0.0f},
+ { 4.0f, 3.0f, 0.0f},
+ { 3.0f, 2.0f, 0.0f},
+ { 1.0f, 2.0f, 0.0f},
+ };
+
+ static final int[][] bodyTris =
+ {
+ { 1, 0, 21 },
+ { 1, 21, 2 },
+ { 21, 20, 2 },
+ { 20, 19, 2 },
+ { 19, 3, 2 },
+ { 19, 18, 3 },
+ { 18, 4, 3 },
+ { 18, 5, 4 },
+ { 18, 6, 5 },
+ { 18, 17, 6 },
+ { 17, 16, 6 },
+ { 16, 7, 6 },
+ { 16, 8, 7 },
+ { 16, 15, 8 },
+ { 15, 9, 8 },
+ { 15, 14, 9 },
+ { 14, 13, 9 },
+ { 9, 13, 12 },
+ { 9, 12, 11 },
+ { 11, 10, 9 },
+ };
+
+ static final float[][] armVerts =
+ {
+ { 8.0f, 10.0f, 0.0f},
+ { 9.0f, 9.0f, 0.0f},
+ { 10.0f, 9.0f, 0.0f},
+ { 13.0f, 8.0f, 0.0f},
+ { 14.0f, 9.0f, 0.0f},
+ { 16.0f, 9.0f, 0.0f},
+ { 15.0f, 9.5f, 0.0f},
+ { 16.0f, 10.0f, 0.0f},
+ { 15.0f, 10.0f, 0.0f},
+ { 15.5f, 11.0f, 0.0f},
+ { 14.5f, 10.0f, 0.0f},
+ { 14.0f, 11.0f, 0.0f},
+ { 14.0f, 10.0f, 0.0f},
+ { 13.0f, 9.0f, 0.0f},
+ { 11.0f, 11.0f, 0.0f},
+ { 9.0f, 11.0f, 0.0f},
+ };
+
+ static final int[][] armTris =
+ {
+ { 0, 15, 1 },
+ { 15, 2, 1 },
+ { 15, 14, 2 },
+ { 14, 13, 2 },
+ { 13, 3, 2 },
+ { 13, 4, 3 },
+ { 13, 12, 4 },
+ { 12, 11, 10 },
+ { 12, 10, 4 },
+ { 10, 6, 4 },
+ { 6, 5, 4 },
+ { 8, 7, 6 },
+ { 10, 8, 6 },
+ { 10, 9, 8 },
+ };
+
+ static final float[][] legVerts =
+ {
+ { 8.0f, 6.0f, 0.0f},
+ { 8.0f, 4.0f, 0.0f},
+ { 9.0f, 3.0f, 0.0f},
+ { 9.0f, 2.0f, 0.0f},
+ { 8.0f, 1.0f, 0.0f},
+ { 8.0f, 0.5f, 0.0f},
+ { 9.0f, 0.0f, 0.0f},
+ { 12.0f, 0.0f, 0.0f},
+ { 10.0f, 1.0f, 0.0f},
+ { 10.0f, 2.0f, 0.0f},
+ { 12.0f, 4.0f, 0.0f},
+ { 11.0f, 6.0f, 0.0f},
+ { 10.0f, 7.0f, 0.0f},
+ { 9.0f, 7.0f, 0.0f},
+ };
+
+ static final int[][] legTris =
+ {
+ { 6, 5, 7 },
+ { 5, 8, 7 },
+ { 5, 4, 8 },
+ { 4, 3, 8 },
+ { 3, 9, 8 },
+ { 3, 2, 9 },
+ { 2, 10, 9 },
+ { 2, 1, 10 },
+ { 1, 0, 10 },
+ { 0, 11, 10 },
+ { 0, 12, 11 },
+ { 0, 13, 12 },
+ };
+
+ static final float[][] eyeVerts =
+ {
+ { 8.75f, 15.0f, 0.0f},
+ { 9.0f, 14.7f, 0.0f},
+ { 9.6f, 14.7f, 0.0f},
+ { 10.1f, 15.0f, 0.0f},
+ { 9.6f, 15.25f, 0.0f},
+ { 9.0f, 15.25f, 0.0f},
+ };
+
+ static final int[][] eyeTris =
+ {
+ { 1, 0, 2 },
+ { 0, 5, 2 },
+ { 5, 4, 2 },
+ { 4, 3, 2 },
+ };
+
+ static final float floorVertices[][] =
+ {
+ { -20.0f, 0.0f, 20.0f },
+ { 20.0f, 0.0f, 20.0f },
+ { 20.0f, 0.0f, -20.0f },
+ { -20.0f, 0.0f, -20.0f },
+ };
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new dinoshadeCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ public static void main( String args[] ) {
+ dinoshade applet =
+ new dinoshade();
+
+ Frame f = new Frame("dinoshade");
+
+ f.addWindowListener( new WindowAdapter()
+ {
+ public void windowClosed(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ public void windowClosing(WindowEvent e)
+ {
+ windowClosed(e);
+ }
+ }
+ );
+
+ f.setLayout(new BorderLayout());
+ f.add("Center", applet);
+ applet.setSize(500,300);
+ applet.init();
+ applet.start();
+ Dimension ps = applet.getPreferredSize();
+ f.setBounds(-100,-100,99,99);
+ f.setVisible(true);
+ f.setVisible(false);
+ Insets i = f.getInsets();
+ f.setBounds(0,0,
+ ps.width+i.left+i.right,
+ ps.height+i.top+i.bottom);
+ f.setVisible(true);
+ }
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class dinoshadeCanvas extends GLAnimCanvas
+ implements MouseListener, MouseMotionListener, ActionListener
+ {
+ private static final double M_PI = 3.14159265;
+
+ // Menu options:
+ private static final String M_NONE = "-----------------------";
+ private static final String M_MOTION = "Toggle motion";
+ private static final String M_LIGHT = "Toggle light";
+ private static final String M_TEXTURE = "Toggle texture";
+ private static final String M_SHADOWS = "Toggle shadows";
+ private static final String M_REFLECTION = "Toggle reflection";
+ private static final String M_DINOSAUR = "Toggle dinosaur";
+ private static final String M_STENCIL_REFLECTION = "Toggle reflection stenciling";
+ private static final String M_STENCIL_SHADOW = "Toggle shadow stenciling";
+ private static final String M_OFFSET_SHADOW = "Toggle shadow offset";
+ private static final String M_POSITIONAL = "Positional light";
+ private static final String M_DIRECTIONAL = "Directional light";
+
+ private PopupMenu menu = null;
+ private boolean menu_showing = false;
+ private boolean save_suspended = false;
+
+ /* Variables controlling various rendering modes. */
+ private boolean stencilReflection = true, stencilShadow = true, offsetShadow = true;
+ private boolean renderShadow = true, renderDinosaur = true, renderReflection = true;
+ private boolean linearFiltering = false, useTexture = true;
+// private boolean useMipmaps = false;
+ private boolean lightSwitch = true;
+ private boolean directionalLight = true;
+
+ /* Time varying or user-controled variables. */
+ private float jump = 0.0f;
+ private float lightAngle = 0.0f, lightHeight = 20.0f;
+ private float angle = -150.0f; /* in degrees */
+ private float angle2 = 30.0f; /* in degrees */
+
+ private boolean moving = false;
+ private int startx, starty;
+ private boolean lightMoving = false;
+ private int lightStartX, lightStartY;
+
+ private final float bodyWidth = 3.0f;
+
+ private final float[] lightPosition = new float[4];
+ private final float lightColor[] = {0.8f, 1.0f, 0.8f, 1.0f}; /* green-tinted */
+ private final float skinColor[] = {0.1f, 1.0f, 0.1f, 1.0f};
+ private final float eyeColor[] = {1.0f, 0.2f, 0.2f, 1.0f};
+ private final int X = 0, Y = 1, Z = 2, W = 3;
+ private final int A = 0, B = 1, C = 2, D = 3;
+
+ /* Enumerants for refering to display lists. */
+ private static final int
+ BODY_SIDE = 1, BODY_EDGE = 2, BODY_WHOLE = 3,
+ ARM_SIDE = 4, ARM_EDGE = 5, ARM_WHOLE = 6,
+ LEG_SIDE = 7, LEG_EDGE = 8, LEG_WHOLE = 9,
+ EYE_SIDE = 10, EYE_EDGE = 11, EYE_WHOLE = 12;
+ private float floorPlane[] = new float[4];
+ private float floorShadow[] = new float[16];
+
+ public dinoshadeCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ stencilBits = 3;
+ }
+
+ public void init()
+ {
+ int [] res=new int[6];
+
+ gl.glGetIntegerv(GL_STENCIL_BITS,res);
+
+ System.out.println("init(): " + this + "\n\t" +
+ "Stencil bits are "+res[0] +"\n\t" +
+ "IsOwnCreatedWindow: "+createOwnWindow);
+
+ reshape(getSize().width, getSize().height);
+
+ makeDinosaur();
+
+ gl.glPolygonOffset(-2.0f, -1.0f);
+
+ gl.glEnable(GL_CULL_FACE);
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glEnable(GL_TEXTURE_2D);
+ gl.glLineWidth(3.0f);
+
+ gl.glMatrixMode(GL_PROJECTION);
+ glu.gluPerspective
+ ( /* field of view in degree */ 40.0f,
+ /* aspect ratio */ 1.0f,
+ /* Z near */ 20.0f,
+ /* Z far */ 100.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ glu.gluLookAt
+ (0.0f, 8.0f, 60.0f, /* eye is at (0,8,60) */
+ 0.0f, 8.0f, 0.0f, /* center is at (0,8,0) */
+ 0.0f, 1.0f, 0.0f); /* up is in postivie Y direction */
+
+ gl.glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor);
+ gl.glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1f);
+ gl.glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05f);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_LIGHTING);
+
+ makeFloorTexture();
+
+ /* Setup floor plane for projected shadow calculations. */
+ findPlane
+ (floorPlane,
+ floorVertices[1],
+ floorVertices[2],
+ floorVertices[3]);
+
+ glj.gljCheckGL();
+
+ menu = new PopupMenu("Options");
+ menu.add(M_MOTION);
+ menu.add(M_NONE);
+ menu.add(M_LIGHT);
+ menu.add(M_TEXTURE);
+ menu.add(M_SHADOWS);
+ menu.add(M_REFLECTION);
+ menu.add(M_DINOSAUR);
+ menu.add(M_NONE);
+ menu.add(M_STENCIL_REFLECTION);
+ menu.add(M_STENCIL_SHADOW);
+ menu.add(M_OFFSET_SHADOW);
+ menu.add(M_NONE);
+ menu.add(M_POSITIONAL);
+ menu.add(M_DIRECTIONAL);
+ menu.addActionListener(this);
+ add(menu);
+
+ addMouseListener(this);
+ addMouseMotionListener(this);
+ }
+
+ public void doCleanup()
+ {
+ removeMouseListener(this);
+ removeMouseMotionListener(this);
+ menu.removeActionListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ if (!isSuspended())
+ {
+ long ltime =
+ System.currentTimeMillis() % 3142L; //approximate 2*PI*500
+ float time = (float)(((double)ltime)/500.0);
+ jump = 4.0f * (float)Math.abs(Math.sin(time)*0.5);
+ if (!lightMoving) lightAngle += 0.0f;
+ }
+
+ /* Clear; default stencil clears to zero. */
+ if ((stencilReflection && renderReflection) || (stencilShadow && renderShadow))
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+ else
+ /* Avoid clearing stencil when not using it. */
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* Reposition the light source. */
+ lightPosition[0] = 12*(float)Math.cos(lightAngle);
+ lightPosition[1] = lightHeight;
+ lightPosition[2] = 12*(float)Math.sin(lightAngle);
+ if (directionalLight)
+ lightPosition[3] = 0.0f;
+ else
+ lightPosition[3] = 1.0f;
+
+ shadowMatrix(floorShadow, floorPlane, lightPosition);
+
+ gl.glPushMatrix();
+
+ /* Perform scene rotations based on user mouse input. */
+ gl.glRotatef(angle2, 1.0f, 0.0f, 0.0f);
+ gl.glRotatef(angle, 0.0f, 1.0f, 0.0f);
+
+ /* Tell GL new light source position. */
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
+
+ if (renderReflection)
+ {
+ if (stencilReflection)
+ {
+ /* We can eliminate the visual "artifact" of seeing the "flipped"
+ dinosaur underneath the floor by using stencil. The idea is
+ draw the floor without color or depth update but so that
+ a stencil value of one is where the floor will be. Later when
+ rendering the dinosaur reflection, we will only update pixels
+ with a stencil value of 1 to make sure the reflection only
+ lives on the floor, not below the floor. */
+
+ /* Don't update color or depth. */
+ gl.glDisable(GL_DEPTH_TEST);
+ gl.glColorMask(false, false, false, false);
+
+ /* Draw 1 into the stencil buffer. */
+ gl.glEnable(GL_STENCIL_TEST);
+ gl.glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
+ gl.glStencilFunc(GL_ALWAYS, 1, 0xffffffff);
+
+ /* Now render floor; floor pixels just get their stencil set to 1. */
+ drawFloor();
+
+ /* Re-enable update of color and depth. */
+ gl.glColorMask(true, true, true, true);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ /* Now, only render where stencil is set to 1. */
+ gl.glStencilFunc(GL_EQUAL, 1, 0xffffffff); /* draw if ==1 */
+ gl.glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+ }
+
+ gl.glPushMatrix();
+
+ /* The critical reflection step: Reflect dinosaur through the floor
+ (the Y=0 plane) to make a relection. */
+
+ gl.glScalef(1.0f, -1.0f, 1.0f);
+
+ /* Reflect the light position. */
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
+
+ /* To avoid our normals getting reversed and hence botched lighting
+ on the reflection, turn on normalize. */
+ gl.glEnable(GL_NORMALIZE);
+ gl.glCullFace(GL_FRONT);
+
+ /* Draw the reflected dinosaur. */
+ drawDinosaur();
+
+ /* Disable noramlize again and re-enable back face culling. */
+ gl.glDisable(GL_NORMALIZE);
+ gl.glCullFace(GL_BACK);
+
+ gl.glPopMatrix();
+
+ /* Switch back to the unreflected light position. */
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
+
+ if (stencilReflection) gl.glDisable(GL_STENCIL_TEST);
+ }
+
+ /* Back face culling will get used to only draw either the top or the
+ bottom floor. This let's us get a floor with two distinct
+ appearances. The top floor surface is reflective and kind of red.
+ The bottom floor surface is not reflective and blue. */
+
+ /* Draw "bottom" of floor in blue. */
+ gl.glFrontFace(GL_CW); /* Switch face orientation. */
+ gl.glColor4f(0.1f, 0.1f, 0.7f, 1.0f);
+ drawFloor();
+ gl.glFrontFace(GL_CCW);
+
+ if (renderShadow)
+ {
+ if (stencilShadow)
+ {
+ /* Draw the floor with stencil value 3. This helps us only
+ draw the shadow once per floor pixel (and only on the
+ floor pixels). */
+ gl.glEnable(GL_STENCIL_TEST);
+ gl.glStencilFunc(GL_ALWAYS, 3, 0xffffffff);
+ gl.glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
+ }
+ }
+
+ /* Draw "top" of floor. Use blending to blend in reflection. */
+ gl.glEnable(GL_BLEND);
+ gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ gl.glColor4f(0.7f, 0.0f, 0.0f, 0.3f);
+ gl.glColor4f(1.0f, 1.0f, 1.0f, 0.3f);
+ drawFloor();
+ gl.glDisable(GL_BLEND);
+
+ /* Draw "actual" dinosaur, not its reflection. */
+ if (renderDinosaur) drawDinosaur();
+
+ if (renderShadow)
+ {
+ /* Render the projected shadow. */
+ if (stencilShadow)
+ {
+ /* Now, only render where stencil is set above 2 (ie, 3 where
+ the top floor is). Update stencil with 2 where the shadow
+ gets drawn so we don't redraw (and accidently reblend) the
+ shadow). */
+ gl.glStencilFunc(GL_LESS, 2, 0xffffffff); /* draw if ==1 */
+ gl.glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
+ }
+ /* To eliminate depth buffer artifacts, we use polygon offset
+ to raise the depth of the projected shadow slightly so
+ that it does not depth buffer alias with the floor. */
+ if (offsetShadow) gl.glEnable(GL_POLYGON_OFFSET_FILL);
+
+ /* Render 50% black shadow color on top of whatever the
+ floor appareance is. */
+ gl.glEnable(GL_BLEND);
+ gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ gl.glDisable(GL_LIGHTING); /* Force the 50% black. */
+ gl.glColor4f(0.0f, 0.0f, 0.0f, 0.5f);
+
+ gl.glPushMatrix();
+ /* Project the shadow. */
+ gl.glMultMatrixf(floorShadow);
+ drawDinosaur();
+ gl.glPopMatrix();
+
+ gl.glDisable(GL_BLEND);
+ gl.glEnable(GL_LIGHTING);
+
+ if (offsetShadow) gl.glDisable(GL_POLYGON_OFFSET_FILL);
+ if (stencilShadow) gl.glDisable(GL_STENCIL_TEST);
+ }
+
+ gl.glPushMatrix();
+ gl.glDisable(GL_LIGHTING);
+ gl.glColor3f(1.0f, 1.0f, 0.0f);
+ if (directionalLight)
+ {
+ /* Draw an arrowhead. */
+ gl.glDisable(GL_CULL_FACE);
+ gl.glTranslatef(lightPosition[0], lightPosition[1], lightPosition[2]);
+ gl.glRotatef(lightAngle * (float)(-180.0 / M_PI), 0, 1, 0);
+ gl.glRotatef((float)Math.atan(lightHeight/12) * (float)(180.0 / M_PI), 0, 0, 1);
+ gl.glBegin(GL_TRIANGLE_FAN);
+ gl.glVertex3f(0, 0, 0);
+ gl.glVertex3f(2, 1, 1);
+ gl.glVertex3f(2, -1, 1);
+ gl.glVertex3f(2, -1, -1);
+ gl.glVertex3f(2, 1, -1);
+ gl.glVertex3f(2, 1, 1);
+ gl.glEnd();
+ /* Draw a white line from light direction. */
+ gl.glColor3f(1.0f, 1.0f, 1.0f);
+ gl.glBegin(GL_LINES);
+ gl.glVertex3f(0, 0, 0);
+ gl.glVertex3f(5, 0, 0);
+ gl.glEnd();
+ gl.glEnable(GL_CULL_FACE);
+ }
+ else
+ {
+ /* Draw a yellow ball at the light source. */
+ gl.glTranslatef(lightPosition[0], lightPosition[1], lightPosition[2]);
+ int qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,1.0f,5,5);
+ glu.gluDeleteQuadric(qobj);
+ }
+ gl.glEnable(GL_LIGHTING);
+ gl.glPopMatrix();
+
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ // if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+
+ private void makeDinosaur()
+ {
+ extrudeSolidFromPolygon
+ (bodyVerts,
+ bodyTris,
+ bodyWidth,
+ BODY_SIDE,
+ BODY_EDGE,
+ BODY_WHOLE);
+ extrudeSolidFromPolygon
+ (armVerts,
+ armTris,
+ bodyWidth/4,
+ ARM_SIDE,
+ ARM_EDGE,
+ ARM_WHOLE);
+ extrudeSolidFromPolygon
+ (legVerts,
+ legTris,
+ bodyWidth/2,
+ LEG_SIDE,
+ LEG_EDGE,
+ LEG_WHOLE);
+ extrudeSolidFromPolygon
+ (eyeVerts,
+ eyeTris,
+ bodyWidth+0.2f,
+ EYE_SIDE,
+ EYE_EDGE,
+ EYE_WHOLE);
+ }
+
+ private void drawDinosaur()
+ {
+ gl.glPushMatrix();
+ /* Translate the dinosaur to be at (0,8,0). */
+ gl.glTranslatef(-8, 0, -bodyWidth / 2);
+ gl.glTranslatef(0.0f, jump, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, skinColor);
+ gl.glCallList(BODY_WHOLE);
+ gl.glTranslatef(0.0f, 0.0f, bodyWidth);
+ gl.glCallList(ARM_WHOLE);
+ gl.glCallList(LEG_WHOLE);
+ gl.glTranslatef(0.0f, 0.0f, -bodyWidth - bodyWidth / 4);
+ gl.glCallList(ARM_WHOLE);
+ gl.glTranslatef(0.0f, 0.0f, -bodyWidth / 4);
+ gl.glCallList(LEG_WHOLE);
+ gl.glTranslatef(0.0f, 0.0f, bodyWidth / 2 - 0.1f);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, eyeColor);
+ gl.glCallList(EYE_WHOLE);
+ gl.glPopMatrix();
+ }
+
+ private void makeFloorTexture()
+ {
+ /* Nice floor texture tiling pattern. */
+ String circles[] =
+ {
+ "....xxxx........",
+ "..xxxxxxxx......",
+ ".xxxxxxxxxx.....",
+ ".xxx....xxx.....",
+ "xxx......xxx....",
+ "xxx......xxx....",
+ "xxx......xxx....",
+ "xxx......xxx....",
+ ".xxx....xxx.....",
+ ".xxxxxxxxxx.....",
+ "..xxxxxxxx......",
+ "....xxxx........",
+ "................",
+ "................",
+ "................",
+ "................"
+ };
+ byte floorTexture[] = new byte[16*16*3];
+
+ /* Setup RGB image for the texture. */
+ int idx = 0;
+ for (int t = 0; t < 16; t++)
+ {
+ for (int s = 0; s < 16; s++)
+ {
+ if (circles[t].charAt(s) == 'x')
+ {
+ /* Nice blue. */
+ floorTexture[idx++] = (byte)0x1f;
+ floorTexture[idx++] = (byte)0x1f;
+ floorTexture[idx++] = (byte)0x8f;
+ }
+ else
+ {
+ /* Light gray. */
+ floorTexture[idx++] = (byte)0xca;
+ floorTexture[idx++] = (byte)0xca;
+ floorTexture[idx++] = (byte)0xca;
+ }
+ }
+ }
+
+ gl.glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+// if (useMipmaps)
+// {
+// gl.glTexParameteri
+// (GL_TEXTURE_2D,
+// GL_TEXTURE_MIN_FILTER,
+// GL_LINEAR_MIPMAP_LINEAR);
+// glu.gluBuild2DMipmaps
+// (GL_TEXTURE_2D,3,16,16,GL_RGB,GL_UNSIGNED_BYTE,floorTexture);
+// }
+// else
+ {
+ if (linearFiltering)
+ {
+ gl.glTexParameteri
+ (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ gl.glTexParameteri
+ (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ }
+ else
+ {
+ gl.glTexParameteri
+ (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ gl.glTexParameteri
+ (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ }
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,0,3,16,16,0,GL_RGB,GL_UNSIGNED_BYTE,floorTexture);
+ }
+ }
+
+ /* Draw a floor (possibly textured). */
+ private void drawFloor()
+ {
+ gl.glDisable(GL_LIGHTING);
+ if (useTexture) gl.glEnable(GL_TEXTURE_2D);
+ gl.glBegin(GL_QUADS);
+ gl.glTexCoord2f(0.0f, 0.0f);
+ gl.glVertex3fv(floorVertices[0]);
+ gl.glTexCoord2f(0.0f, 16.0f);
+ gl.glVertex3fv(floorVertices[1]);
+ gl.glTexCoord2f(16.0f, 16.0f);
+ gl.glVertex3fv(floorVertices[2]);
+ gl.glTexCoord2f(16.0f, 0.0f);
+ gl.glVertex3fv(floorVertices[3]);
+ gl.glEnd();
+ if (useTexture) gl.glDisable(GL_TEXTURE_2D);
+ gl.glEnable(GL_LIGHTING);
+ }
+
+ /* create a matrix that will project the desired shadow */
+ void shadowMatrix(float shadowMat[], float groundplane[], float lightpos[])
+ {
+ float dot;
+
+ /* find dot product between light position vector
+ and ground plane normal */
+ dot =
+ groundplane[0] * lightpos[0] +
+ groundplane[1] * lightpos[1] +
+ groundplane[2] * lightpos[2] +
+ groundplane[3] * lightpos[3];
+
+ shadowMat[0] = dot - lightpos[0] * groundplane[0];
+ shadowMat[4] = -lightpos[0] * groundplane[1];
+ shadowMat[8] = -lightpos[0] * groundplane[2];
+ shadowMat[12] = -lightpos[0] * groundplane[3];
+
+ shadowMat[1] = -lightpos[1] * groundplane[0];
+ shadowMat[5] = dot - lightpos[1] * groundplane[1];
+ shadowMat[9] = -lightpos[1] * groundplane[2];
+ shadowMat[13] = -lightpos[1] * groundplane[3];
+
+ shadowMat[2] = -lightpos[2] * groundplane[0];
+ shadowMat[6] = -lightpos[2] * groundplane[1];
+ shadowMat[10] = dot - lightpos[2] * groundplane[2];
+ shadowMat[14] = -lightpos[2] * groundplane[3];
+
+ shadowMat[3] = -lightpos[3] * groundplane[0];
+ shadowMat[7] = -lightpos[3] * groundplane[1];
+ shadowMat[11] = -lightpos[3] * groundplane[2];
+ shadowMat[15] = dot - lightpos[3] * groundplane[3];
+ }
+
+ /* find the plane equation given 3 points */
+ void findPlane(float plane[], float v0[], float v1[], float v2[])
+ {
+ float vec0[] = new float[3], vec1[] = new float[3];
+
+ /* need 2 vectors to find cross product */
+ vec0[X] = v1[X] - v0[X];
+ vec0[Y] = v1[Y] - v0[Y];
+ vec0[Z] = v1[Z] - v0[Z];
+
+ vec1[X] = v2[X] - v0[X];
+ vec1[Y] = v2[Y] - v0[Y];
+ vec1[Z] = v2[Z] - v0[Z];
+
+ /* find cross product to get A, B, and C of plane equation */
+ plane[A] = vec0[Y] * vec1[Z] - vec0[Z] * vec1[Y];
+ plane[B] = -(vec0[X] * vec1[Z] - vec0[Z] * vec1[X]);
+ plane[C] = vec0[X] * vec1[Y] - vec0[Y] * vec1[X];
+ plane[D] = -(plane[A]*v0[X] + plane[B]*v0[Y] + plane[C]*v0[Z]);
+ }
+
+ /* Mark Kilgard's tessellation code from the "dino" demos.
+ Bug fixes and re-write without GLU tesselator
+ by Ronald B. Cemer */
+ private void extrudeSolidFromPolygon
+ (float data[][],
+ int outlineTriIndices[][],
+ float thickness,
+ int side,
+ int edge,
+ int whole)
+ {
+ double dx, dy, len;
+ int i, j0, j1, j2;
+ int min, max, range;
+ float x0, y0, x1, y1;
+ int count = data.length;
+ int tricount = outlineTriIndices.length;
+
+ gl.glNewList(side, GL_COMPILE);
+ gl.glShadeModel(GL_SMOOTH);
+ gl.glBegin(GL_TRIANGLES);
+ for (i = 0; i < tricount; i++)
+ {
+/* *+*+* Note that we use the triangle indices in reverse order here
+ because they are specified in reverse order in the arrays. */
+ j0 = outlineTriIndices[i][2];
+ j1 = outlineTriIndices[i][1];
+ j2 = outlineTriIndices[i][0];
+ gl.glVertex3f(data[j0][0],data[j0][1],0.0f);
+ gl.glVertex3f(data[j1][0],data[j1][1],0.0f);
+ gl.glVertex3f(data[j2][0],data[j2][1],0.0f);
+ }
+ gl.glEnd();
+ gl.glEndList();
+
+ gl.glNewList(edge, GL_COMPILE);
+ gl.glShadeModel(GL_FLAT); /* flat shade keeps angular hands
+ from being "smoothed" */
+ for (min = max = 0; min < count; min = max)
+ {
+ for (max = min+1; max < count; max++)
+ if (data[max][2] != 0.0f) break;
+ range = max-min;
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = min; i <= max; i++)
+ {
+ j0 = i;
+ j1 = i+1;
+ if (j0 >= max) j0 -= range;
+ if (j1 >= max) j1 -= range;
+ x0 = data[j0][0];
+ y0 = data[j0][1];
+ x1 = data[j1][0];
+ y1 = data[j1][1];
+ gl.glVertex3f(x0, y0, 0.0f);
+ gl.glVertex3f(x0, y0, thickness);
+ // Normals
+ dx = y1 - y0;
+ dy = x0 - x1;
+ len = Math.sqrt(dx * dx + dy * dy);
+ gl.glNormal3f((float)(dx / len), (float)(dy / len), 0.0f);
+ }
+ gl.glEnd();
+ }
+ gl.glEndList();
+
+ gl.glNewList(whole, GL_COMPILE);
+ gl.glFrontFace(GL_CW);
+
+ gl.glCallList(edge);
+
+ gl.glNormal3f(0.0f, 0.0f, -1.0f);
+ gl.glCallList(side);
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, 0.0f, thickness);
+ gl.glFrontFace(GL_CCW);
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+ gl.glCallList(side);
+ gl.glPopMatrix();
+
+ gl.glEndList();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered(MouseEvent evt)
+ {
+ }
+
+ public void mouseExited(MouseEvent evt)
+ {
+ }
+
+ public void mousePressed(MouseEvent evt)
+ {
+ // Left button moves view.
+ // Both buttons moves light.
+ // Right button pops up menu.
+ if (!menu_showing)
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) == 0)
+ {
+ moving = true;
+ startx = evt.getX();
+ starty = evt.getY();
+ }
+ else if (moving)
+ {
+ moving = false;
+ lightMoving = true;
+ lightStartX = evt.getX();
+ lightStartY = evt.getY();
+ }
+ else
+ {
+ // Must be right mouse button.
+ menu_showing = true;
+ save_suspended = isSuspended();
+ if (!save_suspended)
+ {
+ setSuspended(true);
+ repaint(100);
+ try
+ {
+ Thread.currentThread().sleep(200);
+ }
+ catch (Exception e)
+ { }
+ }
+ menu.show(this,evt.getX(),evt.getY());
+ }
+ }
+ else
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+
+ public void mouseReleased(MouseEvent evt)
+ {
+ lightMoving = false;
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) == 0)
+ {
+ // Must be left button.
+ moving = false;
+ }
+ }
+
+ public void mouseClicked(MouseEvent evt)
+ {
+ }
+
+ // Methods required for the implementation of MouseMotionListener
+ public void mouseDragged(MouseEvent evt)
+ {
+ int x = evt.getX(), y = evt.getY();
+ if (moving)
+ {
+ angle += (x - startx);
+ while (angle < 0.0f) angle += 360.0f;
+ while (angle >= 360.0f) angle -= 360.0f;
+ angle2 += (y - starty);
+ if (angle2 < -180.0f)
+ angle2 = -180.0f;
+ else if (angle2 > 180.0f)
+ angle2 = 180.0f;
+ startx = x;
+ starty = y;
+ if (isSuspended()) repaint();
+ }
+ else if (lightMoving)
+ {
+ lightAngle += (lightStartX - x)/40.0f;
+ while (lightAngle < 0.0f) lightAngle += 360.0f;
+ while (lightAngle >= 360.0f) lightAngle -= 360.0f;
+ lightHeight += (lightStartY - y)/20.0f;
+ lightStartX = x;
+ lightStartY = y;
+ if (isSuspended()) repaint();
+ }
+ }
+
+ public void mouseMoved(MouseEvent evt)
+ {
+ }
+
+ // Method required for the implementation of ActionListener
+ public void actionPerformed(ActionEvent evt)
+ {
+ if (glj.gljMakeCurrent() == false) return;
+ boolean dorepaint = false;
+ String c = evt.getActionCommand();
+
+ if (c.equals(M_MOTION))
+ {
+ if (menu_showing)
+ save_suspended = !save_suspended;
+ else
+ setSuspended(!isSuspended());
+ dorepaint = true;
+ }
+ else if (c.equals(M_LIGHT))
+ {
+ lightSwitch = !lightSwitch;
+ if (lightSwitch)
+ gl.glEnable(GL_LIGHT0);
+ else
+ gl.glDisable(GL_LIGHT0);
+ dorepaint = true;
+ }
+ else if (c.equals(M_TEXTURE))
+ {
+ useTexture = !useTexture;
+ dorepaint = true;
+ }
+ else if (c.equals(M_SHADOWS))
+ {
+ renderShadow = !renderShadow;
+ dorepaint = true;
+ }
+ else if (c.equals(M_REFLECTION))
+ {
+ renderReflection = !renderReflection;
+ dorepaint = true;
+ }
+ else if (c.equals(M_DINOSAUR))
+ {
+ renderDinosaur = !renderDinosaur;
+ dorepaint = true;
+ }
+ else if (c.equals(M_STENCIL_REFLECTION))
+ {
+ stencilReflection = !stencilReflection;
+ dorepaint = true;
+ }
+ else if (c.equals(M_STENCIL_SHADOW))
+ {
+ stencilShadow = !stencilShadow;
+ dorepaint = true;
+ }
+ else if (c.equals(M_OFFSET_SHADOW))
+ {
+ offsetShadow = !offsetShadow;
+ dorepaint = true;
+ }
+ else if (c.equals(M_POSITIONAL))
+ {
+ directionalLight = false;
+ dorepaint = true;
+ }
+ else if (c.equals(M_DIRECTIONAL))
+ {
+ directionalLight = true;
+ dorepaint = true;
+ }
+
+ glj.gljFree();
+ if (menu_showing)
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ if ( (isSuspended()) && (dorepaint) ) repaint();
+ }
+ }
+}
diff --git a/demos/RonsDemos/dinoshade_plugin13.html b/demos/RonsDemos/dinoshade_plugin13.html
new file mode 100644
index 0000000..da6f965
--- /dev/null
+++ b/demos/RonsDemos/dinoshade_plugin13.html
@@ -0,0 +1,52 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Dinoshade by Mark J. Kilgard; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Dinoshade applet
+<br>Originially written by Mark J. Kilgard
+<br>Ported to Java by Ron Cemer
+<br>Press and hold left mouse button, then drag to rotate view.
+<br>Press and hold left mouse button, then press and hold right mouse button, then drag to rotate light.
+<br>Click right mouse button for a menu of options.
+<br>NOTE: If your system does not support hardware-accelerated stenciling, this demo will run slowly unless you disable stenciling for shadows and reflections.
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "dinoshade.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "dinoshade.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "dinoshade.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "dinoshade.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/dof.html b/demos/RonsDemos/dof.html
new file mode 100644
index 0000000..b614546
--- /dev/null
+++ b/demos/RonsDemos/dof.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>DOF by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+DOF applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<applet code="dof.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/dof.java b/demos/RonsDemos/dof.java
new file mode 100644
index 0000000..58d4e1a
--- /dev/null
+++ b/demos/RonsDemos/dof.java
@@ -0,0 +1,513 @@
+/**
+ * @(#) dof.java
+ * @(#) author: Silicon Graphics (converted to Java by Ron Cemer)
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+/*
+ * Copyright (c) 1993-1997, 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(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+
+/*
+ * This program demonstrates use of the accumulation buffer to
+ * create an out-of-focus depth-of-field effect. The teapots
+ * are drawn several times into the accumulation buffer. The
+ * viewing volume is jittered, except at the focal point, where
+ * the viewing volume is at the same position, each time. In
+ * this case, the gold teapot remains in focus.
+ */
+
+public class dof extends Applet
+{
+ // Data for drawing teapots:
+ /* Rim, body, lid, and bottom data must be reflected in x and
+ y; handle and spout data across the y axis only. */
+ private static final int patchdata[][] =
+ {
+ /* rim */
+ {102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15},
+ /* body */
+ {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27},
+ {24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 40},
+ /* lid */
+ {96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101,
+ 101, 0, 1, 2, 3,},
+ {0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112,
+ 113, 114, 115, 116, 117},
+ /* bottom */
+ {118, 118, 118, 118, 124, 122, 119, 121, 123, 126,
+ 125, 120, 40, 39, 38, 37},
+ /* handle */
+ {41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
+ 53, 54, 55, 56},
+ {53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+ 28, 65, 66, 67},
+ /* spout */
+ {68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83},
+ {80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
+ 92, 93, 94, 95}
+ };
+ private static final float cpdata[][] =
+ {
+ {0.2f, 0.0f, 2.7f}, {0.2f, -0.112f, 2.7f}, {0.112f, -0.2f, 2.7f}, {0.0f,
+ -0.2f, 2.7f}, {1.3375f, 0.0f, 2.53125f}, {1.3375f, -0.749f, 2.53125f},
+ {0.749f, -1.3375f, 2.53125f}, {0.0f, -1.3375f, 2.53125f}, {1.4375f,
+ 0.0f, 2.53125f}, {1.4375f, -0.805f, 2.53125f}, {0.805f, -1.4375f,
+ 2.53125f}, {0.0f, -1.4375f, 2.53125f}, {1.5f, 0.0f, 2.4f}, {1.5f, -0.84f,
+ 2.4f}, {0.84f, -1.5f, 2.4f}, {0.0f, -1.5f, 2.4f}, {1.75f, 0.0f, 1.875f},
+ {1.75f, -0.98f, 1.875f}, {0.98f, -1.75f, 1.875f}, {0.0f, -1.75f,
+ 1.875f}, {2f, 0.0f, 1.35f}, {2f, -1.12f, 1.35f}, {1.12f, -2f, 1.35f},
+ {0.0f, -2f, 1.35f}, {2f, 0.0f, 0.9f}, {2f, -1.12f, 0.9f}, {1.12f, -2f,
+ 0.9f}, {0.0f, -2f, 0.9f}, {-2f, 0.0f, 0.9f}, {2f, 0.0f, 0.45f}, {2f, -1.12f,
+ 0.45f}, {1.12f, -2f, 0.45f}, {0.0f, -2f, 0.45f}, {1.5f, 0.0f, 0.225f},
+ {1.5f, -0.84f, 0.225f}, {0.84f, -1.5f, 0.225f}, {0.0f, -1.5f, 0.225f},
+ {1.5f, 0.0f, 0.15f}, {1.5f, -0.84f, 0.15f}, {0.84f, -1.5f, 0.15f}, {0.0f,
+ -1.5f, 0.15f}, {-1.6f, 0.0f, 2.025f}, {-1.6f, -0.3f, 2.025f}, {-1.5f,
+ -0.3f, 2.25f}, {-1.5f, 0.0f, 2.25f}, {-2.3f, 0.0f, 2.025f}, {-2.3f, -0.3f,
+ 2.025f}, {-2.5f, -0.3f, 2.25f}, {-2.5f, 0.0f, 2.25f}, {-2.7f, 0.0f,
+ 2.025f}, {-2.7f, -0.3f, 2.025f}, {-3f, -0.3f, 2.25f}, {-3f, 0.0f,
+ 2.25f}, {-2.7f, 0.0f, 1.8f}, {-2.7f, -0.3f, 1.8f}, {-3f, -0.3f, 1.8f},
+ {-3f, 0.0f, 1.8f}, {-2.7f, 0.0f, 1.575f}, {-2.7f, -0.3f, 1.575f}, {-3f,
+ -0.3f, 1.35f}, {-3f, 0.0f, 1.35f}, {-2.5f, 0.0f, 1.125f}, {-2.5f, -0.3f,
+ 1.125f}, {-2.65f, -0.3f, 0.9375f}, {-2.65f, 0.0f, 0.9375f}, {-2f,
+ -0.3f, 0.9f}, {-1.9f, -0.3f, 0.6f}, {-1.9f, 0.0f, 0.6f}, {1.7f, 0.0f,
+ 1.425f}, {1.7f, -0.66f, 1.425f}, {1.7f, -0.66f, 0.6f}, {1.7f, 0.0f,
+ 0.6f}, {2.6f, 0.0f, 1.425f}, {2.6f, -0.66f, 1.425f}, {3.1f, -0.66f,
+ 0.825f}, {3.1f, 0.0f, 0.825f}, {2.3f, 0.0f, 2.1f}, {2.3f, -0.25f, 2.1f},
+ {2.4f, -0.25f, 2.025f}, {2.4f, 0.0f, 2.025f}, {2.7f, 0.0f, 2.4f}, {2.7f,
+ -0.25f, 2.4f}, {3.3f, -0.25f, 2.4f}, {3.3f, 0.0f, 2.4f}, {2.8f, 0.0f,
+ 2.475f}, {2.8f, -0.25f, 2.475f}, {3.525f, -0.25f, 2.49375f},
+ {3.525f, 0.0f, 2.49375f}, {2.9f, 0.0f, 2.475f}, {2.9f, -0.15f, 2.475f},
+ {3.45f, -0.15f, 2.5125f}, {3.45f, 0.0f, 2.5125f}, {2.8f, 0.0f, 2.4f},
+ {2.8f, -0.15f, 2.4f}, {3.2f, -0.15f, 2.4f}, {3.2f, 0.0f, 2.4f}, {0.0f, 0.0f,
+ 3.15f}, {0.8f, 0.0f, 3.15f}, {0.8f, -0.45f, 3.15f}, {0.45f, -0.8f,
+ 3.15f}, {0.0f, -0.8f, 3.15f}, {0.0f, 0.0f, 2.85f}, {1.4f, 0.0f, 2.4f}, {1.4f,
+ -0.784f, 2.4f}, {0.784f, -1.4f, 2.4f}, {0.0f, -1.4f, 2.4f}, {0.4f, 0.0f,
+ 2.55f}, {0.4f, -0.224f, 2.55f}, {0.224f, -0.4f, 2.55f}, {0.0f, -0.4f,
+ 2.55f}, {1.3f, 0.0f, 2.55f}, {1.3f, -0.728f, 2.55f}, {0.728f, -1.3f,
+ 2.55f}, {0.0f, -1.3f, 2.55f}, {1.3f, 0.0f, 2.4f}, {1.3f, -0.728f, 2.4f},
+ {0.728f, -1.3f, 2.4f}, {0.0f, -1.3f, 2.4f}, {0.0f, 0.0f, 0.0f}, {1.425f,
+ -0.798f, 0.0f}, {1.5f, 0.0f, 0.075f}, {1.425f, 0.0f, 0.0f}, {0.798f, -1.425f,
+ 0.0f}, {0.0f, -1.5f, 0.075f}, {0.0f, -1.425f, 0.0f}, {1.5f, -0.84f, 0.075f},
+ {0.84f, -1.5f, 0.075f}
+ };
+ private static final float tex[] =
+ {
+ 0.0f, 0.0f,
+ 1.0f, 0.0f,
+ 0.0f, 1.0f,
+ 1.0f, 1.0f
+ };
+ /* 8 jitter points */
+ double j8[][] =
+ {
+ {-0.334818, 0.435331},
+ { 0.286438, -0.393495},
+ { 0.459462, 0.141540},
+ {-0.414498, -0.192829},
+ {-0.183790, 0.082102},
+ {-0.079263, -0.317383},
+ { 0.102254, 0.299133},
+ { 0.164216, -0.054399}
+ };
+
+ dofCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new dofCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+
+ /* Destroy the applet */
+
+
+ public void destroy()
+ {
+ canvas.cvsDispose();
+ }
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class dofCanvas extends GLCanvas
+ {
+ private final double PI_ = 3.14159265358979323846;
+ int teapotList;
+
+ public dofCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ accumSize = 8;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ float ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
+ float diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float position[] = { 0.0f, 3.0f, 3.0f, 0.0f };
+
+ float lmodel_ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
+ float local_view[] = { 0.0f };
+
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, position);
+
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ gl.glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);
+
+ gl.glFrontFace(GL_CW);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_AUTO_NORMAL);
+ gl.glEnable(GL_NORMALIZE);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ gl.glClearAccum(0.0f, 0.0f, 0.0f, 0.0f);
+
+ /* make teapot display list */
+ teapotList = gl.glGenLists(1);
+ gl.glNewList(teapotList, GL_COMPILE);
+ glutSolidTeapot(0.5);
+ gl.glEndList();
+
+ glj.gljCheckGL();
+ }
+
+ public void cvsDispose()
+ {
+ System.out.println("destroy(): " + this);
+ super.cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ int viewport[] = new int[4];
+
+ gl.glGetIntegerv(GL_VIEWPORT, viewport);
+ gl.glClear(GL_ACCUM_BUFFER_BIT);
+
+ for (int jitter = 0; jitter < 8; jitter++)
+ {
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ accPerspective
+ (45.0,
+ (double)viewport[2]/(double)viewport[3],
+ 1.0, 15.0, 0.0, 0.0,
+ 0.33*j8[jitter][0], 0.33*j8[jitter][1], 5.0);
+ /* ruby, gold, silver, emerald, and cyan teapots */
+ renderTeapot
+ (-1.1f, -0.5f, -4.5f, 0.1745f, 0.01175f,
+ 0.01175f, 0.61424f, 0.04136f, 0.04136f,
+ 0.727811f, 0.626959f, 0.626959f, 0.6f);
+ renderTeapot
+ (-0.5f, -0.5f, -5.0f, 0.24725f, 0.1995f,
+ 0.0745f, 0.75164f, 0.60648f, 0.22648f,
+ 0.628281f, 0.555802f, 0.366065f, 0.4f);
+ renderTeapot
+ (0.2f, -0.5f, -5.5f, 0.19225f, 0.19225f,
+ 0.19225f, 0.50754f, 0.50754f, 0.50754f,
+ 0.508273f, 0.508273f, 0.508273f, 0.4f);
+ renderTeapot
+ (1.0f, -0.5f, -6.0f, 0.0215f, 0.1745f, 0.0215f,
+ 0.07568f, 0.61424f, 0.07568f, 0.633f,
+ 0.727811f, 0.633f, 0.6f);
+ renderTeapot
+ (1.8f, -0.5f, -6.5f, 0.0f, 0.1f, 0.06f, 0.0f,
+ 0.50980392f, 0.50980392f, 0.50196078f,
+ 0.50196078f, 0.50196078f, 0.25f);
+ gl.glAccum(GL_ACCUM, 0.125f);
+ }
+ gl.glAccum (GL_RETURN, 1.0f);
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ // Imported from glut.
+ private void glutSolidTeapot(double scale)
+ {
+ teapot(14, scale, GL_FILL);
+ }
+
+ // Imported from glut.
+ private void teapot(int grid, double scale, int type)
+ {
+ float p[] = new float[4*4*3];
+ float q[] = new float[4*4*3];
+ float r[] = new float[4*4*3];
+ float s[] = new float[4*4*3];
+ float sc = (float)(0.5*scale);
+
+ gl.glPushAttrib(GL_ENABLE_BIT | GL_EVAL_BIT);
+ gl.glEnable(GL_AUTO_NORMAL);
+ gl.glEnable(GL_NORMALIZE);
+ gl.glEnable(GL_MAP2_VERTEX_3);
+ gl.glEnable(GL_MAP2_TEXTURE_COORD_2);
+ gl.glPushMatrix();
+ gl.glRotatef(270.0f, 1.0f, 0.0f, 0.0f);
+ gl.glScalef(sc, sc, sc);
+ gl.glTranslatef(0.0f, 0.0f, -1.5f);
+ for (int i = 0; i < 10; i++)
+ {
+ for (int j = 0; j < 4; j++)
+ {
+ for (int k = 0; k < 4; k++)
+ {
+ for (int l = 0; l < 3; l++)
+ {
+ p[(j*12)+(k*3)+l] = cpdata[patchdata[i][j * 4 + k]][l];
+ q[(j*12)+(k*3)+l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
+ if (l == 1)
+ q[(j*12)+(k*3)+l] *= -1.0f;
+ if (i < 6)
+ {
+ r[(j*12)+(k*3)+l] =
+ cpdata[patchdata[i][j * 4 + (3 - k)]][l];
+ if (l == 0)
+ r[(j*12)+(k*3)+l] *= -1.0f;
+ s[(j*12)+(k*3)+l] =
+ cpdata[patchdata[i][j * 4 + k]][l];
+ if (l == 0)
+ s[(j*12)+(k*3)+l] *= -1.0f;
+ if (l == 1)
+ s[(j*12)+(k*3)+l] *= -1.0f;
+ }
+ }
+ }
+ }
+ gl.glMap2f
+ (GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, tex);
+ gl.glMap2f
+ (GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, p);
+ gl.glMapGrid2f(grid, 0.0f, 1.0f, grid, 0.0f, 1.0f);
+ gl.glEvalMesh2(type, 0, grid, 0, grid);
+ gl.glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, q);
+ gl.glEvalMesh2(type, 0, grid, 0, grid);
+ if (i < 6)
+ {
+ gl.glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, r);
+ gl.glEvalMesh2(type, 0, grid, 0, grid);
+ gl.glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, s);
+ gl.glEvalMesh2(type, 0, grid, 0, grid);
+ }
+ }
+ gl.glPopMatrix();
+ gl.glPopAttrib();
+ }
+
+ /* accFrustum()
+ * The first 6 arguments are identical to the glFrustum() call.
+ *
+ * pixdx and pixdy are anti-alias jitter in pixels.
+ * Set both equal to 0.0 for no anti-alias jitter.
+ * eyedx and eyedy are depth-of field jitter in pixels.
+ * Set both equal to 0.0 for no depth of field effects.
+ *
+ * focus is distance from eye to plane in focus.
+ * focus must be greater than, but not equal to 0.0.
+ *
+ * Note that accFrustum() calls glTranslatef(). You will
+ * probably want to insure that your ModelView matrix has been
+ * initialized to identity before calling accFrustum().
+ */
+ private void accFrustum
+ (double left,
+ double right,
+ double bottom,
+ double top,
+ double near,
+ double far,
+ double pixdx,
+ double pixdy,
+ double eyedx,
+ double eyedy,
+ double focus)
+ {
+ double xwsize, ywsize;
+ double dx, dy;
+ int viewport[] = new int[4];
+
+ gl.glGetIntegerv(GL_VIEWPORT, viewport);
+
+ xwsize = right - left;
+ ywsize = top - bottom;
+
+ dx = -(pixdx*xwsize/(double) viewport[2] + eyedx*near/focus);
+ dy = -(pixdy*ywsize/(double) viewport[3] + eyedy*near/focus);
+
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glFrustum
+ ((float)(left + dx),
+ (float)(right + dx),
+ (float)(bottom + dy),
+ (float)(top + dy),
+ (float)near,
+ (float)far);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glTranslatef((float)-eyedx, (float)-eyedy, 0.0f);
+ }
+
+ /* accPerspective()
+ *
+ * The first 4 arguments are identical to the gluPerspective() call.
+ * pixdx and pixdy are anti-alias jitter in pixels.
+ * Set both equal to 0.0 for no anti-alias jitter.
+ * eyedx and eyedy are depth-of field jitter in pixels.
+ * Set both equal to 0.0 for no depth of field effects.
+ *
+ * focus is distance from eye to plane in focus.
+ * focus must be greater than, but not equal to 0.0.
+ *
+ * Note that accPerspective() calls accFrustum().
+ */
+ private void accPerspective
+ (double fovy,
+ double aspect,
+ double near,
+ double far,
+ double pixdx,
+ double pixdy,
+ double eyedx,
+ double eyedy,
+ double focus)
+ {
+ double fov2,left,right,bottom,top;
+
+ fov2 = ((fovy*PI_) / 180.0) / 2.0;
+
+ top = near / (Math.cos(fov2) / Math.sin(fov2));
+ bottom = -top;
+
+ right = top * aspect;
+ left = -right;
+
+ accFrustum
+ (left,right,bottom,top,near,far,pixdx,pixdy,eyedx,eyedy,focus);
+ }
+
+ private void renderTeapot
+ (float x,
+ float y,
+ float z,
+ float ambr,
+ float ambg,
+ float ambb,
+ float difr,
+ float difg,
+ float difb,
+ float specr,
+ float specg,
+ float specb,
+ float shine)
+ {
+ float mat[] = new float[4];
+
+ gl.glPushMatrix();
+ gl.glTranslatef(x, y, z);
+ mat[0] = ambr; mat[1] = ambg; mat[2] = ambb; mat[3] = 1.0f;
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat);
+ mat[0] = difr; mat[1] = difg; mat[2] = difb;
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat);
+ mat[0] = specr; mat[1] = specg; mat[2] = specb;
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat);
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, shine*128.0f);
+ gl.glCallList(teapotList);
+ gl.glPopMatrix();
+ }
+ }
+}
diff --git a/demos/RonsDemos/dof_plugin13.html b/demos/RonsDemos/dof_plugin13.html
new file mode 100644
index 0000000..1f1e874
--- /dev/null
+++ b/demos/RonsDemos/dof_plugin13.html
@@ -0,0 +1,48 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>DOF by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+DOF applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "dof.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "dof.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "dof.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "dof.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/fog.html b/demos/RonsDemos/fog.html
new file mode 100644
index 0000000..b7684ab
--- /dev/null
+++ b/demos/RonsDemos/fog.html
@@ -0,0 +1,18 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Fog by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Fog applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>Click inside the window to cycle the fog mode.
+<br>
+<applet code="fog.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/fog.java b/demos/RonsDemos/fog.java
new file mode 100644
index 0000000..7f99c94
--- /dev/null
+++ b/demos/RonsDemos/fog.java
@@ -0,0 +1,266 @@
+/**
+ * @(#) fog.java
+ * @(#) author: Silicon Graphics (converted to Java by Ron Cemer)
+ */
+
+/*
+ * Copyright (c) 1993-1997, 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(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+
+/*
+ * This program draws 5 red spheres, each at a different
+ * z distance from the eye, in different types of fog.
+ * Pressing the f key chooses between 3 types of
+ * fog: exponential, exponential squared, and linear.
+ * In this program, there is a fixed density value, as well
+ * as fixed start and end values for the linear fog.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+public class fog extends Applet
+{
+ fogCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new fogCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+
+ /* Destroy the applet */
+
+
+ public void destroy()
+ {
+ canvas.cvsDispose();
+ }
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class fogCanvas extends GLCanvas implements MouseListener
+ {
+ int fogMode;
+
+ public fogCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ float position[] = { 0.5f, 0.5f, 3.0f, 0.0f };
+
+ gl.glEnable(GL_DEPTH_TEST);
+
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, position);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+
+ float mat[] = {0.1745f, 0.01175f, 0.01175f};
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat);
+ mat[0] = 0.61424f; mat[1] = 0.04136f; mat[2] = 0.04136f;
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat);
+ mat[0] = 0.727811f; mat[1] = 0.626959f; mat[2] = 0.626959f;
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat);
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, 0.6f*128.0f);
+
+ gl.glEnable(GL_FOG);
+
+ float fogColor[] = {0.5f, 0.5f, 0.5f, 1.0f};
+ fogMode = GL_EXP;
+ gl.glFogi(GL_FOG_MODE, fogMode);
+ gl.glFogfv(GL_FOG_COLOR, fogColor);
+ gl.glFogf(GL_FOG_DENSITY, 0.35f);
+ gl.glHint(GL_FOG_HINT, GL_DONT_CARE);
+ gl.glFogf(GL_FOG_START, 1.0f);
+ gl.glFogf(GL_FOG_END, 5.0f);
+
+ gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f); /* fog color */
+
+ glj.gljCheckGL();
+
+ addMouseListener(this);
+ }
+
+ public void cvsDispose()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ super.cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+
+ gl.glLoadIdentity();
+ if (width <= height)
+ gl.glOrtho
+ (-2.5f,
+ 2.5f,
+ -2.5f*(float)height/(float)width,
+ 2.5f*(float)height/(float)width,
+ -10.0f,
+ 10.0f);
+ else
+ gl.glOrtho
+ (-2.5f*(float)width/(float)height,
+ 2.5f*(float)width/(float)height,
+ -2.5f,
+ 2.5f,
+ -10.0f,
+ 10.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity ();
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ renderSphere(-2.0f, -0.5f, -1.0f);
+ renderSphere(-1.0f, -0.5f, -2.0f);
+ renderSphere(0.0f, -0.5f, -3.0f);
+ renderSphere(1.0f, -0.5f, -4.0f);
+ renderSphere(2.0f, -0.5f, -5.0f);
+ gl.glFlush();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ private void renderSphere(float x, float y, float z)
+ {
+ gl.glPushMatrix();
+ gl.glTranslatef(x, y, z);
+
+ int qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,0.4f,16,16);
+ glu.gluDeleteQuadric(qobj);
+
+ gl.glPopMatrix();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ if (fogMode == GL_EXP)
+ {
+ fogMode = GL_EXP2;
+ System.out.println("Fog mode is GL_EXP2");
+ }
+ else if (fogMode == GL_EXP2)
+ {
+ fogMode = GL_LINEAR;
+ System.out.println("Fog mode is GL_LINEAR");
+ }
+ else
+ {
+ fogMode = GL_EXP;
+ System.out.println("Fog mode is GL_EXP");
+ }
+ gl.glFogi(GL_FOG_MODE,fogMode);
+ repaint();
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ }
+ }
+}
diff --git a/demos/RonsDemos/fog_plugin13.html b/demos/RonsDemos/fog_plugin13.html
new file mode 100644
index 0000000..94f367d
--- /dev/null
+++ b/demos/RonsDemos/fog_plugin13.html
@@ -0,0 +1,49 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Fog by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Fog applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>Click inside the window to cycle the fog mode.
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "fog.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "fog.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "fog.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "fog.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/gears.html b/demos/RonsDemos/gears.html
new file mode 100644
index 0000000..fb44ddb
--- /dev/null
+++ b/demos/RonsDemos/gears.html
@@ -0,0 +1,23 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Gears by Brian Paul; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Gears applet
+<br>Originially written by Brian Paul
+<br>Ported to Java by Ron Cemer
+<br>
+<hr>
+<br>You can rotate the view by holding the left mouse button down and
+<br>dragging the mouse within the applet's window.
+<br>If you hold the right button down instead, the view will rotate
+<br>around the Z axis.
+<br>
+<applet code="gears.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/gears.java b/demos/RonsDemos/gears.java
new file mode 100644
index 0000000..cdc1634
--- /dev/null
+++ b/demos/RonsDemos/gears.java
@@ -0,0 +1,432 @@
+/**
+ * @(#) gears.java
+ * @(#) author: Brian Paul (converted to Java by Ron Cemer)
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class gears extends SimpleGLAnimApplet1
+{
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new gearsCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("gears");
+
+ gears applet = new gears();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class gearsCanvas extends GLAnimCanvas implements MouseListener, MouseMotionListener
+ {
+ private static final float M_PI = 3.14159265359f;
+ private int gear1, gear2, gear3;
+ private float angle = 0.0f;
+
+ private MatrixFuncs mtxfuncs = null;
+ private int prevMouseX, prevMouseY;
+ private boolean mouseRButtonDown = false;
+ private float rot_matrix[] =
+ {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f
+ };
+
+ public gearsCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+
+ mtxfuncs = new MatrixFuncs();
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ setInitialRotation();
+
+ float pos[] = { 5.0f, 5.0f, 10.0f, 0.0f };
+ float red[] = { 0.8f, 0.1f, 0.0f, 1.0f };
+ float green[] = { 0.0f, 0.8f, 0.2f, 1.0f };
+ float blue[] = { 0.2f, 0.2f, 1.0f, 1.0f };
+
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ gl.glEnable(GL_CULL_FACE);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ /* make the gears */
+ gear1 = gl.glGenLists(1);
+ gl.glNewList(gear1, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
+ gear(1.0f, 4.0f, 1.0f, 20, 0.7f);
+ gl.glEndList();
+
+ gear2 = gl.glGenLists(1);
+ gl.glNewList(gear2, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
+ gear(0.5f, 2.0f, 2.0f, 10, 0.7f);
+ gl.glEndList();
+
+ gear3 = gl.glGenLists(1);
+ gl.glNewList(gear3, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+ gear(1.3f, 2.0f, 0.5f, 10, 0.7f);
+ gl.glEndList();
+
+ gl.glEnable(GL_NORMALIZE);
+
+ glj.gljCheckGL();
+
+ addMouseListener(this);
+ addMouseMotionListener(this);
+ }
+
+ public void doCleanup()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ removeMouseMotionListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ float h = (float)height / (float)width;
+
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glFrustum(-1.0f, 1.0f, -h, h, 5.0f, 60.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glTranslatef(0.0f, 0.0f, -40.0f);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ angle += 0.5f;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ gl.glPushMatrix();
+ gl.glMultMatrixf(rot_matrix);
+
+ gl.glPushMatrix();
+ gl.glTranslatef(-3.0f, -2.0f, 0.0f);
+ gl.glRotatef(angle, 0.0f, 0.0f, 1.0f);
+ gl.glCallList(gear1);
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(3.1f, -2.0f, 0.0f);
+ gl.glRotatef(-2.0f * angle - 9.0f, 0.0f, 0.0f, 1.0f);
+ gl.glCallList(gear2);
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(-3.1f, 4.2f, 0.0f);
+ gl.glRotatef(-2.0f * angle - 25.0f, 0.0f, 0.0f, 1.0f);
+ gl.glCallList(gear3);
+ gl.glPopMatrix();
+
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ //if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+
+ private void gear
+ (float inner_radius,
+ float outer_radius,
+ float width,
+ int teeth,
+ float tooth_depth)
+ {
+ int i;
+ float r0, r1, r2;
+ float angle, da;
+ float u, v, len;
+
+ r0 = inner_radius;
+ r1 = outer_radius - tooth_depth / 2.0f;
+ r2 = outer_radius + tooth_depth / 2.0f;
+
+ da = 2.0f * M_PI / teeth / 4.0f;
+
+ gl.glShadeModel(GL_FLAT);
+
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+
+ /* draw front face */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3.0f * da), r1 * (float)Math.sin(angle + 3.0f * da), width * 0.5f);
+ }
+ gl.glEnd();
+
+ /* draw front sides of teeth */
+ gl.glBegin(GL_QUADS);
+ da = 2.0f * M_PI / teeth / 4.0f;
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2.0f * da), r2 * (float)Math.sin(angle + 2.0f * da), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3.0f * da), r1 * (float)Math.sin(angle + 3.0f * da), width * 0.5f);
+ }
+ gl.glEnd();
+
+ gl.glNormal3f(0.0f, 0.0f, -1.0f);
+
+ /* draw back face */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
+ }
+ gl.glEnd();
+
+ /* draw back sides of teeth */
+ gl.glBegin(GL_QUADS);
+ da = 2.0f * M_PI / teeth / 4.0f;
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), -width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), -width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
+ }
+ gl.glEnd();
+
+ /* draw outward faces of teeth */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
+ u = r2 * (float)Math.cos(angle + da) - r1 * (float)Math.cos(angle);
+ v = r2 * (float)Math.sin(angle + da) - r1 * (float)Math.sin(angle);
+ len = (float)Math.sqrt(u * u + v * v);
+ u /= len;
+ v /= len;
+ gl.glNormal3f(v, -u, 0.0f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), -width * 0.5f);
+ gl.glNormal3f((float)Math.cos(angle), (float)Math.sin(angle), 0.0f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), -width * 0.5f);
+ u = r1 * (float)Math.cos(angle + 3 * da) - r2 * (float)Math.cos(angle + 2 * da);
+ v = r1 * (float)Math.sin(angle + 3 * da) - r2 * (float)Math.sin(angle + 2 * da);
+ gl.glNormal3f(v, -u, 0.0f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
+ gl.glNormal3f((float)Math.cos(angle), (float)Math.sin(angle), 0.0f);
+ }
+ gl.glVertex3f(r1 * (float)Math.cos(0), r1 * (float)Math.sin(0), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(0), r1 * (float)Math.sin(0), -width * 0.5f);
+ gl.glEnd();
+
+ gl.glShadeModel(GL_SMOOTH);
+
+ /* draw inside radius cylinder */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glNormal3f(-(float)Math.cos(angle), -(float)Math.sin(angle), 0.0f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
+ }
+ gl.glEnd();
+ }
+
+ // Reset the rotation matrix to the default view.
+ private void setInitialRotation()
+ {
+ float mtxbuf[] = new float[16];
+ float mtxbuf2[] = new float[16];
+
+ mtxfuncs.rotateAroundY(30.0f,mtxbuf);
+ mtxfuncs.rotateAroundX(20.0f,mtxbuf2);
+ mtxfuncs.multiplyMatrices(mtxbuf2,mtxbuf,rot_matrix);
+ fixRotationMatrix();
+ }
+
+ private void fixRotationMatrix()
+ {
+ // Fix any problems with the rotation matrix.
+ rot_matrix[3] =
+ rot_matrix[7] =
+ rot_matrix[11] =
+ rot_matrix[12] =
+ rot_matrix[13] =
+ rot_matrix[14] = 0.0f;
+ rot_matrix[15] = 1.0f;
+ float fac;
+ if ((fac = (float)Math.sqrt
+ ((rot_matrix[0]*rot_matrix[0]) +
+ (rot_matrix[4]*rot_matrix[4]) +
+ (rot_matrix[8]*rot_matrix[8]))) != 1.0f)
+ {
+ if (fac != 0.0f)
+ {
+ fac = 1.0f/fac;
+ rot_matrix[0] *= fac;
+ rot_matrix[4] *= fac;
+ rot_matrix[8] *= fac;
+ }
+ }
+ if ((fac = (float)Math.sqrt
+ ((rot_matrix[1]*rot_matrix[1]) +
+ (rot_matrix[5]*rot_matrix[5]) +
+ (rot_matrix[9]*rot_matrix[9]))) != 1.0f)
+ {
+ if (fac != 0.0f)
+ {
+ fac = 1.0f/fac;
+ rot_matrix[1] *= fac;
+ rot_matrix[5] *= fac;
+ rot_matrix[9] *= fac;
+ }
+ }
+ if ((fac = (float)Math.sqrt
+ ((rot_matrix[2]*rot_matrix[2]) +
+ (rot_matrix[6]*rot_matrix[6]) +
+ (rot_matrix[10]*rot_matrix[10]))) != 1.0f)
+ {
+ if (fac != 0.0f)
+ {
+ fac = 1.0f/fac;
+ rot_matrix[2] *= fac;
+ rot_matrix[6] *= fac;
+ rot_matrix[10] *= fac;
+ }
+ }
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ prevMouseX = evt.getX();
+ prevMouseY = evt.getY();
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ mouseRButtonDown = true;
+ evt.consume();
+ }
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ mouseRButtonDown = false;
+ evt.consume();
+ }
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ }
+
+ // Methods required for the implementation of MouseMotionListener
+ public void mouseDragged( MouseEvent evt )
+ {
+ int x = evt.getX();
+ int y = evt.getY();
+ float thetaX = (float)(x-prevMouseX)*(360.0f/(float)getSize().width);
+ float thetaY = (float)(prevMouseY-y)*(360.0f/(float)getSize().height);
+ float mtxbuf[] = new float[16];
+ float mtxbuf2[] = new float[16];
+
+ prevMouseX = x;
+ prevMouseY = y;
+ if ( (thetaX != 0.0f) || (thetaY != 0.0f) )
+ {
+ mtxfuncs.rotateAroundY(((float)thetaX),mtxbuf);
+ if (mouseRButtonDown)
+ mtxfuncs.rotateAroundZ(thetaY,mtxbuf2);
+ else
+ mtxfuncs.rotateAroundX(-thetaY,mtxbuf2);
+ mtxfuncs.multiplyMatrices(mtxbuf2,mtxbuf,mtxbuf);
+ mtxfuncs.multiplyMatrices(rot_matrix,mtxbuf,rot_matrix);
+ fixRotationMatrix();
+ }
+ evt.consume();
+ }
+
+ public void mouseMoved( MouseEvent evt )
+ {
+ }
+ }
+}
diff --git a/demos/RonsDemos/gears_plugin13.html b/demos/RonsDemos/gears_plugin13.html
new file mode 100644
index 0000000..2069b32
--- /dev/null
+++ b/demos/RonsDemos/gears_plugin13.html
@@ -0,0 +1,54 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Gears by Brian Paul; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Gears applet
+<br>Originially written by Brian Paul
+<br>Ported to Java by Ron Cemer
+<br>
+<hr>
+<br>You can rotate the view by holding the left mouse button down and
+<br>dragging the mouse within the applet's window.
+<br>If you hold the right button down instead, the view will rotate
+<br>around the Z axis.
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "gears.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "gears.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "gears.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "gears.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/gl4java.policy b/demos/RonsDemos/gl4java.policy
new file mode 100644
index 0000000..6ea44cc
--- /dev/null
+++ b/demos/RonsDemos/gl4java.policy
@@ -0,0 +1,27 @@
+
+grant codeBase "http://www.jausoft.com/Files/Java/1.1.X/GL4Java/demos/-"
+{
+ permission java.security.RuntimePermission;
+};
+
+grant codeBase "http://www.jausoft.com/Files/Java/1.1.X/GL4Java/demos/RonsDemos/-"
+{
+ permission java.security.RuntimePermission;
+};
+
+grant codeBase "http://jausoft.goethel.de/Files/Java/1.1.X/GL4Java/demos/RonsDemos/-" {
+ permission java.security.RuntimePermission;
+};
+
+grant codeBase "http://jausoft.goethel.de/Files/Java/1.1.X/GL4Java/demos/-" {
+ permission java.security.RuntimePermission;
+};
+
+grant codeBase "file://f/java-1.1.X/GL4Java/demos/-" {
+ permission java.security.AllPermission;
+};
+
+grant codeBase "file://f/java-1.1.X/GL4Java/demos/RonsDemos/-" {
+ permission java.security.AllPermission;
+};
+
diff --git a/demos/RonsDemos/glutplane.html b/demos/RonsDemos/glutplane.html
new file mode 100644
index 0000000..3e7760d
--- /dev/null
+++ b/demos/RonsDemos/glutplane.html
@@ -0,0 +1,19 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Glutplane by Mark J. Kilgard; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Glutplane applet
+<br>Originially written by Mark J. Kilgard
+<br>Ported to Java by Ron Cemer
+<br>Right-click within the window for a menu of commands.
+<br>While suspended, left-click within the window to render the next frame.
+<br>
+<applet code="glutplane.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/glutplane.java b/demos/RonsDemos/glutplane.java
new file mode 100644
index 0000000..c1e0e52
--- /dev/null
+++ b/demos/RonsDemos/glutplane.java
@@ -0,0 +1,334 @@
+/**
+ * @(#) glutplane.java
+ * @(#) author: Mark J. Kilgard (converted to Java by Ron Cemer)
+ */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class glutplane extends SimpleGLAnimApplet1
+{
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new glutplaneCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ private class planeobj
+ {
+ float speed = 0.0f; /* zero speed means not flying */
+ float red = 0.0f, green = 0.0f, blue = 0.0f;
+ float theta = 0.0f;
+ float x = 0.0f, y = 0.0f, z = 0.0f, angle = 0.0f;
+
+ public void setColor(float r, float g, float b)
+ {
+ red = r;
+ green = g;
+ blue = b;
+ }
+ };
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class glutplaneCanvas extends GLAnimCanvas
+ implements MouseListener, ActionListener
+ {
+ private final double M_PI = 3.14159265;
+ private final double M_PI_2 = 1.57079632;
+ private final int MAX_PLANES = 15;
+ private final String ADD_PLANE = "Add plane";
+ private final String REMOVE_PLANE = "Remove plane";
+ private final String SUSPEND_RESUME = "Suspend/resume animation";
+
+ private planeobj planes[] = null;
+ private Random random = null;
+ private PopupMenu menu = null;
+ private boolean menu_showing = false;
+ private boolean save_suspended = false;
+
+ public glutplaneCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ gl.glClearDepth(1.0f);
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glFrustum(-1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 20.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ /* add three initial random planes */
+ planes = new planeobj[MAX_PLANES];
+ for (int i = 0; i < MAX_PLANES; i++)
+ planes[i] = new planeobj();
+ random = new Random(System.currentTimeMillis());
+ add_plane();
+ add_plane();
+ add_plane();
+
+ glj.gljCheckGL();
+
+ menu = new PopupMenu("Options");
+ menu.add(ADD_PLANE);
+ menu.add(REMOVE_PLANE);
+ menu.add(SUSPEND_RESUME);
+ menu.addActionListener(this);
+ add(menu);
+
+ addMouseListener(this);
+ }
+
+ public void doCleanup()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ menu.removeActionListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ tick();
+
+ float red, green, blue;
+
+ gl.glClear(GL_DEPTH_BUFFER_BIT);
+ /* paint black to blue smooth shaded polygon for background */
+ gl.glDisable(GL_DEPTH_TEST);
+ gl.glShadeModel(GL_SMOOTH);
+ gl.glBegin(GL_POLYGON);
+ gl.glColor3f(0.0f, 0.0f, 0.0f);
+ gl.glVertex3f(-20f, 20f, -19f);
+ gl.glVertex3f(20f, 20f, -19f);
+ gl.glColor3f(0.0f, 0.0f, 1.0f);
+ gl.glVertex3f(20f, -20f, -19f);
+ gl.glVertex3f(-20f, -20f, -19f);
+ gl.glEnd();
+ /* paint planes */
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glShadeModel(GL_FLAT);
+ for (int i = 0; i < MAX_PLANES; i++)
+ {
+ if (planes[i].speed != 0.0f)
+ {
+ gl.glPushMatrix();
+ gl.glTranslatef(planes[i].x, planes[i].y, planes[i].z);
+ gl.glRotatef(290.0f, 1.0f, 0.0f, 0.0f);
+ gl.glRotatef(planes[i].angle, 0.0f, 0.0f, 1.0f);
+ gl.glScalef(1.0f / 3.0f, 1.0f / 4.0f, 1.0f / 4.0f);
+ gl.glTranslatef(0.0f, -4.0f, -1.5f);
+ gl.glBegin(GL_TRIANGLE_STRIP);
+ /* left wing */
+ gl.glVertex3f(-7.0f, 0.0f, 2.0f);
+ gl.glVertex3f(-1.0f, 0.0f, 3.0f);
+ red = planes[i].red;
+ green = planes[i].green;
+ blue = planes[i].blue;
+ gl.glColor3f(red,green,blue);
+ gl.glVertex3f(-1.0f, 7.0f, 3.0f);
+ /* left side */
+ gl.glColor3f(0.6f * red, 0.6f * green, 0.6f * blue);
+ gl.glVertex3f(0.0f, 0.0f, 0.0f);
+ gl.glVertex3f(0.0f, 8.0f, 0.0f);
+ /* right side */
+ gl.glVertex3f(1.0f, 0.0f, 3.0f);
+ gl.glVertex3f(1.0f, 7.0f, 3.0f);
+ /* final tip of right wing */
+ gl.glColor3f(red, green, blue);
+ gl.glVertex3f(7.0f, 0.0f, 2.0f);
+ gl.glEnd();
+ gl.glPopMatrix();
+ }
+ }
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ // if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered(MouseEvent evt)
+ {
+ }
+
+ public void mouseExited(MouseEvent evt)
+ {
+ }
+
+ public void mousePressed(MouseEvent evt)
+ {
+ // If user presses right mouse button within canvas area,
+ // suspend animation and pop up menu.
+ // If menu was already popped up and user presses either
+ // mouse button within canvas area, resume animation
+ // because the menu will have been removed automatically.
+ if (!menu_showing)
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ menu_showing = true;
+ save_suspended = isSuspended();
+ if (!save_suspended)
+ {
+ setSuspended(true);
+ repaint(100);
+ try
+ {
+ Thread.currentThread().sleep(200);
+ }
+ catch (Exception e)
+ { }
+ }
+ menu.show(this,evt.getX(),evt.getY());
+ }
+ else
+ {
+ // Must be left button.
+ if (isSuspended()) repaint();
+ }
+ }
+ else
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+
+ public void mouseReleased(MouseEvent evt)
+ {
+ }
+
+ public void mouseClicked(MouseEvent evt)
+ {
+ }
+
+ // Method required for the implementation of ActionListener
+ public void actionPerformed(ActionEvent evt)
+ {
+ String c = evt.getActionCommand();
+ if (c.equals(ADD_PLANE))
+ {
+ add_plane();
+ }
+ else if (c.equals(REMOVE_PLANE))
+ {
+ remove_plane();
+ }
+ else if (c.equals(SUSPEND_RESUME))
+ {
+ if (menu_showing)
+ save_suspended = !save_suspended;
+ else
+ setSuspended(!isSuspended()); // not likely to happen
+ }
+ if (menu_showing)
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+
+ private void tick_per_plane(int i)
+ {
+ float theta = planes[i].theta += planes[i].speed;
+ planes[i].z = -9.0f + 4.0f * (float)Math.cos(theta);
+ planes[i].x = 4 * (float)Math.sin(2.0f * theta);
+ planes[i].y = (float)Math.sin(theta / 3.4f) * 3.0f;
+ planes[i].angle = (float)
+ (((Math.atan(2.0) + M_PI_2) * Math.sin(theta) - M_PI_2) *
+ 180.0 / M_PI);
+ if (planes[i].speed < 0.0f) planes[i].angle += 180.0f;
+ }
+
+ private void add_plane()
+ {
+ for (int i = 0; i < MAX_PLANES; i++)
+ {
+ if (planes[i].speed == 0.0f)
+ {
+ int c = random.nextInt() & 0x07;
+ while (c == 0) c = random.nextInt() & 0x07;
+ float r = (float)((c >> 2) & 0x01);
+ float g = (float)((c >> 1) & 0x01);
+ float b = (float)(c & 0x01);
+ // Blue fades into the background; lighten it up.
+ if (c == 0x01) r = g = 0.4f;
+ planes[i].setColor(r,g,b);
+ planes[i].speed =
+ ((float)(random.nextInt() % 20)) * 0.001f + 0.02f;
+ if ((random.nextInt() & 0x01) != 0)
+ planes[i].speed *= -1.0f;
+ planes[i].theta =
+ ((float)(random.nextInt() % 257))*0.1111f;
+ tick_per_plane(i);
+ if (isSuspended()) repaint();
+ return;
+ }
+ }
+ }
+
+ private void remove_plane()
+ {
+ for (int i = MAX_PLANES - 1; i >= 0; i--)
+ {
+ if (planes[i].speed != 0.0f)
+ {
+ planes[i].speed = 0.0f;
+ if (isSuspended()) repaint();
+ return;
+ }
+ }
+ }
+
+ private void tick()
+ {
+ for (int i = 0; i < MAX_PLANES; i++)
+ {
+ if (planes[i].speed != 0.0f)
+ tick_per_plane(i);
+ }
+ }
+ }
+}
diff --git a/demos/RonsDemos/glutplane_plugin13.html b/demos/RonsDemos/glutplane_plugin13.html
new file mode 100644
index 0000000..c0d6353
--- /dev/null
+++ b/demos/RonsDemos/glutplane_plugin13.html
@@ -0,0 +1,50 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Glutplane by Mark J. Kilgard; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Glutplane applet
+<br>Originially written by Mark J. Kilgard
+<br>Ported to Java by Ron Cemer
+<br>Right-click within the window for a menu of commands.
+<br>While suspended, left-click within the window to render the next frame.
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "glutplane.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "glutplane.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "glutplane.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "glutplane.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/index.html b/demos/RonsDemos/index.html
new file mode 100644
index 0000000..c3005c5
--- /dev/null
+++ b/demos/RonsDemos/index.html
@@ -0,0 +1,123 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Ron Cemer & Sven Goethel">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>OpenGL Demos Ported to GL4Java</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<br>
+<p><a href="index_plugin13.html">To use the Java2 Plug-In (Java2, JRE, Plug-In 1.3), click here !</a><br>
+<br>
+!!! The original demos are ported by Ron Cemer !!! <br>
+<br>
+I have made some changes, which i described below !<br>
+<br>
+Many THANXS to Ron Cemer !!!!!!!!! <br>
+<br>
+Sven Goethel
+<hr>
+
+This page contains OpenGL demos, originally
+written in C, which have been ported to Java and
+<br>modified to use the GL4Java library.
+<p>Since the source code is readily available for these demos, they could
+serve as a great starting point
+<br>for aspiring Java applet programmers who may or may not have experience
+with OpenGL.&nbsp; You DO
+<br>need to know Java in order to understand what is going on.&nbsp; Additionally,
+I STRONGLY recommend
+<br>that you buy the "OpenGL Programmer's Guide" (often called the "Red
+Book") if you plan to do
+<br>OpenGL programming, whether for C, Java or any other language.
+<p>*** YOU MUST INSTALL THE GL4JAVA LIBRARIES BEFORE RUNNING THE DEMOS
+***
+<br>If you haven't installed the GL4Java libraries yet, go do that first,
+then come back here and enjoy!
+<p>Here are the demos:
+<p>&nbsp;<a href="renormal.html">Renormal, originally by Brian Paul</a>
+: a sphere that grows and shrinks; demonstrates how to use auto-normalization.
+<br>&nbsp;<a href="gears.html">Gears, originally by Brian Paul</a> : three
+animated gears; user can rotate the scene using the mouse.
+<br>&nbsp;<a href="texobj.html">Texobj, originally by Brian Paul</a> :
+two animated, texture-mapped squares.
+<br>&nbsp;<a href="reflect.html">Reflect, originally by Brian Paul</a>
+: rotating, textured, reflective platform with hovering objects.
+<br>&nbsp;<a href="star.html">Star, originally by Silicon Graphics</a>
+: particle animation of stars flying toward the viewer.
+<br>&nbsp;<a href="movelight.html">Movelight, originally by Silicon Graphics</a>
+: interactive directional lighting demonstration.
+<br>&nbsp;<a href="molehill.html">Molehill, author unknown</a>
+: shiny nurbs/evaluators example.
+<br>&nbsp;<a href="fog.html">Fog, originally by Silicon Graphics</a>
+: red spheres fading into a fog background.
+<br>&nbsp;<a href="surface.html">Surface, originally by Silicon Graphics</a>
+: NURBS surface demo.
+<br>&nbsp;<a href="moth.html">Moth, originally by Robert Doyle</a>
+: simulation of a moth flying around a light.
+<br>&nbsp;<a href="shadowvol.html">Shadowvol, originally by Tom McReynolds, SGI</a>
+: demonstrates the use of shadow volumes.
+<br>&nbsp;<a href="softshadow.html">Softshadow, originally by Tom McReynolds, SGI</a>
+: demonstrates use of the accumulation buffer for soft shadows.
+<br>&nbsp;<a href="material.html">Material, originally by Silicon Graphics</a>
+: demonstrates the use of the OpenGL lighting model and materials.
+<br>&nbsp;<a href="logo.html">Logo, author unknown</a>
+: 3D SGI logo with textures and user-adjustable rendering parameters.
+<br>&nbsp;<a href="glutplane.html">Glutplane, originally by Mark J. Kilgard</a>
+: Paper airplanes demo. Originally written for Mark J Kilgard's GL Utility Toolkit (GLUT).
+<br>&nbsp;<a href="spots.html">Spots, originally by Mark J. Kilgard</a>
+: Spot light demo.
+<br>&nbsp;<a href="rings.html">Rings, originally by Philip Winston</a>
+: Do a slow zoom on a bunch of rings (ala Superman III?).
+<br>&nbsp;<a href="steam.html">Steam, originally by Troy Robinette</a>
+: Miniature steam engine simulation.
+<br>&nbsp;<a href="dof.html">DOF, originally by Silicon Graphics</a>
+: Uses accumulation buffer to create an out-of-focus depth-of-field effect.
+<br>&nbsp;<a href="pointblast.html">Pointblast, originally by Mark J. Kilgard</a>
+: Particle animation demo.
+<br>&nbsp;<a href="quadric.html">Quadric, originally by Silicon Graphics</a>
+: Demonstrates the use of some of the gluQuadric* routines.
+<br>&nbsp;<a href="mipmap.html">Mipmap, originally by Silicon Graphics</a>
+: Demonstrates the use of mipmaps for texture maps.
+<br>&nbsp;<a href="teapots.html">Teapots, originally by Silicon Graphics</a>
+: Demonstrates lots of material properties.
+<br>&nbsp;<a href="texgen.html">Texgen, originally by Silicon Graphics</a>
+: Demonstrates the use of automatically generated texture coordinates.
+<br>&nbsp;<a href="polyoff.html">Polyoff, originally by Silicon Graphics</a>
+: Uses polygon offset to draw wireframe over shaded polygons without ugly "stitching" artifacts.
+<br>&nbsp;<a href="scube.html">Scube, originally by David G Yu/Mark J. Kilgard/Silicon Graphics</a>
+: Displays a spinning cube and its shadow.
+<br>&nbsp;<a href="particle.html">Particle, originally by Nate Robins</a>
+: An example of a simple particle system.
+<br>&nbsp;<a href="text3d.html">Text3d, originally by Robert J. Doyle, Jr.</a>
+: 3D animated text.
+<br>&nbsp;<a href="dinoshade.html">Dinoshade, originally by Mark J. Kilgard</a>
+: Combines texturing, reflections, and projected shadows.
+<br>&nbsp;
+<br>
+<br>
+<hr>
+I have only added a new Class, to support a simple <br>
+customizing feature to these Applets ! <br>
+<br>
+The new Class is called "gl4java.applet.SimpleGLAnimApplet1", <br>
+and it supports to customize the frame/secounds (fps) value <br>
+and the refresh technique - both for animations ! <br>
+This new Class is now part of the GL4Java distribution,
+but is added here for portability !<br>
+<br>
+I removed the endless refresh technique from Ron, <br>
+so that the more portable "repaint" technique is used as default. <br>
+You can switch this off, like the "fps-sleep" delay ... <br>
+But you should know, what you are doing, e.g. be sure to have a <br>
+native thread JVM (MS-IE, and unix JVM's runs well with it) ! <br>
+<br>
+I removed the cab-files, and the jar-files also, <br>
+because it looks too confusing and too overdriven for me. <br>
+If you use MS-IE 4.0, be sure to have the new <br>
+MS-JVM machine (build 3186) installed ! <br>
+<br>
+Sven Goethel
+</body>
+</html>
diff --git a/demos/RonsDemos/index_plugin13.html b/demos/RonsDemos/index_plugin13.html
new file mode 100644
index 0000000..e2f5095
--- /dev/null
+++ b/demos/RonsDemos/index_plugin13.html
@@ -0,0 +1,124 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Ron Cemer & Sven Goethel">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>OpenGL Demos Ported to GL4Java</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<br>&nbsp;
+<a href="../../Installer/java.policy">The Java2 (sdk, jre, plugin 1.3) policy file example to give GL4Java the necessary permissions (Click here) !</a>
+<br>&nbsp;
+<hr>
+!!! The original demos are ported by Ron Cemer !!! <br>
+<br>
+I have made some changes, which i described below !<br>
+<br>
+Many THANXS to Ron Cemer !!!!!!!!! <br>
+<br>
+Sven Goethel
+<hr>
+
+This page contains OpenGL demos, originally
+written in C, which have been ported to Java and
+<br>modified to use the GL4Java library.
+<p>Since the source code is readily available for these demos, they could
+serve as a great starting point
+<br>for aspiring Java applet programmers who may or may not have experience
+with OpenGL.&nbsp; You DO
+<br>need to know Java in order to understand what is going on.&nbsp; Additionally,
+I STRONGLY recommend
+<br>that you buy the "OpenGL Programmer's Guide" (often called the "Red
+Book") if you plan to do
+<br>OpenGL programming, whether for C, Java or any other language.
+<p>*** YOU MUST INSTALL THE GL4JAVA LIBRARIES BEFORE RUNNING THE DEMOS
+***
+<br>If you haven't installed the GL4Java libraries yet, go do that first,
+then come back here and enjoy!
+<p>Here are the demos:
+<p>&nbsp;<a href="renormal_plugin13.html">Renormal, originally by Brian Paul</a>
+: a sphere that grows and shrinks; demonstrates how to use auto-normalization.
+<br>&nbsp;<a href="gears_plugin13.html">Gears, originally by Brian Paul</a> : three
+animated gears; user can rotate the scene using the mouse.
+<br>&nbsp;<a href="texobj_plugin13.html">Texobj, originally by Brian Paul</a> :
+two animated, texture-mapped squares.
+<br>&nbsp;<a href="reflect_plugin13.html">Reflect, originally by Brian Paul</a>
+: rotating, textured, reflective platform with hovering objects.
+<br>&nbsp;<a href="star_plugin13.html">Star, originally by Silicon Graphics</a>
+: particle animation of stars flying toward the viewer.
+<br>&nbsp;<a href="movelight_plugin13.html">Movelight, originally by Silicon Graphics</a>
+: interactive directional lighting demonstration.
+<br>&nbsp;<a href="molehill_plugin13.html">Molehill, author unknown</a>
+: shiny nurbs/evaluators example.
+<br>&nbsp;<a href="fog_plugin13.html">Fog, originally by Silicon Graphics</a>
+: red spheres fading into a fog background.
+<br>&nbsp;<a href="surface_plugin13.html">Surface, originally by Silicon Graphics</a>
+: NURBS surface demo.
+<br>&nbsp;<a href="moth_plugin13.html">Moth, originally by Robert Doyle</a>
+: simulation of a moth flying around a light.
+<br>&nbsp;<a href="shadowvol_plugin13.html">Shadowvol, originally by Tom McReynolds, SGI</a>
+: demonstrates the use of shadow volumes.
+<br>&nbsp;<a href="softshadow_plugin13.html">Softshadow, originally by Tom McReynolds, SGI</a>
+: demonstrates use of the accumulation buffer for soft shadows.
+<br>&nbsp;<a href="material_plugin13.html">Material, originally by Silicon Graphics</a>
+: demonstrates the use of the OpenGL lighting model and materials.
+<br>&nbsp;<a href="logo_plugin13.html">Logo, author unknown</a>
+: 3D SGI logo with textures and user-adjustable rendering parameters.
+<br>&nbsp;<a href="glutplane_plugin13.html">Glutplane, originally by Mark J. Kilgard</a>
+: Paper airplanes demo. Originally written for Mark J Kilgard's GL Utility Toolkit (GLUT).
+<br>&nbsp;<a href="spots_plugin13.html">Spots, originally by Mark J. Kilgard</a>
+: Spot light demo.
+<br>&nbsp;<a href="rings_plugin13.html">Rings, originally by Philip Winston</a>
+: Do a slow zoom on a bunch of rings (ala Superman III?).
+<br>&nbsp;<a href="steam_plugin13.html">Steam, originally by Troy Robinette</a>
+: Miniature steam engine simulation.
+<br>&nbsp;<a href="dof_plugin13.html">DOF, originally by Silicon Graphics</a>
+: Uses accumulation buffer to create an out-of-focus depth-of-field effect.
+<br>&nbsp;<a href="pointblast_plugin13.html">Pointblast, originally by Mark J. Kilgard</a>
+: Particle animation demo.
+<br>&nbsp;<a href="quadric_plugin13.html">Quadric, originally by Silicon Graphics</a>
+: Demonstrates the use of some of the gluQuadric* routines.
+<br>&nbsp;<a href="mipmap_plugin13.html">Mipmap, originally by Silicon Graphics</a>
+: Demonstrates the use of mipmaps for texture maps.
+<br>&nbsp;<a href="teapots_plugin13.html">Teapots, originally by Silicon Graphics</a>
+: Demonstrates lots of material properties.
+<br>&nbsp;<a href="texgen_plugin13.html">Texgen, originally by Silicon Graphics</a>
+: Demonstrates the use of automatically generated texture coordinates.
+<br>&nbsp;<a href="polyoff_plugin13.html">Polyoff, originally by Silicon Graphics</a>
+: Uses polygon offset to draw wireframe over shaded polygons without ugly "stitching" artifacts.
+<br>&nbsp;<a href="scube_plugin13.html">Scube, originally by David G Yu/Mark J. Kilgard/Silicon Graphics</a>
+: Displays a spinning cube and its shadow.
+<br>&nbsp;<a href="particle_plugin13.html">Particle, originally by Nate Robins</a>
+: An example of a simple particle system.
+<br>&nbsp;<a href="text3d_plugin13.html">Text3d, originally by Robert J. Doyle, Jr.</a>
+: 3D animated text.
+<br>&nbsp;<a href="dinoshade_plugin13.html">Dinoshade, originally by Mark J. Kilgard</a>
+: Combines texturing, reflections, and projected shadows.
+<br>&nbsp;
+<br>
+<br>
+<hr>
+I have only added a new Class, to support a simple <br>
+customizing feature to these Applets ! <br>
+<br>
+The new Class is called "gl4java.applet.SimpleGLAnimApplet1", <br>
+and it supports to customize the frame/secounds (fps) value <br>
+and the refresh technique - both for animations ! <br>
+This new Class is now part of the GL4Java distribution,
+but is added here for portability !<br>
+<br>
+I removed the endless refresh technique from Ron, <br>
+so that the more portable "repaint" technique is used as default. <br>
+You can switch this off, like the "fps-sleep" delay ... <br>
+But you should know, what you are doing, e.g. be sure to have a <br>
+native thread JVM (MS-IE, and unix JVM's runs well with it) ! <br>
+<br>
+I removed the cab-files, and the jar-files also, <br>
+because it looks too confusing and too overdriven for me. <br>
+If you use MS-IE 4.0, be sure to have the new <br>
+MS-JVM machine (build 3186) installed ! <br>
+<br>
+Sven Goethel
+</body>
+</html>
diff --git a/demos/RonsDemos/logo.html b/demos/RonsDemos/logo.html
new file mode 100644
index 0000000..98055c7
--- /dev/null
+++ b/demos/RonsDemos/logo.html
@@ -0,0 +1,45 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Logo (author unknown); ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Logo applet
+<br>Originial author unknown
+<br>Ported to Java by Ron Cemer
+<br>SEE BELOW FOR INSTRUCTIONS.
+<br>
+<applet code="logo.class" width=400 height=400>
+</applet>
+<br>Click inside the window, then press any of the following keys:
+<br>Up/down arrows: move the clipping plane in or out
+<br>Left/right arrows: rotate the model
+<br>z/Z: translate (move) the model in or out
+<br>1: render points only
+<br>2: render line drawing
+<br>3: render polygons
+<br>4: enable polygon smoothing
+<br>5: disable polygon smoothing
+<br>6: enable dithering
+<br>7: disable dithering
+<br>8: enable polygon stippling
+<br>9: disable polygon stippling
+<br>-: smooth shading
+<br>=: flat shading
+<br>q: disable culling
+<br>w: cull backfaces
+<br>e: cull frontfaces
+<br>r: frontfaces are counterclockwise (CCW)
+<br>t: frontfaces are clockwise (CW)
+<br>y/u: change stippling pattern
+<br>a: enable texturing; use brick texture
+<br>s: enable texturing; use checkered texture
+<br>d: disable texturing
+<br>f: texure modulate mode
+<br>g: texure decal mode
+<br>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/logo.java b/demos/RonsDemos/logo.java
new file mode 100644
index 0000000..0360ef8
--- /dev/null
+++ b/demos/RonsDemos/logo.java
@@ -0,0 +1,1091 @@
+/**
+ * @(#) logo.java
+ * @(#) author unknown (converted to Java by Ron Cemer)
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+public class logo extends Applet
+{
+ // [3*CHECKIMAGEWIDTH*CHECKIMAGEHEIGHT]
+ private static final byte checkImage[] =
+ {
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff,
+ (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff,
+ (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff,
+ (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff,
+ (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff,
+ (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff,
+ (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff,
+ (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff,
+ (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0x00, (byte)0x00, (byte)0x00,
+ };
+ // [4*BRICKIMAGEWIDTH*BRICKIMAGEHEIGHT]
+ private static final byte brickImage[] =
+ {
+ (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff,
+ (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff,
+ (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff,
+ (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff,
+ (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,
+ (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff,
+ (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff,
+ (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff,
+ (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff,
+ (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,
+ (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff,
+ (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff,
+ (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff,
+ (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff,
+ (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,
+ (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff, (byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff, (byte)0xa4,(byte)0x00,(byte)0x00,(byte)0xff
+ };
+ // [4*32]
+ private static final byte stipple[] =
+ {
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+ (byte)0x00, (byte)0x0F, (byte)0xF0, (byte)0x00,
+
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ };
+ // [18][2]
+ private static final float tscp[][] =
+ {
+ { 0.0f, 0.0f },
+ { 1.0f, 0.0f },
+ { 0.0f, 0.125f },
+ { 1.0f, 0.125f },
+ { 0.0f, 0.250f },
+ { 1.0f, 0.25f },
+ { 0.0f, 0.375f },
+ { 1.0f, 0.375f },
+ { 0.0f, 0.50f },
+ { 1.0f, 0.50f },
+ { 0.0f, 0.625f },
+ { 1.0f, 0.625f },
+ { 0.0f, 0.75f },
+ { 1.0f, 0.75f },
+ { 0.0f, 0.875f },
+ { 1.0f, 0.875f },
+ { 0.0f, 1.0f },
+ { 1.0f, 1.0f }
+ };
+ // [18][3]
+ private static final float scp[][] =
+ {
+ { 1.000000f, 0.000000f, 0.000000f },
+ { 1.000000f, 0.000000f, 5.000000f },
+ { 0.707107f, 0.707107f, 0.000000f },
+ { 0.707107f, 0.707107f, 5.000000f },
+ { 0.000000f, 1.000000f, 0.000000f },
+ { 0.000000f, 1.000000f, 5.000000f },
+ { -0.707107f, 0.707107f, 0.000000f },
+ { -0.707107f, 0.707107f, 5.000000f },
+ { -1.000000f, 0.000000f, 0.000000f },
+ { -1.000000f, 0.000000f, 5.000000f },
+ { -0.707107f, -0.707107f, 0.000000f },
+ { -0.707107f, -0.707107f, 5.000000f },
+ { 0.000000f, -1.000000f, 0.000000f },
+ { 0.000000f, -1.000000f, 5.000000f },
+ { 0.707107f, -0.707107f, 0.000000f },
+ { 0.707107f, -0.707107f, 5.000000f },
+ { 1.000000f, 0.000000f, 0.000000f },
+ { 1.000000f, 0.000000f, 5.000000f }
+ };
+ // [18][3]
+ private static final float dcp[][] =
+ {
+ { 1.000000f, 0.000000f, 0.000000f },
+ { 1.000000f, 0.000000f, 7.000000f },
+ { 0.707107f, 0.707107f, 0.000000f },
+ { 0.707107f, 0.707107f, 7.000000f },
+ { 0.000000f, 1.000000f, 0.000000f },
+ { 0.000000f, 1.000000f, 7.000000f },
+ { -0.707107f, 0.707107f, 0.000000f },
+ { -0.707107f, 0.707107f, 7.000000f },
+ { -1.000000f, 0.000000f, 0.000000f },
+ { -1.000000f, 0.000000f, 7.000000f },
+ { -0.707107f, -0.707107f, 0.000000f },
+ { -0.707107f, -0.707107f, 7.000000f },
+ { 0.000000f, -1.000000f, 0.000000f },
+ { 0.000000f, -1.000000f, 7.000000f },
+ { 0.707107f, -0.707107f, 0.000000f },
+ { 0.707107f, -0.707107f, 7.000000f },
+ { 1.000000f, 0.000000f, 0.000000f },
+ { 1.000000f, 0.000000f, 7.000000f }
+ };
+ // [7][9][3]
+ private static final float ep[][][] =
+ {
+ {
+ { 1.000000f, 0.000000f, 0.000000f },
+ { 0.707107f, 0.707107f, 0.000000f },
+ { 0.000000f, 1.000000f, 0.000000f },
+ { -0.707107f, 0.707107f, 0.000000f },
+ { -1.000000f, 0.000000f, 0.000000f },
+ { -0.707107f, -0.707107f, 0.000000f },
+ { 0.000000f, -1.000000f, 0.000000f },
+ { 0.707107f, -0.707107f, 0.000000f },
+ { 1.000000f, 0.000000f, 0.000000f }
+ },
+ {
+ { 1.000000f, 0.034074f, 0.258819f },
+ { 0.707107f, 0.717087f, 0.075806f },
+ { 0.000000f, 1.000000f, 0.000000f },
+ { -0.707107f, 0.717087f, 0.075806f },
+ { -1.000000f, 0.034074f, 0.258819f },
+ { -0.707107f, -0.648939f, 0.441832f },
+ { 0.000000f, -0.931852f, 0.517638f },
+ { 0.707107f, -0.648939f, 0.441832f },
+ { 1.000000f, 0.034074f, 0.258819f }
+ },
+ {
+ { 1.000000f, 0.133975f, 0.500000f },
+ { 0.707107f, 0.746347f, 0.146447f },
+ { 0.000000f, 1.000000f, 0.000000f },
+ { -0.707107f, 0.746347f, 0.146447f },
+ { -1.000000f, 0.133975f, 0.500000f },
+ { -0.707107f, -0.478398f, 0.853553f },
+ { 0.000000f, -0.732051f, 1.000000f },
+ { 0.707107f, -0.478398f, 0.853553f },
+ { 1.000000f, 0.133975f, 0.500000f }
+ },
+ {
+ { 1.000000f, 0.292893f, 0.707107f },
+ { 0.707107f, 0.792893f, 0.207107f },
+ { 0.000000f, 1.000000f, 0.000000f },
+ { -0.707107f, 0.792893f, 0.207107f },
+ { -1.000000f, 0.292893f, 0.707107f },
+ { -0.707107f, -0.207107f, 1.207107f },
+ { 0.000000f, -0.414214f, 1.414214f },
+ { 0.707107f, -0.207107f, 1.207107f },
+ { 1.000000f, 0.292893f, 0.707107f }
+ },
+ {
+ { 1.000000f, 0.500000f, 0.866025f },
+ { 0.707107f, 0.853553f, 0.253653f },
+ { 0.000000f, 1.000000f, 0.000000f },
+ { -0.707107f, 0.853553f, 0.253653f },
+ { -1.000000f, 0.500000f, 0.866025f },
+ { -0.707107f, 0.146447f, 1.478398f },
+ { 0.000000f, 0.000000f, 1.732051f },
+ { 0.707107f, 0.146447f, 1.478398f },
+ { 1.000000f, 0.500000f, 0.866025f }
+ },
+ {
+ { 1.000000f, 0.741181f, 0.965926f },
+ { 0.707107f, 0.924194f, 0.282913f },
+ { 0.000000f, 1.000000f, 0.000000f },
+ { -0.707107f, 0.924194f, 0.282913f },
+ { -1.000000f, 0.741181f, 0.965926f },
+ { -0.707107f, 0.558168f, 1.648939f },
+ { 0.000000f, 0.482362f, 1.931852f },
+ { 0.707107f, 0.558168f, 1.648939f },
+ { 1.000000f, 0.741181f, 0.965926f }
+ },
+ {
+ { 1.000000f, 1.000000f, 1.000000f },
+ { 0.707107f, 1.000000f, 0.292893f },
+ { 0.000000f, 1.000000f, 0.000000f },
+ { -0.707107f, 1.000000f, 0.292893f },
+ { -1.000000f, 1.000000f, 1.000000f },
+ { -0.707107f, 1.000000f, 1.707107f },
+ { 0.000000f, 1.000000f, 2.000000f },
+ { 0.707107f, 1.000000f, 1.707107f },
+ { 1.000000f, 1.000000f, 1.000000f }
+ }
+ };
+ // [7][9][3]
+ private static final float en[][][] =
+ {
+ {
+ { 1.000000f, 0.000000f, 0.000000f },
+ { 0.707107f, 0.707107f, 0.000000f },
+ { 0.000000f, 1.000000f, 0.000000f },
+ { -0.707107f, 0.707107f, 0.000000f },
+ { -1.000000f, 0.000000f, 0.000000f },
+ { -0.707107f, -0.707107f, 0.000000f },
+ { 0.000000f, -1.000000f, 0.000000f },
+ { 0.707107f, -0.707107f, 0.000000f },
+ { 1.000000f, 0.000000f, 0.000000f }
+ },
+ {
+ { 1.000000f, 0.000000f, 0.000000f },
+ { 0.707107f, 0.683013f, -0.183013f },
+ { 0.000000f, 0.965926f, -0.258819f },
+ { -0.707107f, 0.683013f, -0.183013f },
+ { -1.000000f, 0.000000f, 0.000000f },
+ { -0.707107f, -0.683013f, 0.183013f },
+ { 0.000000f, -0.965926f, 0.258819f },
+ { 0.707107f, -0.683013f, 0.183013f },
+ { 1.000000f, 0.000000f, 0.000000f }
+ },
+ {
+ { 1.000000f, 0.000000f, 0.000000f },
+ { 0.707107f, 0.612372f, -0.353553f },
+ { 0.000000f, 0.866025f, -0.500000f },
+ { -0.707107f, 0.612372f, -0.353553f },
+ { -1.000000f, 0.000000f, 0.000000f },
+ { -0.707107f, -0.612372f, 0.353553f },
+ { 0.000000f, -0.866025f, 0.500000f },
+ { 0.707107f, -0.612372f, 0.353553f },
+ { 1.000000f, 0.000000f, 0.000000f }
+ },
+ {
+ { 1.000000f, 0.000000f, 0.000000f },
+ { 0.000000f, 0.707107f, -0.707107f },
+ { -0.707107f, 0.500000f, -0.500000f },
+ { -1.000000f, 0.000000f, 0.000000f },
+ { -0.707107f, -0.500000f, 0.500000f },
+ { 0.000000f, -0.707107f, 0.707107f },
+ { 0.707107f, -0.500000f, 0.500000f },
+ { 1.000000f, 0.000000f, 0.000000f },
+ { 0.000000f, 0.000000f, 0.000000f } /// ???
+ },
+ {
+ { 1.000000f, 0.000000f, 0.000000f },
+ { 0.707107f, 0.353553f, -0.612372f },
+ { 0.000000f, 0.500000f, -0.866025f },
+ { -0.707107f, 0.353553f, -0.612372f },
+ { -1.000000f, 0.000000f, 0.000000f },
+ { -0.707107f, -0.353553f, 0.612372f },
+ { 0.000000f, -0.500000f, 0.866025f },
+ { 0.707107f, -0.353553f, 0.612372f },
+ { 1.000000f, 0.000000f, 0.000000f }
+ },
+ {
+ { 1.000000f, 0.000000f, 0.000000f },
+ { 0.707107f, 0.183013f, -0.683013f },
+ { 0.000000f, 0.258819f, -0.965926f },
+ { -0.707107f, 0.183013f, -0.683013f },
+ { -1.000000f, 0.000000f, 0.000000f },
+ { -0.707107f, -0.183013f, 0.683013f },
+ { 0.000000f, -0.258819f, 0.965926f },
+ { 0.707107f, -0.183013f, 0.683013f },
+ { 1.000000f, 0.000000f, 0.000000f }
+ },
+ {
+ { 1.000000f, 0.000000f, 0.000000f },
+ { 0.707107f, 0.000000f, -0.707107f },
+ { 0.000000f, 0.000000f, -1.000000f },
+ { -0.707107f, 0.000000f, -0.707107f },
+ { -1.000000f, 0.000000f, 0.000000f },
+ { -0.707107f, 0.000000f, 0.707107f },
+ { 0.000000f, 0.000000f, 1.000000f },
+ { 0.707107f, 0.000000f, 0.707107f },
+ { 1.000000f, 0.000000f, 0.000000f }
+ }
+ };
+ // [7][9][2]
+ private static final float tep[][][] =
+ {
+ {
+ { 0.0f, 0.0f },
+ { 0.125f, 0.0f },
+ { 0.25f, 0.0f },
+ { 0.375f, 0.0f },
+ { 0.5f, 0.0f },
+ { 0.625f, 0.0f },
+ { 0.75f, 0.0f },
+ { 0.875f, 0.0f },
+ { 1.0f, 0.0f }
+ },
+ {
+ { 0.0f, 0.16667f },
+ { 0.125f, 0.16667f },
+ { 0.25f, 0.16667f },
+ { 0.375f, 0.16667f },
+ { 0.5f, 0.16667f },
+ { 0.625f, 0.16667f },
+ { 0.75f, 0.16667f },
+ { 0.875f, 0.16667f },
+ { 1.0f, 0.16667f }
+ },
+ {
+ { 0.0f, 0.33333f },
+ { 0.125f, 0.33333f },
+ { 0.25f, 0.33333f },
+ { 0.375f, 0.33333f },
+ { 0.5f, 0.33333f },
+ { 0.625f, 0.33333f },
+ { 0.75f, 0.33333f },
+ { 0.875f, 0.33333f },
+ { 1.0f, 0.33333f }
+ },
+ {
+ { 0.0f, 0.5f },
+ { 0.125f, 0.5f },
+ { 0.25f, 0.5f },
+ { 0.375f, 0.5f },
+ { 0.5f, 0.5f },
+ { 0.625f, 0.5f },
+ { 0.75f, 0.5f },
+ { 0.875f, 0.5f },
+ { 1.0f, 0.5f }
+ },
+ {
+ { 0.0f, 0.6667f },
+ { 0.125f, 0.6667f },
+ { 0.25f, 0.6667f },
+ { 0.375f, 0.6667f },
+ { 0.5f, 0.6667f },
+ { 0.625f, 0.6667f },
+ { 0.75f, 0.6667f },
+ { 0.875f, 0.6667f },
+ { 1.0f, 0.6667f }
+ },
+ {
+ { 0.0f, 0.83333f },
+ { 0.125f, 0.83333f },
+ { 0.25f, 0.83333f },
+ { 0.375f, 0.83333f },
+ { 0.5f, 0.83333f },
+ { 0.625f, 0.83333f },
+ { 0.75f, 0.83333f },
+ { 0.875f, 0.83333f },
+ { 1.0f, 0.83333f }
+ },
+ {
+ { 0.0f, 1.0f },
+ { 0.125f, 1.0f },
+ { 0.25f, 1.0f },
+ { 0.375f, 1.0f },
+ { 0.5f, 1.0f },
+ { 0.625f, 1.0f },
+ { 0.75f, 1.0f },
+ { 0.875f, 1.0f },
+ { 1.0f, 1.0f }
+ }
+ };
+
+ logoCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new logoCanvas(d.width, d.height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+
+ /* Destroy the applet */
+
+
+ public void destroy()
+ {
+ canvas.cvsDispose();
+ }
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class logoCanvas extends GLCanvas
+ implements KeyListener, MouseListener
+ {
+ byte BLACK = (byte)0;
+ byte GRAY = (byte)128;
+ byte WHITE = (byte)255;
+ int CHECKIMAGEWIDTH = 8;
+ int CHECKIMAGEHEIGHT = 8;
+ int BRICKIMAGEWIDTH = 16;
+ int BRICKIMAGEHEIGHT = 16;
+ float black[] = {0.0f, 0.0f, 0.0f};
+ float white[] = {1.0f, 1.0f, 1.0f};
+ float gray[] = {0.5f, 0.5f, 0.5f};
+ float blue[] = {0.0f, 0.0f, 1.0f};
+ int colorIndexes[] = {0, 200, 255};
+ double plane[] = {1.0f, 0.0f, -1.0f, 12.0f};
+ float yRotation = 30.0f;
+ float zTranslation = -15.0f;
+ int singleCylinder;
+ int doubleCylinder;
+ int elbow, logo;
+ byte[] image = checkImage;
+ int imageHeight = CHECKIMAGEHEIGHT;
+ int imageWidth = CHECKIMAGEWIDTH;
+ float decal[] = { (float)GL_DECAL };
+ float modulate[] = { (float)GL_MODULATE };
+ float repeat[] = { (float)GL_REPEAT };
+ float nearest[] = { (float)GL_NEAREST };
+
+ public logoCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ float ambient[] = {0.1f, 0.1f, 0.1f, 1.0f};
+ float diffuse[] = {0.5f, 1.0f, 1.0f, 1.0f};
+ float position[] = {90.0f, 90.0f, 150.0f, 0.0f};
+ float front_mat_shininess[] = {30.0f};
+ float front_mat_specular[] = {0.2f, 0.2f, 0.2f, 1.0f};
+ float front_mat_diffuse[] = {0.5f, 0.28f, 0.38f, 1.0f};
+ float back_mat_shininess[] = {50.0f};
+ float back_mat_specular[] = {0.5f, 0.5f, 0.2f, 1.0f};
+ float back_mat_diffuse[] = {1.0f, 1.0f, 0.2f, 1.0f};
+ float lmodel_ambient[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float lmodel_twoside[] = {(float)1.0};
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ gl.glFrontFace(GL_CW);
+
+ gl.glEnable(GL_DEPTH_TEST);
+
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ gl.glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, position);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
+ gl.glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
+ gl.glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
+ gl.glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
+
+ gl.glEnable(GL_CLIP_PLANE0);
+
+ gl.glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, modulate);
+ gl.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
+ gl.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
+ gl.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
+ gl.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,
+ 0,
+ 4,
+ BRICKIMAGEWIDTH,
+ BRICKIMAGEHEIGHT,
+ 0,
+ GL_RGBA,
+ GL_UNSIGNED_BYTE,
+ brickImage);
+ gl.glEnable(GL_TEXTURE_2D);
+
+ gl.glCullFace(GL_BACK);
+ gl.glEnable(GL_CULL_FACE);
+
+ BuildLists();
+
+ glj.gljCheckGL();
+
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+ public void cvsDispose()
+ {
+ System.out.println("destroy(): " + this);
+ removeKeyListener(this);
+ super.cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective(90.0f, 1.0f, 1.0f, 200.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ gl.glPushMatrix();
+
+ gl.glTranslatef(0.0f, 0.0f, zTranslation);
+ gl.glRotatef(30.0f, 1.0f, 0.0f, 0.0f);
+ gl.glRotatef(yRotation, 0.0f, 1.0f, 0.0f);
+ gl.glClipPlane(GL_CLIP_PLANE0, plane);
+ gl.glCallList(logo);
+
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ // Methods required for the implementation of KeyListener
+ public void keyPressed(KeyEvent e)
+ {
+ switch (e.getKeyCode())
+ {
+ case KeyEvent.VK_LEFT:
+ yRotation -= 0.5f;
+ repaint();
+ break;
+ case KeyEvent.VK_RIGHT:
+ yRotation += 0.5f;
+ repaint();
+ break;
+ case KeyEvent.VK_UP:
+ plane[3] -= 2.0;
+ repaint();
+ break;
+ case KeyEvent.VK_DOWN:
+ plane[3] += 2.0;
+ repaint();
+ break;
+ }
+ }
+
+ public void keyReleased(KeyEvent e)
+ {
+ }
+
+ public void keyTyped(KeyEvent e)
+ {
+ if (glj.gljMakeCurrent() == false) return;
+ boolean dorepaint = false;
+ switch ((char)e.getKeyChar())
+ {
+ case 'z':
+ zTranslation -= 1.0f;
+ dorepaint = true;
+ break;
+ case 'Z':
+ zTranslation += 1.0f;
+ dorepaint = true;
+ break;
+ case '1':
+ gl.glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
+ dorepaint = true;
+ break;
+ case '2':
+ gl.glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ dorepaint = true;
+ break;
+ case '3':
+ gl.glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ dorepaint = true;
+ break;
+ case '4':
+ gl.glEnable(GL_POLYGON_SMOOTH);
+ gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ gl.glEnable(GL_BLEND);
+ gl.glDisable(GL_DEPTH_TEST);
+ dorepaint = true;
+ break;
+ case '5':
+ gl.glDisable(GL_POLYGON_SMOOTH);
+ gl.glBlendFunc(GL_ONE, GL_ZERO);
+ gl.glDisable(GL_BLEND);
+ gl.glEnable(GL_DEPTH_TEST);
+ dorepaint = true;
+ break;
+ case '6':
+ gl.glEnable(GL_DITHER);
+ dorepaint = true;
+ break;
+ case '7':
+ gl.glDisable(GL_DITHER);
+ dorepaint = true;
+ break;
+ case '8':
+ gl.glPolygonStipple(stipple);
+ gl.glEnable(GL_POLYGON_STIPPLE);
+ dorepaint = true;
+ break;
+ case '9':
+ gl.glDisable(GL_POLYGON_STIPPLE);
+ dorepaint = true;
+ break;
+ case '-':
+ gl.glShadeModel(GL_SMOOTH);
+ dorepaint = true;
+ break;
+ case '=':
+ gl.glShadeModel(GL_FLAT);
+ dorepaint = true;
+ break;
+ case 'q':
+ gl.glDisable(GL_CULL_FACE);
+ dorepaint = true;
+ break;
+ case 'w':
+ gl.glEnable(GL_CULL_FACE);
+ gl.glCullFace(GL_BACK);
+ dorepaint = true;
+ break;
+ case 'e':
+ gl.glEnable(GL_CULL_FACE);
+ gl.glCullFace(GL_FRONT);
+ dorepaint = true;
+ break;
+ case 'r':
+ gl.glFrontFace(GL_CCW);
+ dorepaint = true;
+ break;
+ case 't':
+ gl.glFrontFace(GL_CW);
+ dorepaint = true;
+ break;
+ case 'y':
+ gl.glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ gl.glPixelStorei(GL_UNPACK_LSB_FIRST, 0);
+ gl.glPolygonStipple(stipple);
+ dorepaint = true;
+ break;
+ case 'u':
+ gl.glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ gl.glPixelStorei(GL_UNPACK_LSB_FIRST, 1);
+ gl.glPolygonStipple(stipple);
+ dorepaint = true;
+ break;
+ case 'a':
+ gl.glEnable(GL_TEXTURE_2D);
+ gl.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
+ gl.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
+ gl.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
+ gl.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,
+ 0,
+ 4,
+ BRICKIMAGEWIDTH,
+ BRICKIMAGEHEIGHT,
+ 0,
+ GL_RGBA,
+ GL_UNSIGNED_BYTE,
+ brickImage);
+ dorepaint = true;
+ break;
+ case 's':
+ gl.glEnable(GL_TEXTURE_2D);
+ gl.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
+ gl.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
+ gl.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
+ gl.glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,
+ 0,
+ 3,
+ CHECKIMAGEWIDTH,
+ CHECKIMAGEHEIGHT,
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ checkImage);
+ dorepaint = true;
+ break;
+ case 'd':
+ gl.glDisable(GL_TEXTURE_2D);
+ dorepaint = true;
+ break;
+ case 'f':
+ gl.glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, modulate);
+ dorepaint = true;
+ break;
+ case 'g':
+ gl.glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
+ dorepaint = true;
+ break;
+ }
+ glj.gljFree();
+ if (dorepaint) repaint();
+ }
+
+ private void BendForward()
+ {
+ gl.glTranslatef(0.0f, 1.0f, 0.0f);
+ gl.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
+ gl.glTranslatef(0.0f, -1.0f, 0.0f);
+ }
+
+ private void BendLeft()
+ {
+ gl.glRotatef(-90.0f, 0.0f, 0.0f, 1.0f);
+ gl.glTranslatef(0.0f, 1.0f, 0.0f);
+ gl.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
+ gl.glTranslatef(0.0f, -1.0f, 0.0f);
+ }
+
+ private void BendRight()
+ {
+ gl.glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
+ gl.glTranslatef(0.0f, 1.0f, 0.0f);
+ gl.glRotatef(90.0f, 1.0f, 0f, 0.0f);
+ gl.glTranslatef(0.0f, -1.0f, 0.0f);
+ }
+
+ private void BuildSingleCylinder()
+ {
+ gl.glNewList(singleCylinder, GL_COMPILE);
+ gl.glBegin(GL_TRIANGLE_STRIP);
+ gl.glNormal3fv(scp[0]); gl.glTexCoord2fv(tscp[0]); gl.glVertex3fv(scp[0]);
+ gl.glNormal3fv(scp[0]); gl.glTexCoord2fv(tscp[1]); gl.glVertex3fv(scp[1]);
+ gl.glNormal3fv(scp[2]); gl.glTexCoord2fv(tscp[2]); gl.glVertex3fv(scp[2]);
+ gl.glNormal3fv(scp[2]); gl.glTexCoord2fv(tscp[3]); gl.glVertex3fv(scp[3]);
+ gl.glNormal3fv(scp[4]); gl.glTexCoord2fv(tscp[4]); gl.glVertex3fv(scp[4]);
+ gl.glNormal3fv(scp[4]); gl.glTexCoord2fv(tscp[5]); gl.glVertex3fv(scp[5]);
+ gl.glNormal3fv(scp[6]); gl.glTexCoord2fv(tscp[6]); gl.glVertex3fv(scp[6]);
+ gl.glNormal3fv(scp[6]); gl.glTexCoord2fv(tscp[7]); gl.glVertex3fv(scp[7]);
+ gl.glNormal3fv(scp[8]); gl.glTexCoord2fv(tscp[8]); gl.glVertex3fv(scp[8]);
+ gl.glNormal3fv(scp[8]); gl.glTexCoord2fv(tscp[9]); gl.glVertex3fv(scp[9]);
+ gl.glNormal3fv(scp[10]); gl.glTexCoord2fv(tscp[10]); gl.glVertex3fv(scp[10]);
+ gl.glNormal3fv(scp[10]); gl.glTexCoord2fv(tscp[11]); gl.glVertex3fv(scp[11]);
+ gl.glNormal3fv(scp[12]); gl.glTexCoord2fv(tscp[12]); gl.glVertex3fv(scp[12]);
+ gl.glNormal3fv(scp[12]); gl.glTexCoord2fv(tscp[13]); gl.glVertex3fv(scp[13]);
+ gl.glNormal3fv(scp[14]); gl.glTexCoord2fv(tscp[14]); gl.glVertex3fv(scp[14]);
+ gl.glNormal3fv(scp[14]); gl.glTexCoord2fv(tscp[15]); gl.glVertex3fv(scp[15]);
+ gl.glNormal3fv(scp[16]); gl.glTexCoord2fv(tscp[16]); gl.glVertex3fv(scp[16]);
+ gl.glNormal3fv(scp[16]); gl.glTexCoord2fv(tscp[17]); gl.glVertex3fv(scp[17]);
+ gl.glEnd();
+ gl.glEndList();
+ }
+
+ private void BuildDoubleCylinder()
+ {
+ gl.glNewList(doubleCylinder, GL_COMPILE);
+ gl.glBegin(GL_TRIANGLE_STRIP);
+ gl.glNormal3fv(dcp[0]); gl.glTexCoord2fv(tscp[0]); gl.glVertex3fv(dcp[0]);
+ gl.glNormal3fv(dcp[0]); gl.glTexCoord2fv(tscp[1]); gl.glVertex3fv(dcp[1]);
+ gl.glNormal3fv(dcp[2]); gl.glTexCoord2fv(tscp[2]); gl.glVertex3fv(dcp[2]);
+ gl.glNormal3fv(dcp[2]); gl.glTexCoord2fv(tscp[3]); gl.glVertex3fv(dcp[3]);
+ gl.glNormal3fv(dcp[4]); gl.glTexCoord2fv(tscp[4]); gl.glVertex3fv(dcp[4]);
+ gl.glNormal3fv(dcp[4]); gl.glTexCoord2fv(tscp[5]); gl.glVertex3fv(dcp[5]);
+ gl.glNormal3fv(dcp[6]); gl.glTexCoord2fv(tscp[6]); gl.glVertex3fv(dcp[6]);
+ gl.glNormal3fv(dcp[6]); gl.glTexCoord2fv(tscp[7]); gl.glVertex3fv(dcp[7]);
+ gl.glNormal3fv(dcp[8]); gl.glTexCoord2fv(tscp[8]); gl.glVertex3fv(dcp[8]);
+ gl.glNormal3fv(dcp[8]); gl.glTexCoord2fv(tscp[9]); gl.glVertex3fv(dcp[9]);
+ gl.glNormal3fv(dcp[10]); gl.glTexCoord2fv(tscp[10]); gl.glVertex3fv(dcp[10]);
+ gl.glNormal3fv(dcp[10]); gl.glTexCoord2fv(tscp[11]); gl.glVertex3fv(dcp[11]);
+ gl.glNormal3fv(dcp[12]); gl.glTexCoord2fv(tscp[12]); gl.glVertex3fv(dcp[12]);
+ gl.glNormal3fv(dcp[12]); gl.glTexCoord2fv(tscp[13]); gl.glVertex3fv(dcp[13]);
+ gl.glNormal3fv(dcp[14]); gl.glTexCoord2fv(tscp[14]); gl.glVertex3fv(dcp[14]);
+ gl.glNormal3fv(dcp[14]); gl.glTexCoord2fv(tscp[15]); gl.glVertex3fv(dcp[15]);
+ gl.glNormal3fv(dcp[16]); gl.glTexCoord2fv(tscp[16]); gl.glVertex3fv(dcp[16]);
+ gl.glNormal3fv(dcp[16]); gl.glTexCoord2fv(tscp[17]); gl.glVertex3fv(dcp[17]);
+ gl.glEnd();
+ gl.glEndList();
+ }
+
+ private void BuildElbow()
+ {
+ gl.glNewList(elbow, GL_COMPILE);
+ gl.glBegin(GL_TRIANGLE_STRIP);
+ gl.glNormal3fv(en[0][0]); gl.glTexCoord2fv(tep[0][0]); gl.glVertex3fv(ep[0][0]);
+ gl.glNormal3fv(en[1][0]); gl.glTexCoord2fv(tep[1][0]); gl.glVertex3fv(ep[1][0]);
+ gl.glNormal3fv(en[0][1]); gl.glTexCoord2fv(tep[0][1]); gl.glVertex3fv(ep[0][1]);
+ gl.glNormal3fv(en[1][1]); gl.glTexCoord2fv(tep[1][1]); gl.glVertex3fv(ep[1][1]);
+ gl.glNormal3fv(en[0][2]); gl.glTexCoord2fv(tep[0][2]); gl.glVertex3fv(ep[0][2]);
+ gl.glNormal3fv(en[1][2]); gl.glTexCoord2fv(tep[1][2]); gl.glVertex3fv(ep[1][2]);
+ gl.glNormal3fv(en[0][3]); gl.glTexCoord2fv(tep[0][3]); gl.glVertex3fv(ep[0][3]);
+ gl.glNormal3fv(en[1][3]); gl.glTexCoord2fv(tep[1][3]); gl.glVertex3fv(ep[1][3]);
+ gl.glNormal3fv(en[0][4]); gl.glTexCoord2fv(tep[0][4]); gl.glVertex3fv(ep[0][4]);
+ gl.glNormal3fv(en[1][4]); gl.glTexCoord2fv(tep[1][4]); gl.glVertex3fv(ep[1][4]);
+ gl.glNormal3fv(en[0][5]); gl.glTexCoord2fv(tep[0][5]); gl.glVertex3fv(ep[0][5]);
+ gl.glNormal3fv(en[1][5]); gl.glTexCoord2fv(tep[1][5]); gl.glVertex3fv(ep[1][5]);
+ gl.glNormal3fv(en[0][6]); gl.glTexCoord2fv(tep[0][6]); gl.glVertex3fv(ep[0][6]);
+ gl.glNormal3fv(en[1][6]); gl.glTexCoord2fv(tep[1][6]); gl.glVertex3fv(ep[1][6]);
+ gl.glNormal3fv(en[0][7]); gl.glTexCoord2fv(tep[0][7]); gl.glVertex3fv(ep[0][7]);
+ gl.glNormal3fv(en[1][7]); gl.glTexCoord2fv(tep[1][7]); gl.glVertex3fv(ep[1][7]);
+ gl.glNormal3fv(en[0][8]); gl.glTexCoord2fv(tep[0][8]); gl.glVertex3fv(ep[0][8]);
+ gl.glNormal3fv(en[1][8]); gl.glTexCoord2fv(tep[1][8]); gl.glVertex3fv(ep[1][8]);
+ gl.glEnd();
+ gl.glBegin(GL_TRIANGLE_STRIP);
+ gl.glNormal3fv(en[1][0]); gl.glTexCoord2fv(tep[1][0]); gl.glVertex3fv(ep[1][0]);
+ gl.glNormal3fv(en[2][0]); gl.glTexCoord2fv(tep[2][0]); gl.glVertex3fv(ep[2][0]);
+ gl.glNormal3fv(en[1][1]); gl.glTexCoord2fv(tep[1][1]); gl.glVertex3fv(ep[1][1]);
+ gl.glNormal3fv(en[2][1]); gl.glTexCoord2fv(tep[2][1]); gl.glVertex3fv(ep[2][1]);
+ gl.glNormal3fv(en[1][2]); gl.glTexCoord2fv(tep[1][2]); gl.glVertex3fv(ep[1][2]);
+ gl.glNormal3fv(en[2][2]); gl.glTexCoord2fv(tep[2][2]); gl.glVertex3fv(ep[2][2]);
+ gl.glNormal3fv(en[1][3]); gl.glTexCoord2fv(tep[1][3]); gl.glVertex3fv(ep[1][3]);
+ gl.glNormal3fv(en[2][3]); gl.glTexCoord2fv(tep[2][3]); gl.glVertex3fv(ep[2][3]);
+ gl.glNormal3fv(en[1][4]); gl.glTexCoord2fv(tep[1][4]); gl.glVertex3fv(ep[1][4]);
+ gl.glNormal3fv(en[2][4]); gl.glTexCoord2fv(tep[2][4]); gl.glVertex3fv(ep[2][4]);
+ gl.glNormal3fv(en[1][5]); gl.glTexCoord2fv(tep[1][5]); gl.glVertex3fv(ep[1][5]);
+ gl.glNormal3fv(en[2][5]); gl.glTexCoord2fv(tep[2][5]); gl.glVertex3fv(ep[2][5]);
+ gl.glNormal3fv(en[1][6]); gl.glTexCoord2fv(tep[1][6]); gl.glVertex3fv(ep[1][6]);
+ gl.glNormal3fv(en[2][6]); gl.glTexCoord2fv(tep[2][6]); gl.glVertex3fv(ep[2][6]);
+ gl.glNormal3fv(en[1][7]); gl.glTexCoord2fv(tep[1][7]); gl.glVertex3fv(ep[1][7]);
+ gl.glNormal3fv(en[2][7]); gl.glTexCoord2fv(tep[2][7]); gl.glVertex3fv(ep[2][7]);
+ gl.glNormal3fv(en[1][8]); gl.glTexCoord2fv(tep[1][8]); gl.glVertex3fv(ep[1][8]);
+ gl.glNormal3fv(en[2][8]); gl.glTexCoord2fv(tep[2][8]); gl.glVertex3fv(ep[2][8]);
+ gl.glEnd();
+ gl.glBegin(GL_TRIANGLE_STRIP);
+ gl.glNormal3fv(en[2][0]); gl.glTexCoord2fv(tep[2][0]); gl.glVertex3fv(ep[2][0]);
+ gl.glNormal3fv(en[3][0]); gl.glTexCoord2fv(tep[3][0]); gl.glVertex3fv(ep[3][0]);
+ gl.glNormal3fv(en[2][1]); gl.glTexCoord2fv(tep[2][1]); gl.glVertex3fv(ep[2][1]);
+ gl.glNormal3fv(en[3][1]); gl.glTexCoord2fv(tep[3][1]); gl.glVertex3fv(ep[3][1]);
+ gl.glNormal3fv(en[2][2]); gl.glTexCoord2fv(tep[2][2]); gl.glVertex3fv(ep[2][2]);
+ gl.glNormal3fv(en[3][2]); gl.glTexCoord2fv(tep[3][2]); gl.glVertex3fv(ep[3][2]);
+ gl.glNormal3fv(en[2][3]); gl.glTexCoord2fv(tep[2][3]); gl.glVertex3fv(ep[2][3]);
+ gl.glNormal3fv(en[3][3]); gl.glTexCoord2fv(tep[3][3]); gl.glVertex3fv(ep[3][3]);
+ gl.glNormal3fv(en[2][4]); gl.glTexCoord2fv(tep[2][4]); gl.glVertex3fv(ep[2][4]);
+ gl.glNormal3fv(en[3][4]); gl.glTexCoord2fv(tep[3][4]); gl.glVertex3fv(ep[3][4]);
+ gl.glNormal3fv(en[2][5]); gl.glTexCoord2fv(tep[2][5]); gl.glVertex3fv(ep[2][5]);
+ gl.glNormal3fv(en[3][5]); gl.glTexCoord2fv(tep[3][5]); gl.glVertex3fv(ep[3][5]);
+ gl.glNormal3fv(en[2][6]); gl.glTexCoord2fv(tep[2][6]); gl.glVertex3fv(ep[2][6]);
+ gl.glNormal3fv(en[3][6]); gl.glTexCoord2fv(tep[3][6]); gl.glVertex3fv(ep[3][6]);
+ gl.glNormal3fv(en[2][7]); gl.glTexCoord2fv(tep[2][7]); gl.glVertex3fv(ep[2][7]);
+ gl.glNormal3fv(en[3][7]); gl.glTexCoord2fv(tep[3][7]); gl.glVertex3fv(ep[3][7]);
+ gl.glNormal3fv(en[2][8]); gl.glTexCoord2fv(tep[2][8]); gl.glVertex3fv(ep[2][8]);
+ gl.glNormal3fv(en[3][8]); gl.glTexCoord2fv(tep[3][8]); gl.glVertex3fv(ep[3][8]);
+ gl.glEnd();
+ gl.glBegin(GL_TRIANGLE_STRIP);
+ gl.glNormal3fv(en[3][0]); gl.glTexCoord2fv(tep[3][0]); gl.glVertex3fv(ep[3][0]);
+ gl.glNormal3fv(en[4][0]); gl.glTexCoord2fv(tep[4][0]); gl.glVertex3fv(ep[4][0]);
+ gl.glNormal3fv(en[3][1]); gl.glTexCoord2fv(tep[3][1]); gl.glVertex3fv(ep[3][1]);
+ gl.glNormal3fv(en[4][1]); gl.glTexCoord2fv(tep[4][1]); gl.glVertex3fv(ep[4][1]);
+ gl.glNormal3fv(en[3][2]); gl.glTexCoord2fv(tep[3][2]); gl.glVertex3fv(ep[3][2]);
+ gl.glNormal3fv(en[4][2]); gl.glTexCoord2fv(tep[4][2]); gl.glVertex3fv(ep[4][2]);
+ gl.glNormal3fv(en[3][3]); gl.glTexCoord2fv(tep[3][3]); gl.glVertex3fv(ep[3][3]);
+ gl.glNormal3fv(en[4][3]); gl.glTexCoord2fv(tep[4][3]); gl.glVertex3fv(ep[4][3]);
+ gl.glNormal3fv(en[3][4]); gl.glTexCoord2fv(tep[3][4]); gl.glVertex3fv(ep[3][4]);
+ gl.glNormal3fv(en[4][4]); gl.glTexCoord2fv(tep[4][4]); gl.glVertex3fv(ep[4][4]);
+ gl.glNormal3fv(en[3][5]); gl.glTexCoord2fv(tep[3][5]); gl.glVertex3fv(ep[3][5]);
+ gl.glNormal3fv(en[4][5]); gl.glTexCoord2fv(tep[4][5]); gl.glVertex3fv(ep[4][5]);
+ gl.glNormal3fv(en[3][6]); gl.glTexCoord2fv(tep[3][6]); gl.glVertex3fv(ep[3][6]);
+ gl.glNormal3fv(en[4][6]); gl.glTexCoord2fv(tep[4][6]); gl.glVertex3fv(ep[4][6]);
+ gl.glNormal3fv(en[3][7]); gl.glTexCoord2fv(tep[3][7]); gl.glVertex3fv(ep[3][7]);
+ gl.glNormal3fv(en[4][7]); gl.glTexCoord2fv(tep[4][7]); gl.glVertex3fv(ep[4][7]);
+ gl.glNormal3fv(en[3][8]); gl.glTexCoord2fv(tep[3][8]); gl.glVertex3fv(ep[3][8]);
+ gl.glNormal3fv(en[4][8]); gl.glTexCoord2fv(tep[4][8]); gl.glVertex3fv(ep[4][8]);
+ gl.glEnd();
+ gl.glBegin(GL_TRIANGLE_STRIP);
+ gl.glNormal3fv(en[4][0]); gl.glTexCoord2fv(tep[4][0]); gl.glVertex3fv(ep[4][0]);
+ gl.glNormal3fv(en[5][0]); gl.glTexCoord2fv(tep[5][0]); gl.glVertex3fv(ep[5][0]);
+ gl.glNormal3fv(en[4][1]); gl.glTexCoord2fv(tep[4][1]); gl.glVertex3fv(ep[4][1]);
+ gl.glNormal3fv(en[5][1]); gl.glTexCoord2fv(tep[5][1]); gl.glVertex3fv(ep[5][1]);
+ gl.glNormal3fv(en[4][2]); gl.glTexCoord2fv(tep[4][2]); gl.glVertex3fv(ep[4][2]);
+ gl.glNormal3fv(en[5][2]); gl.glTexCoord2fv(tep[5][2]); gl.glVertex3fv(ep[5][2]);
+ gl.glNormal3fv(en[4][3]); gl.glTexCoord2fv(tep[4][3]); gl.glVertex3fv(ep[4][3]);
+ gl.glNormal3fv(en[5][3]); gl.glTexCoord2fv(tep[5][3]); gl.glVertex3fv(ep[5][3]);
+ gl.glNormal3fv(en[4][4]); gl.glTexCoord2fv(tep[4][4]); gl.glVertex3fv(ep[4][4]);
+ gl.glNormal3fv(en[5][4]); gl.glTexCoord2fv(tep[5][4]); gl.glVertex3fv(ep[5][4]);
+ gl.glNormal3fv(en[4][5]); gl.glTexCoord2fv(tep[4][5]); gl.glVertex3fv(ep[4][5]);
+ gl.glNormal3fv(en[5][5]); gl.glTexCoord2fv(tep[5][5]); gl.glVertex3fv(ep[5][5]);
+ gl.glNormal3fv(en[4][6]); gl.glTexCoord2fv(tep[4][6]); gl.glVertex3fv(ep[4][6]);
+ gl.glNormal3fv(en[5][6]); gl.glTexCoord2fv(tep[5][6]); gl.glVertex3fv(ep[5][6]);
+ gl.glNormal3fv(en[4][7]); gl.glTexCoord2fv(tep[4][7]); gl.glVertex3fv(ep[4][7]);
+ gl.glNormal3fv(en[5][7]); gl.glTexCoord2fv(tep[5][7]); gl.glVertex3fv(ep[5][7]);
+ gl.glNormal3fv(en[4][8]); gl.glTexCoord2fv(tep[4][8]); gl.glVertex3fv(ep[4][8]);
+ gl.glNormal3fv(en[5][8]); gl.glTexCoord2fv(tep[5][8]); gl.glVertex3fv(ep[5][8]);
+ gl.glEnd();
+ gl.glBegin(GL_TRIANGLE_STRIP);
+ gl.glNormal3fv(en[5][0]); gl.glTexCoord2fv(tep[5][0]); gl.glVertex3fv(ep[5][0]);
+ gl.glNormal3fv(en[6][0]); gl.glTexCoord2fv(tep[6][0]); gl.glVertex3fv(ep[6][0]);
+ gl.glNormal3fv(en[5][1]); gl.glTexCoord2fv(tep[5][1]); gl.glVertex3fv(ep[5][1]);
+ gl.glNormal3fv(en[6][1]); gl.glTexCoord2fv(tep[6][1]); gl.glVertex3fv(ep[6][1]);
+ gl.glNormal3fv(en[5][2]); gl.glTexCoord2fv(tep[5][2]); gl.glVertex3fv(ep[5][2]);
+ gl.glNormal3fv(en[6][2]); gl.glTexCoord2fv(tep[6][2]); gl.glVertex3fv(ep[6][2]);
+ gl.glNormal3fv(en[5][3]); gl.glTexCoord2fv(tep[5][3]); gl.glVertex3fv(ep[5][3]);
+ gl.glNormal3fv(en[6][3]); gl.glTexCoord2fv(tep[6][3]); gl.glVertex3fv(ep[6][3]);
+ gl.glNormal3fv(en[5][4]); gl.glTexCoord2fv(tep[5][4]); gl.glVertex3fv(ep[5][4]);
+ gl.glNormal3fv(en[6][4]); gl.glTexCoord2fv(tep[6][4]); gl.glVertex3fv(ep[6][4]);
+ gl.glNormal3fv(en[5][5]); gl.glTexCoord2fv(tep[5][5]); gl.glVertex3fv(ep[5][5]);
+ gl.glNormal3fv(en[6][5]); gl.glTexCoord2fv(tep[6][5]); gl.glVertex3fv(ep[6][5]);
+ gl.glNormal3fv(en[5][6]); gl.glTexCoord2fv(tep[5][6]); gl.glVertex3fv(ep[5][6]);
+ gl.glNormal3fv(en[6][6]); gl.glTexCoord2fv(tep[6][6]); gl.glVertex3fv(ep[6][6]);
+ gl.glNormal3fv(en[5][7]); gl.glTexCoord2fv(tep[5][7]); gl.glVertex3fv(ep[5][7]);
+ gl.glNormal3fv(en[6][7]); gl.glTexCoord2fv(tep[6][7]); gl.glVertex3fv(ep[6][7]);
+ gl.glNormal3fv(en[5][8]); gl.glTexCoord2fv(tep[5][8]); gl.glVertex3fv(ep[5][8]);
+ gl.glNormal3fv(en[6][8]); gl.glTexCoord2fv(tep[6][8]); gl.glVertex3fv(ep[6][8]);
+ gl.glEnd();
+ gl.glEndList();
+ }
+
+ private void BuildLogo()
+ {
+ gl.glNewList(logo, GL_COMPILE);
+ gl.glTranslatef(5.5f, -3.5f, 4.5f);
+ gl.glTranslatef(0.0f, 0.0f, -7.0f);
+ gl.glCallList(doubleCylinder);
+ BendForward();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -7.0f);
+ gl.glCallList(doubleCylinder);
+ BendForward();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -5.0f);
+ gl.glCallList(singleCylinder);
+ BendRight();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -7.0f);
+ gl.glCallList(doubleCylinder);
+ BendForward();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -7.0f);
+ gl.glCallList(doubleCylinder);
+ BendForward();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -5.0f);
+ gl.glCallList(singleCylinder);
+ BendLeft();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -7.0f);
+ gl.glCallList(doubleCylinder);
+ BendForward();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -7.0f);
+ gl.glCallList(doubleCylinder);
+ BendForward();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -5.0f);
+ gl.glCallList(singleCylinder);
+ BendRight();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -7.0f);
+ gl.glCallList(doubleCylinder);
+ BendForward();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -7.0f);
+ gl.glCallList(doubleCylinder);
+ BendForward();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -5.0f);
+ gl.glCallList(singleCylinder);
+ BendLeft();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -7.0f);
+ gl.glCallList(doubleCylinder);
+ BendForward();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -7.0f);
+ gl.glCallList(doubleCylinder);
+ BendForward();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -5.0f);
+ gl.glCallList(singleCylinder);
+ BendRight();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -7.0f);
+ gl.glCallList(doubleCylinder);
+ BendForward();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -7.0f);
+ gl.glCallList(doubleCylinder);
+ BendForward();
+ gl.glCallList(elbow);
+ gl.glTranslatef(0.0f, 0.0f, -5.0f);
+ gl.glCallList(singleCylinder);
+ BendLeft();
+ gl.glCallList(elbow);
+ gl.glEndList();
+ }
+
+ private void BuildLists()
+ {
+ singleCylinder = gl.glGenLists(1);
+ doubleCylinder = gl.glGenLists(1);
+ elbow = gl.glGenLists(1);
+ logo = gl.glGenLists(1);
+ BuildSingleCylinder();
+ BuildDoubleCylinder();
+ BuildElbow();
+ BuildLogo();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+ }
+}
diff --git a/demos/RonsDemos/logo_plugin13.html b/demos/RonsDemos/logo_plugin13.html
new file mode 100644
index 0000000..45fcee6
--- /dev/null
+++ b/demos/RonsDemos/logo_plugin13.html
@@ -0,0 +1,76 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Logo (author unknown); ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Logo applet
+<br>Originial author unknown
+<br>Ported to Java by Ron Cemer
+<br>SEE BELOW FOR INSTRUCTIONS.
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "logo.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "logo.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "logo.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "logo.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<br>Click inside the window, then press any of the following keys:
+<br>Up/down arrows: move the clipping plane in or out
+<br>Left/right arrows: rotate the model
+<br>z/Z: translate (move) the model in or out
+<br>1: render points only
+<br>2: render line drawing
+<br>3: render polygons
+<br>4: enable polygon smoothing
+<br>5: disable polygon smoothing
+<br>6: enable dithering
+<br>7: disable dithering
+<br>8: enable polygon stippling
+<br>9: disable polygon stippling
+<br>-: smooth shading
+<br>=: flat shading
+<br>q: disable culling
+<br>w: cull backfaces
+<br>e: cull frontfaces
+<br>r: frontfaces are counterclockwise (CCW)
+<br>t: frontfaces are clockwise (CW)
+<br>y/u: change stippling pattern
+<br>a: enable texturing; use brick texture
+<br>s: enable texturing; use checkered texture
+<br>d: disable texturing
+<br>f: texure modulate mode
+<br>g: texure decal mode
+<br>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/material.html b/demos/RonsDemos/material.html
new file mode 100644
index 0000000..b740970
--- /dev/null
+++ b/demos/RonsDemos/material.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Material by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Material applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<applet code="material.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/material.java b/demos/RonsDemos/material.java
new file mode 100644
index 0000000..2558c84
--- /dev/null
+++ b/demos/RonsDemos/material.java
@@ -0,0 +1,416 @@
+/**
+ * @(#) material.java
+ * @(#) author: Silicon Graphics (converted to Java by Ron Cemer)
+ */
+
+/*
+ * Copyright (c) 1993-1997, 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(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+
+/*
+ * This program demonstrates the use of the GL lighting model.
+ * Several objects are drawn using different material characteristics.
+ * A single light source illuminates the objects.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+public class material extends Applet
+{
+ materialCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new materialCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+
+ /* Destroy the applet */
+
+
+ public void destroy()
+ {
+ canvas.cvsDispose();
+ }
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class materialCanvas extends GLCanvas
+ {
+ public materialCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ float ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
+ float diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float position[] = { 0.0f, 3.0f, 2.0f, 0.0f };
+ float lmodel_ambient[] = { 0.4f, 0.4f, 0.4f, 1.0f };
+ float local_view[] = { 0.0f };
+
+ gl.glClearColor(0.0f, 0.1f, 0.1f, 0.0f);
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glShadeModel(GL_SMOOTH);
+
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, position);
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ gl.glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);
+
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+
+ glj.gljCheckGL();
+ }
+
+ public void cvsDispose()
+ {
+ System.out.println("destroy(): " + this);
+ super.cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ if (width <= (height * 2))
+ gl.glOrtho
+ (-6.0f,
+ 6.0f,
+ -3.0f*((float)(height*2))/(float)width,
+ 3.0f*((float)(height*2))/(float)width,
+ -10.0f,
+ 10.0f);
+ else
+ gl.glOrtho
+ (-6.0f*(float)width/((float)(height*2)),
+ 6.0f*(float)width/((float)(height*2)),
+ -3.0f,
+ 3.0f,
+ -10.0f,
+ 10.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ float no_mat[] = { 0.0f, 0.0f, 0.0f, 1.0f };
+ float mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
+ float mat_ambient_color[] = { 0.8f, 0.8f, 0.2f, 1.0f };
+ float mat_diffuse[] = { 0.1f, 0.5f, 0.8f, 1.0f };
+ float mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float no_shininess[] = { 0.0f };
+ float low_shininess[] = { 5.0f };
+ float high_shininess[] = { 100.0f };
+ float mat_emission[] = {0.3f, 0.2f, 0.2f, 0.0f};
+ int qobj;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* draw sphere in first row, first column
+ * diffuse reflection only; no ambient or specular
+ */
+ gl.glPushMatrix();
+ gl.glTranslatef (-3.75f, 3.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
+ qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,1.0f,16,16);
+ glu.gluDeleteQuadric(qobj);
+ gl.glPopMatrix();
+
+ /* draw sphere in first row, second column
+ * diffuse and specular reflection; low shininess; no ambient
+ */
+ gl.glPushMatrix();
+ gl.glTranslatef(-1.25f, 3.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
+ qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,1.0f,16,16);
+ glu.gluDeleteQuadric(qobj);
+ gl.glPopMatrix();
+
+ /* draw sphere in first row, third column
+ * diffuse and specular reflection; high shininess; no ambient
+ */
+ gl.glPushMatrix();
+ gl.glTranslatef(1.25f, 3.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
+ qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,1.0f,16,16);
+ glu.gluDeleteQuadric(qobj);
+ gl.glPopMatrix();
+
+ /* draw sphere in first row, fourth column
+ * diffuse reflection; emission; no ambient or specular reflection
+ */
+ gl.glPushMatrix();
+ gl.glTranslatef(3.75f, 3.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
+ qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,1.0f,16,16);
+ glu.gluDeleteQuadric(qobj);
+ gl.glPopMatrix();
+
+ /* draw sphere in second row, first column
+ * ambient and diffuse reflection; no specular
+ */
+ gl.glPushMatrix();
+ gl.glTranslatef(-3.75f, 0.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
+ qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,1.0f,16,16);
+ glu.gluDeleteQuadric(qobj);
+ gl.glPopMatrix();
+
+ /* draw sphere in second row, second column
+ * ambient, diffuse and specular reflection; low shininess
+ */
+ gl.glPushMatrix();
+ gl.glTranslatef(-1.25f, 0.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
+ qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,1.0f,16,16);
+ glu.gluDeleteQuadric(qobj);
+ gl.glPopMatrix();
+
+ /* draw sphere in second row, third column
+ * ambient, diffuse and specular reflection; high shininess
+ */
+ gl.glPushMatrix();
+ gl.glTranslatef(1.25f, 0.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
+ qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,1.0f,16,16);
+ glu.gluDeleteQuadric(qobj);
+ gl.glPopMatrix();
+
+ /* draw sphere in second row, fourth column
+ * ambient and diffuse reflection; emission; no specular
+ */
+ gl.glPushMatrix();
+ gl.glTranslatef(3.75f, 0.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
+ qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,1.0f,16,16);
+ glu.gluDeleteQuadric(qobj);
+ gl.glPopMatrix();
+
+ /* draw sphere in third row, first column
+ * colored ambient and diffuse reflection; no specular
+ */
+ gl.glPushMatrix();
+ gl.glTranslatef(-3.75f, -3.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
+ qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,1.0f,16,16);
+ glu.gluDeleteQuadric(qobj);
+ gl.glPopMatrix();
+
+ /* draw sphere in third row, second column
+ * colored ambient, diffuse and specular reflection; low shininess
+ */
+ gl.glPushMatrix();
+ gl.glTranslatef(-1.25f, -3.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
+ qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,1.0f,16,16);
+ glu.gluDeleteQuadric(qobj);
+ gl.glPopMatrix();
+
+ /* draw sphere in third row, third column
+ * colored ambient, diffuse and specular reflection; high shininess
+ */
+ gl.glPushMatrix();
+ gl.glTranslatef(1.25f, -3.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
+ qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,1.0f,16,16);
+ glu.gluDeleteQuadric(qobj);
+ gl.glPopMatrix();
+
+ /* draw sphere in third row, fourth column
+ * colored ambient and diffuse reflection; emission; no specular
+ */
+ gl.glPushMatrix();
+ gl.glTranslatef(3.75f, -3.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
+ qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,1.0f,16,16);
+ glu.gluDeleteQuadric(qobj);
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+ }
+}
diff --git a/demos/RonsDemos/material_plugin13.html b/demos/RonsDemos/material_plugin13.html
new file mode 100644
index 0000000..07b01bb
--- /dev/null
+++ b/demos/RonsDemos/material_plugin13.html
@@ -0,0 +1,48 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Material by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Material applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "material.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "material.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "material.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "material.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/mipmap.html b/demos/RonsDemos/mipmap.html
new file mode 100644
index 0000000..e61d18e
--- /dev/null
+++ b/demos/RonsDemos/mipmap.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Mipmap by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Mipmap applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<applet code="mipmap.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/mipmap.java b/demos/RonsDemos/mipmap.java
new file mode 100644
index 0000000..7d5f233
--- /dev/null
+++ b/demos/RonsDemos/mipmap.java
@@ -0,0 +1,317 @@
+/**
+ * @(#) mipmap.java
+ * @(#) author: Silicon Graphics, Inc. (converted to Java by Ron Cemer)
+ */
+
+/*
+ * Copyright (c) 1993-1997, 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(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+
+/* mipmap.c
+ * This program demonstrates using mipmaps for texture maps.
+ * To overtly show the effect of mipmaps, each mipmap reduction
+ * level has a solidly colored, contrasting texture image.
+ * Thus, the quadrilateral which is drawn is drawn with several
+ * different colors.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+public class mipmap extends Applet
+{
+ mipmapCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new mipmapCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+
+ /* Destroy the applet */
+
+
+ public void destroy()
+ {
+ canvas.cvsDispose();
+ }
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class mipmapCanvas extends GLCanvas
+ {
+ byte mipmapImage32[] = new byte[32*32*4];
+ byte mipmapImage16[] = new byte[16*16*4];
+ byte mipmapImage8[] = new byte[8*8*4];
+ byte mipmapImage4[] = new byte[4*4*4];
+ byte mipmapImage2[] = new byte[2*2*4];
+ byte mipmapImage1[] = new byte[1*1*4];
+ int texName;
+
+ public mipmapCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glShadeModel(GL_FLAT);
+
+ gl.glTranslatef(0.0f, 0.0f, -3.6f);
+ makeImages();
+ gl.glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+ int tnbuf[] = new int[1];
+ gl.glGenTextures(1, tnbuf);
+ texName = tnbuf[0];
+ gl.glBindTexture(GL_TEXTURE_2D, texName);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ gl.glTexParameteri
+ (GL_TEXTURE_2D,
+ GL_TEXTURE_MAG_FILTER,
+ GL_NEAREST);
+ gl.glTexParameteri
+ (GL_TEXTURE_2D,
+ GL_TEXTURE_MIN_FILTER,
+ GL_NEAREST_MIPMAP_NEAREST);
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,
+ 0,
+ GL_RGBA,
+ 32,
+ 32,
+ 0,
+ GL_RGBA,
+ GL_UNSIGNED_BYTE,
+ mipmapImage32);
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,
+ 1,
+ GL_RGBA,
+ 16,
+ 16,
+ 0,
+ GL_RGBA,
+ GL_UNSIGNED_BYTE,
+ mipmapImage16);
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,
+ 2,
+ GL_RGBA,
+ 8,
+ 8,
+ 0,
+ GL_RGBA,
+ GL_UNSIGNED_BYTE,
+ mipmapImage8);
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,
+ 3,
+ GL_RGBA,
+ 4,
+ 4,
+ 0,
+ GL_RGBA,
+ GL_UNSIGNED_BYTE,
+ mipmapImage4);
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,
+ 4,
+ GL_RGBA,
+ 2,
+ 2,
+ 0,
+ GL_RGBA,
+ GL_UNSIGNED_BYTE,
+ mipmapImage2);
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,
+ 5,
+ GL_RGBA,
+ 1,
+ 1,
+ 0,
+ GL_RGBA,
+ GL_UNSIGNED_BYTE,
+ mipmapImage1);
+
+ gl.glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+ gl.glEnable(GL_TEXTURE_2D);
+
+ glj.gljCheckGL();
+ }
+
+ public void cvsDispose()
+ {
+ System.out.println("destroy(): " + this);
+ super.cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective(60.0f,(float)width/(float)height,1.0f,30000.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gl.glBindTexture(GL_TEXTURE_2D, texName);
+ gl.glBegin(GL_QUADS);
+ gl.glTexCoord2f(0.0f,0.0f); gl.glVertex3f(-2.0f,-1.0f,0.0f);
+ gl.glTexCoord2f(0.0f,8.0f); gl.glVertex3f(-2.0f,1.0f,0.0f);
+ gl.glTexCoord2f(8.0f,8.0f); gl.glVertex3f(2000.0f,1.0f,-6000.0f);
+ gl.glTexCoord2f(8.0f,0.0f); gl.glVertex3f(2000.0f,-1.0f,-6000.0f);
+ gl.glEnd();
+ gl.glFlush();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ private void makeImages()
+ {
+ int i, j, idx;
+
+ for (idx = i = 0; i < 32; i++)
+ {
+ for (j = 0; j < 32; j++)
+ {
+ mipmapImage32[idx++] = (byte)255;
+ mipmapImage32[idx++] = (byte)255;
+ mipmapImage32[idx++] = (byte)0;
+ mipmapImage32[idx++] = (byte)255;
+ }
+ }
+ for (idx = i = 0; i < 16; i++)
+ {
+ for (j = 0; j < 16; j++)
+ {
+ mipmapImage16[idx++] = (byte)255;
+ mipmapImage16[idx++] = (byte)0;
+ mipmapImage16[idx++] = (byte)255;
+ mipmapImage16[idx++] = (byte)255;
+ }
+ }
+ for (idx = i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ mipmapImage8[idx++] = (byte)255;
+ mipmapImage8[idx++] = (byte)0;
+ mipmapImage8[idx++] = (byte)0;
+ mipmapImage8[idx++] = (byte)255;
+ }
+ }
+ for (idx = i = 0; i < 4; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ mipmapImage4[idx++] = (byte)0;
+ mipmapImage4[idx++] = (byte)255;
+ mipmapImage4[idx++] = (byte)0;
+ mipmapImage4[idx++] = (byte)255;
+ }
+ }
+ for (idx = i = 0; i < 2; i++)
+ {
+ for (j = 0; j < 2; j++)
+ {
+ mipmapImage2[idx++] = (byte)0;
+ mipmapImage2[idx++] = (byte)0;
+ mipmapImage2[idx++] = (byte)255;
+ mipmapImage2[idx++] = (byte)255;
+ }
+ }
+ mipmapImage1[0] = (byte)255;
+ mipmapImage1[1] = (byte)255;
+ mipmapImage1[2] = (byte)255;
+ mipmapImage1[3] = (byte)255;
+ }
+ }
+}
diff --git a/demos/RonsDemos/mipmap_plugin13.html b/demos/RonsDemos/mipmap_plugin13.html
new file mode 100644
index 0000000..f197e77
--- /dev/null
+++ b/demos/RonsDemos/mipmap_plugin13.html
@@ -0,0 +1,48 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Mipmap by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Mipmap applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "mipmap.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "mipmap.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "mipmap.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "mipmap.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/molehill.html b/demos/RonsDemos/molehill.html
new file mode 100644
index 0000000..361f5b1
--- /dev/null
+++ b/demos/RonsDemos/molehill.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Molehill by unknown author; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Molehill applet
+<br>Originial author unknown
+<br>Ported to Java by Ron Cemer
+<br>
+<applet code="molehill.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/molehill.java b/demos/RonsDemos/molehill.java
new file mode 100644
index 0000000..8dbe12e
--- /dev/null
+++ b/demos/RonsDemos/molehill.java
@@ -0,0 +1,286 @@
+/**
+ * @(#) molehill.java
+ * @(#) author: unknown (converted to Java by Ron Cemer)
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+public class molehill extends Applet
+{
+ molehillCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new molehillCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+
+ /* Destroy the applet */
+
+
+ public void destroy()
+ {
+ canvas.cvsDispose();
+ }
+
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("molehill");
+
+ molehill applet = new molehill();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+ /* Local GLCanvas extension class */
+
+
+ private class molehillCanvas extends GLCanvas
+ {
+ float mat_red_diffuse[] = { 0.7f, 0.0f, 0.1f, 1.0f };
+ float mat_green_diffuse[] = { 0.0f, 0.7f, 0.1f, 1.0f };
+ float mat_blue_diffuse[] = { 0.0f, 0.1f, 0.7f, 1.0f };
+ float mat_yellow_diffuse[] = { 0.7f, 0.8f, 0.1f, 1.0f };
+ float mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float mat_shininess[] = { 100.0f };
+ float knots[] = { 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f };
+ float pts1[] = new float[4*4*3];
+ float pts2[] = new float[4*4*3];
+ float pts3[] = new float[4*4*3];
+ float pts4[] = new float[4*4*3];
+ int nurb;
+ int u, v;
+
+ public molehillCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glEnable(GL_AUTO_NORMAL);
+ gl.glEnable(GL_NORMALIZE);
+ nurb = glu.gluNewNurbsRenderer();
+ glu.gluNurbsProperty(nurb, GLU_SAMPLING_TOLERANCE, 25.0f);
+ glu.gluNurbsProperty(nurb, GLU_DISPLAY_MODE, GLU_FILL);
+
+ /* Build control points for NURBS mole hills. */
+ for(u=0; u<4; u++)
+ {
+ for(v=0; v<4; v++)
+ {
+ /* Red. */
+ pts1[(u*12)+(v*3)+0] = 2.0f*((float)u);
+ pts1[(u*12)+(v*3)+1] = 2.0f*((float)v);
+ if((u==1 || u == 2) && (v == 1 || v == 2))
+ pts1[(u*12)+(v*3)+2] = 6.0f; /* Stretch up middle. */
+ else
+ pts1[(u*12)+(v*3)+2] = 0.0f;
+
+ /* Green. */
+ pts2[(u*12)+(v*3)+0] = 2.0f*((float)u - 3.0f);
+ pts2[(u*12)+(v*3)+1] = 2.0f*((float)v - 3.0f);
+ if((u==1 || u == 2) && (v == 1 || v == 2))
+ if(u == 1 && v == 1)
+ pts2[(u*12)+(v*3)+2] = 15.0f; /* Pull hard on single middle square. */
+ else
+ pts2[(u*12)+(v*3)+2] = -2.0f; /* Push down on other middle squares. */
+ else
+ pts2[(u*12)+(v*3)+2] = 0.0f;
+
+ /* Blue. */
+ pts3[(u*12)+(v*3)+0] = 2.0f*((float)u - 3.0f);
+ pts3[(u*12)+(v*3)+1] = 2.0f*((float)v);
+ if((u==1 || u == 2) && (v == 1 || v == 2))
+ if(u == 1 && v == 2)
+ pts3[(u*12)+(v*3)+2] = 11.0f; /* Pull up on single middple square. */
+ else
+ pts3[(u*12)+(v*3)+2] = 2.0f; /* Pull up slightly on other middle squares. */
+ else
+ pts3[(u*12)+(v*3)+2] = 0.0f;
+
+ /* Yellow. */
+ pts4[(u*12)+(v*3)+0] = 2.0f*((float)u);
+ pts4[(u*12)+(v*3)+1] = 2.0f*((float)v - 3.0f);
+ if((u==1 || u == 2 || u == 3) && (v == 1 || v == 2))
+ if(v == 1)
+ pts4[(u*12)+(v*3)+2] = -2.0f; /* Push down front middle and right squares. */
+ else
+ pts4[(u*12)+(v*3)+2] = 5.0f; /* Pull up back middle and right squares. */
+ else
+ pts4[(u*12)+(v*3)+2] = 0.0f;
+ }
+ }
+
+ /* Stretch up red's far right corner. */
+ pts1[(3*12)+(3*3)+2] = 6;
+ /* Pull down green's near left corner a little. */
+ pts2[(0*12)+(0*3)+2] = -2;
+ /* Turn up meeting of four corners. */
+ pts1[(0*12)+(0*3)+2] = 1;
+ pts2[(3*12)+(3*3)+2] = 1;
+ pts3[(3*12)+(0*3)+2] = 1;
+ pts4[(0*12)+(3*3)+2] = 1;
+
+ gl.glMatrixMode(GL_PROJECTION);
+ glu.gluPerspective(55.0f, 1.0f, 2.0f, 24.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glTranslatef(0.0f, 0.0f, -15.0f);
+ gl.glRotatef(330.0f, 1.0f, 0.0f, 0.0f);
+
+ gl.glNewList(1, GL_COMPILE);
+
+ /* Render red hill. */
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_red_diffuse);
+ glu.gluBeginSurface(nurb);
+ glu.gluNurbsSurface
+ (nurb,
+ 8,
+ knots,
+ 8,
+ knots,
+ (4 * 3),
+ 3,
+ pts1,
+ 4,
+ 4,
+ GL_MAP2_VERTEX_3);
+ glu.gluEndSurface(nurb);
+
+ /* Render green hill. */
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_green_diffuse);
+ glu.gluBeginSurface(nurb);
+ glu.gluNurbsSurface
+ (nurb,
+ 8,
+ knots,
+ 8,
+ knots,
+ (4 * 3),
+ 3,
+ pts2,
+ 4,
+ 4,
+ GL_MAP2_VERTEX_3);
+ glu.gluEndSurface(nurb);
+
+ /* Render blue hill. */
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_blue_diffuse);
+ glu.gluBeginSurface(nurb);
+ glu.gluNurbsSurface
+ (nurb,
+ 8,
+ knots,
+ 8,
+ knots,
+ (4 * 3),
+ 3,
+ pts3,
+ 4,
+ 4,
+ GL_MAP2_VERTEX_3);
+ glu.gluEndSurface(nurb);
+
+ /* Render yellow hill. */
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_yellow_diffuse);
+ glu.gluBeginSurface(nurb);
+ glu.gluNurbsSurface
+ (nurb,
+ 8,
+ knots,
+ 8,
+ knots,
+ (4 * 3),
+ 3,
+ pts4,
+ 4,
+ 4,
+ GL_MAP2_VERTEX_3);
+ glu.gluEndSurface(nurb);
+
+ gl.glEndList();
+
+ glj.gljCheckGL();
+ }
+
+ public void cvsDispose()
+ {
+ System.out.println("destroy(): " + this);
+ super.cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gl.glCallList(1);
+ gl.glFlush();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+ }
+}
diff --git a/demos/RonsDemos/molehill_plugin13.html b/demos/RonsDemos/molehill_plugin13.html
new file mode 100644
index 0000000..5ce9215
--- /dev/null
+++ b/demos/RonsDemos/molehill_plugin13.html
@@ -0,0 +1,48 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Molehill by unknown author; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Molehill applet
+<br>Originial author unknown
+<br>Ported to Java by Ron Cemer
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "molehill.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "molehill.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "molehill.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "molehill.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/moth.html b/demos/RonsDemos/moth.html
new file mode 100644
index 0000000..020ab04
--- /dev/null
+++ b/demos/RonsDemos/moth.html
@@ -0,0 +1,19 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Moth by Robert Doyle; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Moth applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>Click the left mouse button within the window to pause/resume simulation.
+<br>Click the right mouse button within the window to restart simulation.
+<br>
+<applet code="moth.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/moth.java b/demos/RonsDemos/moth.java
new file mode 100644
index 0000000..c12a4a9
--- /dev/null
+++ b/demos/RonsDemos/moth.java
@@ -0,0 +1,1149 @@
+/**
+ * @(#) moth.java
+ * @(#) author: Robert Doyle (converted to Java by Ron Cemer)
+ */
+
+/*
+ "moth" by Robert Doyle, Naval Research Laboratory, Washington, DC.
+ Scene objects are built into display lists in the 'init()' method.
+ Objects are assembled and motion described in the 'display()' method.
+*/
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class moth extends SimpleGLAnimApplet1
+{
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new mothCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class mothCanvas extends GLAnimCanvas implements MouseListener
+ {
+ float wall_color[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float wall_ambient[] = {0.5f, 0.5f, 0.5f, 1.0f};
+ float floor_color[] = {0.5f, 1.0f, 0.5f, 0.5f};
+ float column_color[] = {1.0f, 0.0f, 0.0f, 1.0f};
+ float column_ambient[] = {0.25f, 0.0f, 0.0f, 1.0f};
+
+ float panel_color[] = {0.1f, 0.1f, 1.0f, 1.0f};
+ float panel_ambient[] = {0.01f, 0.01f, 0.3f, 1.0f};
+
+ float lamp_ambient[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float lamp_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float lamp_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float lamp_post_diffuse[] = {0.8f, 0.0f, 0.0f, 1.0f};
+ float lamp_post_specular[] = {0.8f, 0.0f, 0.0f, 1.0f};
+ float lamp_post_ambient[] = {0.25f, 0.0f, 0.0f, 1.0f};
+
+ float satellite_diffuse[] = {1.0f, 0.69f, 0.0f, 1.0f};
+ float satellite_shiny[] = {128.0f};
+ float satellite_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float satellite_ambient[] = {0.37f, 0.25f, 0.0f, 1.0f};
+
+ float cube_color[] = {1.0f, 1.0f, 0.0f, 1.0f};
+ float cube_shiny[] = {99.0f};
+ float cube_specular[] = {0.9f, 0.9f, 0.9f, 1.0f};
+ float cube_ambient[] = {0.1f, 0.1f, 0.1f, 1.0f};
+
+ float shadow_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
+ float shadow_diffuse[] = {0.0f, 0.0f, 0.0f, 0.3f};
+ float shadow_shiny[] = {0.0f};
+ float shadow_specular[] = {0.0f, 0.0f, 0.0f, 1.0f};
+
+ int column = 3;
+ int ground_shadow_matrix = 16;
+ int left_wall_shadow_matrix = 17;
+ int ground = 30;
+ int left_wall = 40;
+ int right_wall = 50;
+ int four_columns = 7;
+ int two_columns = 32;
+ int satellite1 = 301;
+ int satellite2 = 302;
+ int panel1 = 303;
+ int panel2 = 304;
+
+ float default_Tx = -0.01f;
+ float default_Ty = -0.01f;
+ float default_Tz = -0.02f;
+
+ float default_mvt_x = -15.0f;
+ float default_mvt_y = -15.0f;
+ float default_mvt_z = -30.7f;
+
+ float default_mvr_d = 150.0f;
+
+ float Tx = default_Tx;
+ float Ty = default_Ty;
+ float Tz = default_Tz;
+
+ float mvt_x = default_mvt_x;
+ float mvt_y = default_mvt_y;
+ float mvt_z = default_mvt_z;
+
+ float mvr_d = default_mvr_d;
+
+ float mvr_x = 1.0f;
+ float mvr_y = -1.0f;
+ float mvr_z = -1.0f;
+
+ float Rx = 0.1f;
+
+ float cubeXform[] = new float[16];
+ float column1Xform[] = new float[16];
+ float column2Xform[] = new float[16];
+ float column3Xform[] = new float[16];
+ float four_columnsXform[] = new float[16];
+
+ float shadowMat_ground[] = new float[16];
+ float shadowMat_left[] = new float[16];
+ float shadowMat_back[] = new float[16];
+ float shadowMat_column[] = new float[16];
+ float shadowMat_right[] = new float[16];
+
+ float shadowMat1_ground[] = new float[16];
+ float shadowMat1_left[] = new float[16];
+ float shadowMat1_back[] = new float[16];
+ float shadowMat1_right[] = new float[16];
+
+ int tick = -1;
+
+ boolean moving = true;
+
+ float lightPos[] = {1.0f, 2.5f, 3.0f, 1.0f};
+
+ float light1Pos[] = {0.0f, 1.6f, -5.0f, 1.0f};
+ float light1Amb[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float light1Diff[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float light1Spec[] = {1.0f, 1.0f, 1.0f, 1.0f};
+
+ float leftPlane[] = {1.0f, 0.0f, 0.0f, 4.88f}; /* X = -4.88 */
+ float rightPlane[] = {-1.0f, 0.0f, 0.0f, 4.88f}; /* X = 4.98 */
+ float groundPlane[] = {0.0f, 1.0f, 0.0f, 1.450f}; /* Y = -1.480 */
+ float columnPlane[] = {0.0f, 0.0f, 1.0f, 0.899f}; /* Z = -0.899 */
+ float backPlane[] = {0.0f, 0.0f, 1.0f, 8.98f}; /* Z = -8.98 */
+
+ final float S = 0.7071f;
+ final float NS = 0.382683f;
+ final float NC = 0.923880f;
+
+ /* satellite body. */
+ float oct_vertices[][][] =
+ {
+ {
+ {0.0f, 0.0f, 0.0f, 1.0f},
+ {0.0f, 1.0f, 0.0f, 1.0f},
+ {-S, S, 0.0f, 1.0f}},
+
+ {
+ {0.0f, 0.0f, 0.0f, 1.0f},
+ {-S, S, 0.0f, 1.0f},
+ {-1.0f, 0.0f, 0.0f, 1.0f}},
+
+ {
+ {0.0f, 0.0f, 0.0f, 1.0f},
+ {-1.0f, 0.0f, 0.0f, 1.0f},
+ {-S, -S, 0.0f, 1.0f}},
+
+ {
+ {0.0f, 0.0f, 0.0f, 1.0f},
+ {-S, -S, 0.0f, 1.0f},
+ {0.0f, -1.0f, 0.0f, 1.0f}},
+
+ {
+ {0.0f, 0.0f, 0.0f, 1.0f},
+ {0.0f, -1.0f, 0.0f, 1.0f},
+ {S, -S, 0.0f, 1.0f}},
+
+ {
+
+ {0.0f, 0.0f, 0.0f, 1.0f},
+ {S, -S, 0.0f, 1.0f},
+ {1.0f, 0.0f, 0.0f, 1.0f}},
+
+ {
+ {0.0f, 0.0f, 0.0f, 1.0f},
+ {1.0f, 0.0f, 0.0f, 1.0f},
+ {S, S, 0.0f, 1.0f}},
+
+ {
+ {0.0f, 0.0f, 0.0f, 1.0f},
+ {S, S, 0.0f, 1.0f},
+ {0.0f, 1.0f, 0.0f, 1.0f}}
+
+ };
+
+ float oct_side_vertices[][][] =
+ {
+ {
+ {-S, S, 0.0f, 1.0f},
+ {0.0f, 1.0f, 0.0f, 1.0f},
+ {0.0f, 1.0f, -1.0f, 1.0f},
+ {-S, S, -1.0f, 1.0f}},
+
+ {
+ {-1.0f, 0.0f, 0.0f, 1.0f},
+ {-S, S, 0.0f, 1.0f},
+ {-S, S, -1.0f, 1.0f},
+ {-1.0f, 0.0f, -1.0f, 1.0f}},
+
+ {
+ {-S, -S, 0.0f, 1.0f},
+ {-1.0f, 0.0f, 0.0f, 1.0f},
+ {-1.0f, 0.0f, -1.0f, 1.0f},
+ {-S, -S, -1.0f, 1.0f}},
+
+ {
+ {0.0f, -1.0f, 0.0f, 1.0f},
+ {-S, -S, 0.0f, 1.0f},
+ {-S, -S, -1.0f, 1.0f},
+ {0.0f, -1.0f, -1.0f, 1.0f}},
+
+ {
+ {S, -S, 0.0f, 1.0f},
+ {0.0f, -1.0f, 0.0f, 1.0f},
+ {0.0f, -1.0f, -1.0f, 1.0f},
+ {S, -S, -1.0f, 1.0f}},
+
+ {
+ {1.0f, 0.0f, 0.0f, 1.0f},
+ {S, -S, 0.0f, 1.0f},
+ {S, -S, -1.0f, 1.0f},
+ {1.0f, 0.0f, -1.0f, 1.0f}},
+
+ {
+ {S, S, 0.0f, 1.0f},
+ {1.0f, 0.0f, 0.0f, 1.0f},
+ {1.0f, 0.0f, -1.0f, 1.0f},
+ {S, S, -1.0f, 1.0f}},
+
+ {
+ {0.0f, 1.0f, 0.0f, 1.0f},
+ {S, S, 0.0f, 1.0f},
+ {S, S, -1.0f, 1.0f},
+ {0.0f, 1.0f, -1.0f, 1.0f}}
+
+ };
+
+ float oct_side_normals[][] =
+ {
+ {-NS, NC, 0.0f},
+ {-NC, NS, 0.0f},
+ {-NC, -NS, 0.0f},
+ {-NS, -NC, 0.0f},
+ {NS, -NC, 0.0f},
+ {NC, -NS, 0.0f},
+ {NC, NS, 0.0f},
+ {NS, NC, 0.0f}
+ };
+
+ float cube_vertexes[][][] =
+ {
+ {
+ {-1.0f, -1.0f, -1.0f, 1.0f},
+ {-1.0f, -1.0f, 1.0f, 1.0f},
+ {-1.0f, 1.0f, 1.0f, 1.0f},
+ {-1.0f, 1.0f, -1.0f, 1.0f}},
+
+ {
+ {1.0f, 1.0f, 1.0f, 1.0f},
+ {1.0f, -1.0f, 1.0f, 1.0f},
+ {1.0f, -1.0f, -1.0f, 1.0f},
+ {1.0f, 1.0f, -1.0f, 1.0f}},
+
+ {
+ {-1.0f, -1.0f, -1.0f, 1.0f},
+ {1.0f, -1.0f, -1.0f, 1.0f},
+ {1.0f, -1.0f, 1.0f, 1.0f},
+ {-1.0f, -1.0f, 1.0f, 1.0f}},
+
+ {
+ {1.0f, 1.0f, 1.0f, 1.0f},
+ {1.0f, 1.0f, -1.0f, 1.0f},
+ {-1.0f, 1.0f, -1.0f, 1.0f},
+ {-1.0f, 1.0f, 1.0f, 1.0f}},
+
+ {
+ {-1.0f, -1.0f, -1.0f, 1.0f},
+ {-1.0f, 1.0f, -1.0f, 1.0f},
+ {1.0f, 1.0f, -1.0f, 1.0f},
+ {1.0f, -1.0f, -1.0f, 1.0f}},
+
+ {
+ {1.0f, 1.0f, 1.0f, 1.0f},
+ {-1.0f, 1.0f, 1.0f, 1.0f},
+ {-1.0f, -1.0f, 1.0f, 1.0f},
+ {1.0f, -1.0f, 1.0f, 1.0f}}
+ };
+
+ float cube_normals[][] =
+ {
+ {-1.0f, 0.0f, 0.0f, 0.0f},
+ {1.0f, 0.0f, 0.0f, 0.0f},
+ {0.0f, -1.0f, 0.0f, 0.0f},
+ {0.0f, 1.0f, 0.0f, 0.0f},
+ {0.0f, 0.0f, -1.0f, 0.0f},
+ {0.0f, 0.0f, 1.0f, 0.0f}
+ };
+
+ public mothCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ /*** Initial light position is declared in the display function ***/
+
+ gl.glLightfv(GL_LIGHT1, GL_AMBIENT, light1Amb);
+ gl.glLightfv(GL_LIGHT1, GL_DIFFUSE, light1Diff);
+ gl.glLightfv(GL_LIGHT1, GL_SPECULAR, light1Spec);
+ gl.glEnable(GL_LIGHT1);
+
+ gl.glEnable(GL_LIGHTING);
+
+ gl.glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.07f); /* try 0.07 w/ 24 bit color */
+
+ /*....Shadow Matrices For Floor, Left Wall, Back Wall, and Right Wall......*/
+
+ /* For light0 */
+
+ myShadowMatrix(groundPlane, lightPos, shadowMat_ground);
+ myShadowMatrix(leftPlane, lightPos, shadowMat_left);
+ myShadowMatrix(columnPlane, lightPos, shadowMat_column);
+ myShadowMatrix(backPlane, lightPos, shadowMat_back);
+ myShadowMatrix(rightPlane, lightPos, shadowMat_right);
+
+ /* For light1 */
+
+ myShadowMatrix(groundPlane, light1Pos, shadowMat1_ground);
+ myShadowMatrix(leftPlane, light1Pos, shadowMat1_left);
+ myShadowMatrix(backPlane, light1Pos, shadowMat1_back);
+ myShadowMatrix(rightPlane, light1Pos, shadowMat1_right);
+
+ /*sssssssssssssssss Make Satellite Body and Shadow ssssssssssssssssssssssss*/
+
+ gl.glNewList(satellite1, GL_COMPILE);
+ gl.glPushMatrix();
+ drawSatellite(satellite_diffuse, satellite_ambient, satellite_specular, satellite_shiny);
+ gl.glPopMatrix();
+ gl.glEndList();
+ gl.glNewList(satellite2, GL_COMPILE);
+ gl.glPushMatrix();
+ drawSatellite(shadow_diffuse, shadow_ambient, shadow_specular, shadow_shiny);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ /*ppppppppppppppppppppppppppp Make Solar Panels and Shadows pppppppppppppppppp*/
+
+ gl.glNewList(panel1, GL_COMPILE);
+ gl.glPushMatrix();
+ drawPanels(panel_color, panel_ambient);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(panel2, GL_COMPILE);
+ gl.glPushMatrix();
+ drawPanels(shadow_diffuse, shadow_ambient);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ /*========= Make Floor ==============*/
+
+ gl.glNewList(ground, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glPushAttrib(GL_LIGHTING_BIT);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, floor_color);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, shadow_ambient);
+ gl.glTranslatef(0.0f, -1.5f, -5.0f);
+ gl.glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
+ gl.glScalef(5.0f, 5.0f, 1.0f);
+ drawGround(); /* draw ground */
+ gl.glPopAttrib();
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ /*@@@@@@@@@@ Make Lamp Post and Lamp @@@@@@@@@@@@*/
+
+ gl.glNewList(21, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glPushAttrib(GL_LIGHTING_BIT);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, lamp_post_specular);
+ gl.glTranslatef(0.0f, -0.1f, -5.0f);
+ gl.glScalef(0.07f, 1.45f, 0.07f);
+ drawCube(lamp_post_diffuse, lamp_post_ambient); /* draw lamp post */
+ gl.glPopAttrib();
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, -1.45f, -5.0f);
+ gl.glScalef(0.3f, 0.05f, 0.3f);
+ drawCube(wall_color, cube_ambient); /* draw lamp post base */
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(22, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glPushAttrib(GL_LIGHTING_BIT);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, lamp_ambient);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, lamp_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, lamp_specular);
+ gl.glTranslatef(0.0f, 1.6f, -5.0f);
+
+ /* draw lamp */
+ int qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,0.3f,20,20);
+ glu.gluDeleteQuadric(qobj);
+
+ gl.glPopAttrib();
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ /*** Lamp post base shadow ***/
+
+ gl.glNewList(501, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glPushAttrib(GL_LIGHTING_BIT);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, shadow_ambient);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, shadow_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, shadow_specular);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, shadow_shiny);
+ gl.glTranslatef(0.0f, -1.49f, -5.0f);
+ gl.glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
+ gl.glScalef(0.7f, 0.7f, 1.0f);
+ drawOct();
+ gl.glPopAttrib();
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ /*||||||||||| Make Left Wall |||||||||||||*/
+
+ gl.glNewList(left_wall, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glPushAttrib(GL_LIGHTING_BIT);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, wall_color);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, wall_ambient);
+ gl.glTranslatef(0.0f, -1.5f, 0.0f);
+ gl.glTranslatef(0.0f, 1.2f, 0.0f);
+ gl.glTranslatef(0.0f, 0.0f, -5.0f);
+ gl.glTranslatef(-5.0f, 0.0f, 0.0f);
+ gl.glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+ gl.glScalef(4.5f, 1.2f, 1.0f);
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+ drawGround(); /* draw left wall */
+ gl.glPopAttrib();
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ /*\\\\\\\\\\\\\ Make Right Wall \\\\\\\\\\\\\\\\\\\*/
+
+ gl.glNewList(right_wall, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glPushAttrib(GL_LIGHTING_BIT);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, wall_color);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, wall_ambient);
+ gl.glTranslatef(0.0f, -1.5f, 0.0f);
+ gl.glTranslatef(0.0f, 1.2f, 0.0f);
+
+ gl.glTranslatef(0.0f, 0.0f, -5.0f);
+ gl.glTranslatef(5.0f, 0.0f, 0.0f);
+ gl.glRotatef(270.0f, 0.0f, 1.0f, 0.0f);
+
+ gl.glScalef(4.5f, 1.2f, 1.0f);
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+ drawGround(); /* draw right wall */
+ gl.glPopAttrib();
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ /*[[[[[[[[[[[ Build Columns ]]]]]]]]]]]*/
+
+ gl.glPushMatrix();
+ gl.glNewList(1, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glScalef(0.4f, 1.4f, 0.4f);
+ drawCube(column_color, column_ambient); /* draw column1 */
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(2, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, -1.45f, 0.0f);
+ gl.glScalef(0.5f, 0.1f, 0.5f);
+ drawCube(wall_color, cube_ambient); /* draw base */
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, 1.45f, 0.0f);
+ gl.glScalef(0.5f, 0.1f, 0.5f);
+ drawCube(wall_color, cube_ambient); /* draw top */
+ gl.glPopMatrix();
+ gl.glEndList();
+ gl.glPopMatrix();
+
+ gl.glNewList(column, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glCallList(1);
+ gl.glCallList(2);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ /***** Place columns at front of scene. *****/
+
+ gl.glNewList(4, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glTranslatef(-5.0f, 0.0f, -0.5f);
+ gl.glCallList(column);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(5, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glTranslatef(-1.75f, 0.0f, -0.5f);
+ gl.glCallList(column);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(6, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glTranslatef(1.75f, 0.0f, -0.5f);
+ gl.glCallList(column);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(17, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glTranslatef(5.0f, 0.0f, -0.5f);
+ gl.glCallList(column);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ /*** Get the modelview matrix once ***/
+ gl.glPushMatrix();
+ gl.glRotatef(-mvr_d, mvr_x, mvr_y, mvr_z);
+ gl.glTranslatef(-mvt_x, -mvt_y, -mvt_z);
+ gl.glGetFloatv(GL_MODELVIEW_MATRIX, four_columnsXform);
+ gl.glPopMatrix();
+
+ gl.glNewList(four_columns, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glCallList(4);
+ gl.glCallList(5);
+ gl.glCallList(6);
+ gl.glCallList(17);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ /***** Make two columns for sides of scene *****/
+
+ gl.glNewList(two_columns, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+ gl.glTranslatef(5.0f, 0.0f, -5.0f);
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, 0.0f, -0.3f);
+ gl.glCallList(column);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, 0.0f, 10.3f);
+ gl.glCallList(column);
+ gl.glPopMatrix();
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ /* .......................Make shadows .........................*/
+
+ gl.glPushMatrix();
+ gl.glNewList(8, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glScalef(0.4f, 1.4f, 0.4f);
+ drawCube(shadow_diffuse, shadow_ambient); /* draw column1 */
+ gl.glPopMatrix();
+ gl.glEndList();
+
+
+ gl.glNewList(9, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, -1.45f, 0.0f);
+ gl.glScalef(0.5f, 0.1f, 0.5f);
+ drawCube(shadow_diffuse, shadow_ambient); /* draw base. */
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, 1.45f, 0.0f);
+ gl.glScalef(0.5f, 0.1f, 0.5f);
+ drawCube(shadow_diffuse, shadow_ambient); /* draw top. */
+ gl.glPopMatrix();
+ gl.glEndList();
+ gl.glPopMatrix();
+
+ gl.glNewList(10, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glCallList(8);
+ gl.glCallList(9);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(11, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glTranslatef(-5.0f, 0.0f, -0.5f);
+ gl.glCallList(10);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(12, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glTranslatef(-1.75f, 0.0f, -0.5f);
+ gl.glCallList(10);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(13, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glTranslatef(1.75f, 0.0f, -0.5f);
+ gl.glCallList(10);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(14, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glTranslatef(5.0f, 0.0f, -0.5f);
+ gl.glCallList(10);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(15, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glCallList(11);
+ gl.glCallList(12);
+ gl.glCallList(13);
+ gl.glCallList(14);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(100, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glMultMatrixf(shadowMat_ground);
+ gl.glTranslatef(-mvt_x, -mvt_y, -mvt_z); /* correct for modelview matrix */
+ gl.glRotatef(-mvr_d, mvr_x, mvr_y, mvr_z);
+ gl.glMultMatrixf(four_columnsXform);
+ gl.glCallList(15);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(101, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glMultMatrixf(shadowMat_left);
+ gl.glTranslatef(-mvt_x, -mvt_y, -mvt_z); /* correct for modelview matrix */
+ gl.glRotatef(-mvr_d, mvr_x, mvr_y, mvr_z);
+ gl.glMultMatrixf(four_columnsXform);
+ gl.glCallList(15);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(102, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glMultMatrixf(shadowMat_back);
+ gl.glRotatef(-mvr_d, mvr_x, mvr_y, mvr_z);
+ gl.glTranslatef(-mvt_x, -mvt_y, -mvt_z); /* correct for modelview matrix */
+ gl.glMultMatrixf(four_columnsXform);
+ gl.glCallList(15);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(103, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glMultMatrixf(shadowMat_right);
+ gl.glRotatef(-mvr_d, mvr_x, mvr_y, mvr_z);
+ gl.glTranslatef(-mvt_x, -mvt_y, -mvt_z); /* correct for modelview matrix */
+ gl.glMultMatrixf(four_columnsXform);
+ gl.glCallList(15);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ glj.gljCheckGL();
+
+ addMouseListener(this);
+ }
+
+ public void doCleanup()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+
+
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+
+ gl.glFrustum(-0.9f, 0.9f, -0.9f, 0.9f, 1.0f, 35.0f);
+
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+
+ gl.glEnable(GL_NORMALIZE);
+ gl.glEnable(GL_CULL_FACE);
+ gl.glCullFace(GL_BACK); /* double your fun */
+ gl.glShadeModel(GL_SMOOTH);
+ gl.glDepthFunc(GL_LESS);
+ gl.glDepthMask(true);
+ gl.glEnable(GL_DEPTH_TEST);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ tick++;
+ if (tick >= 60) tick = 0;
+
+ gl.glPushMatrix();
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gl.glLoadIdentity();
+
+ /*@@@@@@ Rotation and Translation of Entire Scene @@@@@*/
+
+ if (mvt_x < 0.0f && mvt_y < 0.0f)
+ {
+ gl.glTranslatef(mvt_x ,mvt_y ,mvt_z );
+ mvt_x = mvt_x - Tx;
+ mvt_y = mvt_y - Ty;
+ mvt_z = mvt_z - Tz;
+
+ gl.glRotatef(mvr_d, mvr_x, mvr_y, mvr_z);
+ mvr_d = mvr_d - Rx;
+ }
+ else
+ gl.glTranslatef(0.0f, 0.0f ,mvt_z);
+
+ /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
+
+ gl.glPushMatrix();
+ gl.glLightfv(GL_LIGHT1, GL_POSITION, light1Pos);
+ gl.glPopMatrix();
+
+ /*______________________ Draw Floor _______________________*/
+
+ gl.glPushMatrix();
+ gl.glCallList(ground);
+ gl.glPopMatrix();
+
+ /*@@@@@@@@@ Draw Lamp Post amd Lamp @@@@@@@@@@*/
+
+ gl.glPushMatrix();
+ gl.glCallList(21);
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glCallList(22);
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glEnable(GL_BLEND);
+ gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ gl.glCallList(501);
+ gl.glDisable(GL_BLEND);
+ gl.glPopMatrix();
+
+ /*||||||||||||||||||| Draw Left Wall ||||||||||||||||||*/
+
+ gl.glCallList(left_wall);
+
+ /*\\\\\\\\\\\\\\\\ Draw Right Wall \\\\\\\\\\\\\\*/
+
+ gl.glCallList(right_wall);
+
+ /*[[[[[[[[[[[[[[[[[[[ Draw Columns ]]]]]]]]]]]]]]]]]]]*/
+
+ /***** Place columns at front of scene. *****/
+
+ gl.glCallList(four_columns);
+
+ /***** Place columns at back of scene. *****/
+
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, 0.0f, -9.0f);
+ gl.glCallList(four_columns);
+ gl.glPopMatrix();
+
+ /***** Place columns at centers of left and right walls. *****/
+
+ gl.glCallList(two_columns);
+
+ /************************* CUBE ***********************/
+
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, 99.0f);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, cube_specular);
+
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, 0.0f, -5.0f);
+ gl.glRotatef((360.0f / (30 * 2)) * tick, 0, 1, 0);
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, 0.2f, 2.0f);
+ gl.glRotatef((360.0f / (30 * 1)) * tick, 1, 0, 0);
+ gl.glRotatef((360.0f / (30 * 2)) * tick, 0, 1, 0);
+ gl.glRotatef((360.0f / (30 * 4)) * tick, 0, 0, 1);
+
+ gl.glGetFloatv(GL_MODELVIEW_MATRIX, cubeXform);
+
+ gl.glCallList(satellite1);
+ gl.glCallList(panel1);
+
+ gl.glPopMatrix();
+ gl.glPopMatrix();
+
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, shadow_specular);
+
+ /*................... CUBE SHADOWS .............................*/
+
+ gl.glEnable(GL_BLEND);
+ gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ gl.glPushMatrix();
+ gl.glMultMatrixf(shadowMat1_ground);
+ gl.glRotatef(-mvr_d, mvr_x, mvr_y, mvr_z);
+ gl.glTranslatef(-mvt_x, -mvt_y, -mvt_z); /* correct for modelview matrix */
+ gl.glMultMatrixf(cubeXform);
+
+
+ gl.glCallList(satellite2);
+ gl.glTranslatef(0.0f, -.040f, 0.0f);
+ gl.glCallList(panel2);
+ gl.glPopMatrix();
+
+ /* Shadow left wall only if cube is in front of left wall. */
+ if((tick*6) >= 220 && (tick*6) <= 320)
+ {
+ gl.glPushMatrix();
+ gl.glMultMatrixf(shadowMat1_left);
+ gl.glRotatef(-mvr_d, mvr_x, mvr_y, mvr_z);
+ gl.glTranslatef(-mvt_x, -mvt_y, -mvt_z); /* correct for modelview matrix */
+ gl.glMultMatrixf(cubeXform);
+ drawSatellite(shadow_diffuse, shadow_ambient, shadow_specular, shadow_shiny); /* draw left shadow */
+ drawPanels(shadow_diffuse, shadow_ambient);
+ gl.glPopMatrix();
+ }
+
+ /* Shadow back wall only if cube is in front of back wall. */
+ if((tick*6) >= 125 && (tick*6) <= 330)
+ {
+ gl.glPushMatrix();
+ gl.glMultMatrixf(shadowMat1_back);
+ gl.glRotatef(-mvr_d, mvr_x, mvr_y, mvr_z);
+ gl.glTranslatef(-mvt_x, -mvt_y, -mvt_z); /* correct for modelview matrix */
+ gl.glMultMatrixf(cubeXform);
+ drawSatellite(shadow_diffuse, shadow_ambient, shadow_specular, shadow_shiny); /* draw back wall shadow */
+ drawPanels(shadow_diffuse, shadow_ambient);
+ gl.glPopMatrix();
+ }
+
+ /* Shadow right wall only if cube is in front of right wall. */
+ if((tick*6) >= 40 && (tick*6) <= 145)
+ {
+ gl.glPushMatrix();
+ gl.glMultMatrixf(shadowMat1_right);
+ gl.glRotatef(-mvr_d, mvr_x, mvr_y, mvr_z);
+ gl.glTranslatef(-mvt_x, -mvt_y, -mvt_z); /* correct for modelview matrix */
+ gl.glMultMatrixf(cubeXform);
+ drawSatellite(shadow_diffuse, shadow_ambient, shadow_specular, shadow_shiny); /* draw right wall shadow */
+ drawPanels(shadow_diffuse, shadow_ambient);
+ gl.glPopMatrix();
+ }
+
+ gl.glDisable(GL_BLEND);
+
+ gl.glPopMatrix(); /* Clear the matrix stack */
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ //if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ Tx = default_Tx;
+ Ty = default_Ty;
+ Tz = default_Tz;
+
+ mvt_x = default_mvt_x;
+ mvt_y = default_mvt_y;
+ mvt_z = default_mvt_z;
+
+ mvr_d = default_mvr_d;
+
+ tick = -1;
+
+ setSuspended(false);
+ moving = true;
+ }
+ else
+ {
+ setSuspended(moving);
+ moving = !moving;
+ }
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ }
+ /*%%%%%%%%%%%%%%%%%%%% DRAW CUBE %%%%%%%%%%%%%%%%%%*/
+
+ private void drawCube(float color[], float ambient[])
+ {
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, color);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
+
+ for (int i = 0; i < 6; ++i)
+ {
+ gl.glNormal3fv(cube_normals[i]);
+ gl.glBegin(GL_POLYGON);
+ gl.glVertex4fv(cube_vertexes[i][0]);
+ gl.glVertex4fv(cube_vertexes[i][1]);
+ gl.glVertex4fv(cube_vertexes[i][2]);
+ gl.glVertex4fv(cube_vertexes[i][3]);
+ gl.glEnd();
+ }
+ }
+
+ /*OOOOOOOOOOO DRAW OCTOGON TOP OOOOOOOOOOOOO*/
+
+ private void drawOct()
+ {
+ for (int i = 0; i < 8; ++i)
+ {
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+ gl.glBegin(GL_TRIANGLE_FAN);
+ gl.glVertex4fv(oct_vertices[i][0]);
+ gl.glVertex4fv(oct_vertices[i][1]);
+ gl.glVertex4fv(oct_vertices[i][2]);
+ gl.glEnd();
+ }
+ }
+
+ /*oooooooooooDRAW OCTOGON SIDES ooooooooo*/
+
+ private void drawOctSides()
+ {
+ for (int i = 0; i < 8; ++i)
+ {
+ gl.glNormal3fv(oct_side_normals[i]);
+ gl.glBegin(GL_POLYGON);
+ gl.glVertex4fv(oct_side_vertices[i][0]);
+ gl.glVertex4fv(oct_side_vertices[i][1]);
+ gl.glVertex4fv(oct_side_vertices[i][2]);
+ gl.glVertex4fv(oct_side_vertices[i][3]);
+ gl.glEnd();
+ }
+ }
+
+ /*SSSSSSSSSSSSSSSS DRAW SATELLITE BODY SSSSSSSSSSSSSSSSSSS*/
+
+ private void drawSatellite(float diffuse[], float ambient[], float specular[], float shiny[])
+ {
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, shiny);
+
+ gl.glPushMatrix();
+ gl.glScalef(0.3f, 0.3f, 0.9f);
+ gl.glPushMatrix();
+ drawOctSides();
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, 0.0f, 0.0f);
+ drawOct();
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(180f, 1.0f, 0.0f, 0.0f);
+ gl.glTranslatef(0.0f, 0.0f, 1.0f);
+ drawOct();
+ gl.glPopMatrix();
+ gl.glPopMatrix();
+ }
+
+ /*PPPPPPPPPPPPPPPP DRAW SOLAR PANELS PPPPPPPPPPPP*/
+
+ private void drawPanels(float color[], float ambient[])
+ {
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, color);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
+
+ gl.glPushMatrix();
+ gl.glTranslatef(0.95f, 0.0f, -0.45f);
+ gl.glRotatef(45.0f, 1.0f, 0.0f, 0.0f);
+ gl.glScalef(0.65f, 0.20f, 0.02f);
+ drawCube(color, ambient);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glTranslatef(-0.95f, 0.0f, -0.45f);
+ gl.glRotatef(45.0f, 1.0f, 0.0f, 0.0f);
+ gl.glScalef(0.65f, 0.20f, 0.02f);
+ drawCube(color, ambient);
+ gl.glPopMatrix();
+ }
+
+ /*################ DRAW FLOOR ################*/
+
+ private void drawFloor(float f_color[], float ambient[])
+ {
+
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, f_color);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
+
+ gl.glBegin(GL_QUADS);
+ gl.glVertex3f(-1.0f, -1.0f, 0.0f);
+ gl.glVertex3f(1.0f, -1.0f, 0.0f);
+ gl.glVertex3f(1.0f, 1.0f, 0.0f);
+ gl.glVertex3f(-1.0f, 1.0f, 0.0f);
+ gl.glEnd();
+ }
+
+ /*||||||||||||||| DRAW GROUND |||||||||||||||||*/
+
+ /* Ground coordinates are in drawGround() below. Subdivision */
+ /* of triangles id done by subDivide(). */
+
+ private void subDivide(float u1[], float u2[], float u3[], int depth)
+ {
+ float u12[] = new float[3];
+ float u23[] = new float[3];
+ float u31[] = new float[3];
+
+ if (depth == 0)
+ {
+ gl.glBegin(GL_POLYGON);
+ gl.glNormal3f(0.0f, 0.0f, 1.0f); gl.glVertex3fv(u1);
+ gl.glNormal3f(0.0f, 0.0f, 1.0f); gl.glVertex3fv(u2);
+ gl.glNormal3f(0.0f, 0.0f, 1.0f); gl.glVertex3fv(u3);
+ gl.glEnd();
+ return;
+ }
+
+ for (int i = 0; i < 3; i++)
+ {
+ u12[i] = (u1[i] + u2[i]) / 2.0f;
+ u23[i] = (u2[i] + u3[i]) / 2.0f;
+ u31[i] = (u3[i] + u1[i]) / 2.0f;
+ }
+ subDivide(u1, u12, u31, depth - 1);
+ subDivide(u2, u23, u12, depth - 1);
+ subDivide(u3, u31, u23, depth - 1);
+ subDivide(u12, u23, u31, depth - 1);
+ }
+
+ private void drawGround()
+ {
+ /* Use two subdivided triangles for the unscaled 1X1 square. */
+ /* Subdivide to this depth: */
+
+ int maxdepth = 2;
+
+ /* Coordinates of first triangle: */
+
+ float u1[] = {-1.0f, -1.0f, 0.0f};
+ float u2[] = {1.0f, -1.0f, 0.0f};
+ float u3[] = {1.0f, 1.0f, 0.0f};
+
+ /* Coordinates of second triangle: */
+
+ float v1[] = {-1.0f, -1.0f, 0.0f};
+ float v2[] = {1.0f, 1.0f, 0.0f};
+ float v3[] = {-1.0f, 1.0f, 0.0f};
+
+ subDivide(u1, u2, u3, maxdepth);
+ subDivide(v1, v2, v3, maxdepth);
+ }
+
+ /* Matrix for shadow. From Mark Kilgard's "scube". */
+
+ private void myShadowMatrix(float ground[], float light[], float shadowMat[])
+ {
+ float dot;
+
+ dot =
+ ground[0] * light[0] +
+ ground[1] * light[1] +
+ ground[2] * light[2] +
+ ground[3] * light[3];
+
+ shadowMat[0] = dot - light[0] * ground[0];
+ shadowMat[4] = -light[0] * ground[1];
+ shadowMat[8] = -light[0] * ground[2];
+ shadowMat[12] = -light[0] * ground[3];
+
+ shadowMat[1] = -light[1] * ground[0];
+ shadowMat[5] = dot - light[1] * ground[1];
+ shadowMat[9] = -light[1] * ground[2];
+ shadowMat[13] = -light[1] * ground[3];
+
+ shadowMat[2] = -light[2] * ground[0];
+ shadowMat[6] = -light[2] * ground[1];
+ shadowMat[10] = dot - light[2] * ground[2];
+ shadowMat[14] = -light[2] * ground[3];
+
+ shadowMat[3] = -light[3] * ground[0];
+ shadowMat[7] = -light[3] * ground[1];
+ shadowMat[11] = -light[3] * ground[2];
+ shadowMat[15] = dot - light[3] * ground[3];
+ }
+ }
+}
diff --git a/demos/RonsDemos/moth_plugin13.html b/demos/RonsDemos/moth_plugin13.html
new file mode 100644
index 0000000..b10d99e
--- /dev/null
+++ b/demos/RonsDemos/moth_plugin13.html
@@ -0,0 +1,50 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Moth by Robert Doyle; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Moth applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>Click the left mouse button within the window to pause/resume simulation.
+<br>Click the right mouse button within the window to restart simulation.
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "moth.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "moth.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "moth.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "moth.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/movelight.html b/demos/RonsDemos/movelight.html
new file mode 100644
index 0000000..a323355
--- /dev/null
+++ b/demos/RonsDemos/movelight.html
@@ -0,0 +1,20 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Movelight by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Movelight applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<hr>Each time you click inside the window, the light source will rotate to
+<br>a new position.&nbsp;
+<br>
+<applet code="movelight.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/movelight.java b/demos/RonsDemos/movelight.java
new file mode 100644
index 0000000..bb983d9
--- /dev/null
+++ b/demos/RonsDemos/movelight.java
@@ -0,0 +1,322 @@
+/**
+ * @(#) movelight.java
+ * @(#) author: Silicon Graphics (converted to Java by Ron Cemer)
+ */
+
+/*
+ * Copyright (c) 1993-1997, 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(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+
+/*
+ * movelight.java
+ * This applet demonstrates when to issue lighting and
+ * transformation commands to render a model with a light
+ * which is moved by a modeling transformation (rotate or
+ * translate). The light position is reset after the modeling
+ * transformation is called. The eye position does not change.
+ *
+ * A torus is drawn using a grey material characteristic.
+ * A single light source illuminates the object.
+ *
+ * Interaction: pressing the left mouse button alters
+ * the modeling transformation (x rotation) by 30 degrees.
+ * The scene is then redrawn with the light in a new position.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+public class movelight extends Applet
+{
+ private static final float boxnormals[][] =
+ {
+ {-1.0f, 0.0f, 0.0f},
+ {0.0f, 1.0f, 0.0f},
+ {1.0f, 0.0f, 0.0f},
+ {0.0f, -1.0f, 0.0f},
+ {0.0f, 0.0f, 1.0f},
+ {0.0f, 0.0f, -1.0f}
+ };
+ private static final int boxfaces[][] =
+ {
+ {0, 1, 2, 3},
+ {3, 2, 6, 7},
+ {7, 6, 5, 4},
+ {4, 5, 1, 0},
+ {5, 6, 2, 1},
+ {7, 4, 0, 3}
+ };
+
+ movelightCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new movelightCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+
+ /* Destroy the applet */
+
+
+ public void destroy()
+ {
+ canvas.cvsDispose();
+ }
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class movelightCanvas extends GLCanvas implements MouseListener
+ {
+ private static final float M_PI = 3.14159265359f;
+
+ private int spin = 0;
+
+ public movelightCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ gl.glShadeModel(GL_SMOOTH);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ glj.gljCheckGL();
+
+ addMouseListener(this);
+ }
+
+ public void cvsDispose()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ super.cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective(40.0f,(float)width/(float)height,1.0f,20.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ float position[] = { 0.0f, 0.0f, 1.5f, 1.0f };
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gl.glPushMatrix();
+ glu.gluLookAt(0.0f, 0.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
+
+ gl.glPushMatrix();
+ gl.glRotated((double)spin, 1.0, 0.0, 0.0);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, position);
+
+ gl.glTranslated(0.0, 0.0, 1.5);
+ gl.glDisable(GL_LIGHTING);
+ gl.glColor3f(0.0f, 1.0f, 1.0f);
+ glutWireCube(0.1f);
+ gl.glEnable(GL_LIGHTING);
+ gl.glPopMatrix();
+
+ glutSolidTorus(0.275f, 0.85f, 8, 15);
+ gl.glPopMatrix();
+ gl.glFlush();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ // Imported from glut.
+ private void glutWireCube(float size)
+ {
+ drawBox(size, GL_LINE_LOOP);
+ }
+
+ // Imported from glut.
+ private void glutSolidTorus
+ (float innerRadius,
+ float outerRadius,
+ int nsides,
+ int rings)
+ {
+ doughnut(innerRadius, outerRadius, nsides, rings);
+ }
+
+ // Imported from glut.
+ private void drawBox(float size, int type)
+ {
+ float v[][] = new float[8][3];
+ int i;
+
+ v[0][0] = v[1][0] = v[2][0] = v[3][0] = -size / 2;
+ v[4][0] = v[5][0] = v[6][0] = v[7][0] = size / 2;
+ v[0][1] = v[1][1] = v[4][1] = v[5][1] = -size / 2;
+ v[2][1] = v[3][1] = v[6][1] = v[7][1] = size / 2;
+ v[0][2] = v[3][2] = v[4][2] = v[7][2] = -size / 2;
+ v[1][2] = v[2][2] = v[5][2] = v[6][2] = size / 2;
+
+ for (i = 5; i >= 0; i--)
+ {
+ gl.glBegin(type);
+ gl.glNormal3fv(boxnormals[i]);
+ gl.glVertex3fv(v[boxfaces[i][0]]);
+ gl.glVertex3fv(v[boxfaces[i][1]]);
+ gl.glVertex3fv(v[boxfaces[i][2]]);
+ gl.glVertex3fv(v[boxfaces[i][3]]);
+ gl.glEnd();
+ }
+ }
+
+ // Imported from glut.
+ private void doughnut(float r, float R, int nsides, int rings)
+ {
+ int i, j;
+ float theta, phi, theta1;
+ float cosTheta, sinTheta;
+ float cosTheta1, sinTheta1;
+ float ringDelta, sideDelta;
+
+ ringDelta = 2.0f * M_PI / rings;
+ sideDelta = 2.0f * M_PI / nsides;
+
+ theta = 0.0f;
+ cosTheta = 1.0f;
+ sinTheta = 0.0f;
+ for (i = rings - 1; i >= 0; i--)
+ {
+ theta1 = theta + ringDelta;
+ cosTheta1 = (float)Math.cos(theta1);
+ sinTheta1 = (float)Math.sin(theta1);
+ gl.glBegin(GL_QUAD_STRIP);
+ phi = 0.0f;
+ for (j = nsides; j >= 0; j--)
+ {
+ float cosPhi, sinPhi, dist;
+
+ phi += sideDelta;
+ cosPhi = (float)Math.cos(phi);
+ sinPhi = (float)Math.sin(phi);
+ dist = R + r * cosPhi;
+
+ gl.glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi);
+ gl.glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi);
+ gl.glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi);
+ gl.glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi);
+ }
+ gl.glEnd();
+ theta = theta1;
+ cosTheta = cosTheta1;
+ sinTheta = sinTheta1;
+ }
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ spin = (spin + 30) % 360;
+ repaint();
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ }
+ }
+}
diff --git a/demos/RonsDemos/movelight_plugin13.html b/demos/RonsDemos/movelight_plugin13.html
new file mode 100644
index 0000000..2c0d494
--- /dev/null
+++ b/demos/RonsDemos/movelight_plugin13.html
@@ -0,0 +1,51 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Movelight by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Movelight applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<hr>Each time you click inside the window, the light source will rotate to
+<br>a new position.&nbsp;
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "movelight.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "movelight.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "movelight.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "movelight.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/nonAnimApplet.skel b/demos/RonsDemos/nonAnimApplet.skel
new file mode 100644
index 0000000..a1697d2
--- /dev/null
+++ b/demos/RonsDemos/nonAnimApplet.skel
@@ -0,0 +1,120 @@
+/**
+ * Skeleton for non-animated applets (applets which redraw once each
+ * time the repaint() method is called, but do not continually animate
+ * automatically).
+ */
+
+/**
+ * @(#) [place applet name here].java
+ * @(#) author: [place author here] (converted to Java by Ron Cemer)
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+public class myapplet extends Applet
+{
+ myappletCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new myappletCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+
+ /* Destroy the applet */
+
+
+ public void destroy()
+ {
+ canvas.destroy();
+ }
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class myappletCanvas extends GLCanvas
+ {
+ public myappletCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+// Put OpenGL initialization code here.
+
+ glj.gljCheckGL();
+ }
+
+ public void destroy()
+ {
+ System.out.println("destroy(): " + this);
+
+// Put any special takedown code here.
+
+ cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+
+// Put any custom reshape code here.
+
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent(true) == false) return;
+
+// Put drawing code here.
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+ }
+}
diff --git a/demos/RonsDemos/particle.html b/demos/RonsDemos/particle.html
new file mode 100644
index 0000000..ec8231d
--- /dev/null
+++ b/demos/RonsDemos/particle.html
@@ -0,0 +1,26 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Particle by Nate Robins; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Particle applet
+<br>Originially written by Nate Robins
+<br>Ported to Java by Ron Cemer
+<br>Drag the mouse inside the window to rotate the view.
+<br>Click inside the window, then press any of the following keys:
+<br>W/w: waterfall mode
+<br>F/f: fountain mode
+<br>S/s: toggle sphere collision
+<br>L/l: toggle between points lines
+<br>P/p: increase/decrease point size
+<br>+/-: increase/decrease number of particles
+<br>R/r: reset view rotation
+<br>
+<applet code="particle.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/particle.java b/demos/RonsDemos/particle.java
new file mode 100644
index 0000000..2369b00
--- /dev/null
+++ b/demos/RonsDemos/particle.java
@@ -0,0 +1,613 @@
+/**
+ * @(#) particle.java
+ * @(#) author: Nate Robins (converted to Java by Ron Cemer)
+ */
+
+/*
+ particle
+ Nate Robins, 1997
+
+ An example of a simple particle system.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class particle extends SimpleGLAnimApplet1
+{
+ private static final int PS_WATERFALL = 0, PS_FOUNTAIN = 1;
+ private static Random random = null;
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new particleCanvas(d.width, d.height);
+ add("Center", canvas);
+ canvas.requestFocus();
+ random = new Random(System.currentTimeMillis());
+ }
+
+
+ private class PSsphere
+ {
+ protected float x, y, z;
+ protected float radius, radiussquared;
+
+ public PSsphere(float x, float y, float z, float radius)
+ {
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ this.radius = radius;
+ radiussquared = radius*radius;
+ }
+ }
+
+ private class PSparticle
+ {
+ private final float PS_GRAVITY = -9.8f;
+
+ protected float position[] = new float[3]; /* current position */
+ protected float previous[] = new float[3]; /* previous position */
+ protected float velocity[] = new float[3]; /* velocity (magnitude & direction) */
+ protected float dampening = 0.0f; /* % of energy lost on collision */
+ protected boolean alive = false; /* is this particle alive? */
+
+ public PSparticle()
+ {
+ velocity[0] = previous[0] = position[0] = 0.0f;
+ velocity[1] = previous[1] = position[1] = 0.0f;
+ velocity[2] = previous[2] = position[2] = 0.0f;
+ dampening = 0.0f;
+ alive = false;
+ }
+
+ public PSparticle(float dt, int type)
+ {
+ if (type == PS_WATERFALL)
+ {
+ velocity[0] = (random.nextFloat()-0.5f);
+ velocity[1] = 0.0f;
+ velocity[2] = 0.5f*random.nextFloat();
+ position[0] = 0.0f;
+ position[1] = 2.0f;
+ position[2] = 0.0f;
+ dampening = 0.45f*random.nextFloat();
+ }
+ else if (type == PS_FOUNTAIN)
+ {
+ velocity[0] = 2.0f*(random.nextFloat()-0.5f);
+ velocity[1] = 6.0f;
+ velocity[2] = 2.0f*(random.nextFloat()-0.5f);
+ position[0] = 0.0f;
+ position[1] = 0.0f;
+ position[2] = 0.0f;
+ dampening = 0.35f*random.nextFloat();
+ }
+ previous[0] = position[0];
+ previous[1] = position[1];
+ previous[2] = position[2];
+ alive = true;
+ psTimeStep(2.0f*dt*random.nextFloat());
+ }
+
+ public void psTimeStep(float dt)
+ {
+ if (!alive) return;
+
+ velocity[1] += PS_GRAVITY*dt;
+
+ previous[0] = position[0];
+ previous[1] = position[1];
+ previous[2] = position[2];
+
+ position[0] += velocity[0]*dt;
+ position[1] += velocity[1]*dt;
+ position[2] += velocity[2]*dt;
+ }
+
+ /* psBounce: the particle has gone past (or exactly hit) the
+ ground plane, so calculate the time at which the particle
+ actually intersected the ground plane (s). essentially, this
+ just rolls back time to when the particle hit the ground plane,
+ then starts time again from then.
+
+ - - o A (previous position)
+ | | \
+ | s \ o (position it _should_ be at) -
+ t | \ / | t - s
+ | - ------X-------- -
+ | \
+ - o B (new position)
+
+ A + V*s = 0 or s = -A/V
+
+ to calculate where the particle should be:
+
+ A + V*t + V*(t-s)*d
+
+ where d is a damping factor which accounts for the loss
+ of energy due to the bounce. */
+ public void psBounce(float dt)
+ {
+ if (!alive) return;
+
+ /* since we know it is the ground plane, we only need to
+ calculate s for a single dimension. */
+ float s = -previous[1]/velocity[1];
+
+ position[0] =
+ (previous[0] + velocity[0]*s + velocity[0]*(dt-s)*dampening);
+ position[1] =
+ -velocity[1] * (dt-s) * dampening; /* reflect */
+ position[2] =
+ (previous[2] + velocity[2]*s + velocity[2]*(dt-s)*dampening);
+
+ /* damp the reflected velocity (since the particle hit
+ something, it lost some energy) */
+ velocity[0] *= dampening;
+ velocity[1] *= -dampening; /* reflect */
+ velocity[2] *= dampening;
+ }
+
+ public void psCollide(PSsphere sphere)
+ {
+ if (!alive) return;
+
+ float vx = position[0] - sphere.x;
+ float vy = position[1] - sphere.y;
+ float vz = position[2] - sphere.z;
+ float distance, distancesquared;
+
+ // Use distancesquared and radiussquared for comparison,
+ // eliminating the sqrt() call unless it is absolutely
+ // necessary, since it is time-consuming.
+ distancesquared = (vx*vx + vy*vy + vz*vz);
+ if (distancesquared < sphere.radiussquared)
+ {
+ distance = (float)Math.sqrt(distancesquared);
+ position[0] = sphere.x+(vx/distance)*sphere.radius;
+ position[1] = sphere.y+(vy/distance)*sphere.radius;
+ position[2] = sphere.z+(vz/distance)*sphere.radius;
+ previous[0] = position[0];
+ previous[1] = position[1];
+ previous[2] = position[2];
+ velocity[0] = vx/distance;
+ velocity[1] = vy/distance;
+ velocity[2] = vz/distance;
+ }
+ }
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class particleCanvas extends GLAnimCanvas
+ implements MouseListener, MouseMotionListener, KeyListener
+ {
+ private static final float M_PI = 3.14159265359f;
+
+ private MatrixFuncs mtxfuncs = null;
+ private int prevMouseX, prevMouseY;
+ private boolean mouseRButtonDown = false;
+ private float rot_matrix[] =
+ {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f
+ };
+
+ private PSparticle[] particles = null;
+ private PSsphere sphere = new PSsphere(0.0f,1.0f,0.0f,0.25f);
+ private int num_particles = 5000;
+ private int living = 0; /* index to end of live particles */
+ private int type = PS_WATERFALL;
+ private boolean use_lines = false;
+ private boolean do_sphere = false;
+ private float flow = 500.0f;
+ private float slow_down = 1.0f;
+ private int point_size = 3;
+ private int sphere_list = 0;
+
+ public particleCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+
+ mtxfuncs = new MatrixFuncs();
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ setInitialRotation();
+
+ particles = new PSparticle[num_particles];
+ for (int i = 0; i < num_particles; i++)
+ particles[i] = new PSparticle();
+
+ sphere_list = gl.glGenLists(1);
+ gl.glNewList(sphere_list,GL_COMPILE);
+ gl.glColor3ub((byte)0, (byte)255, (byte)128);
+ int qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,sphere.radius, 16, 16);
+ glu.gluDeleteQuadric(qobj);
+ gl.glEndList();
+
+ glj.gljCheckGL();
+
+ addMouseListener(this);
+ addMouseMotionListener(this);
+ addKeyListener(this);
+ }
+
+ public void doCleanup()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ removeMouseMotionListener(this);
+ removeKeyListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+
+ float black[] = { 0, 0, 0, 0 };
+
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective(60, 1, 0.1, 1000);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ glu.gluLookAt(0, 1, 3, 0, 1, 0, 0, 1, 0);
+ gl.glFogfv(GL_FOG_COLOR, black);
+ gl.glFogf(GL_FOG_START, 2.5f);
+ gl.glFogf(GL_FOG_END, 4f);
+ gl.glEnable(GL_FOG);
+ gl.glFogi(GL_FOG_MODE, GL_LINEAR);
+ gl.glPointSize(point_size);
+ gl.glEnable(GL_POINT_SMOOTH);
+ gl.glEnable(GL_BLEND);
+ gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ gl.glEnable(GL_COLOR_MATERIAL);
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glEnable(GL_LIGHT0);
+
+ timedelta();
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ gl.glPushMatrix();
+ gl.glMultMatrixf(rot_matrix);
+
+ // Update particles.
+
+ float dt = timedelta();
+ float truedt = dt;
+
+ /* slow the simulation if we can't keep the frame rate up
+ around 10 fps */
+ if (dt > 0.1f)
+ slow_down = 0.75f;
+ else if (dt < 0.1f)
+ slow_down = 1.0f;
+ dt *= slow_down;
+
+ /* resurrect a few particles */
+ for (int i = 0; i < flow*dt; i++)
+ {
+ particles[living] = new PSparticle(dt,type);
+ living++;
+ if (living >= num_particles) living = 0;
+ }
+
+ for (int i = 0; i < num_particles; i++)
+ {
+ particles[i].psTimeStep(dt);
+ /* collision with sphere? */
+ if (do_sphere) particles[i].psCollide(sphere);
+ /* collision with ground? */
+ if (particles[i].position[1] <= 0.0f)
+ particles[i].psBounce(dt);
+ /* dead particle? */
+ if ( (particles[i].position[1] < 0.1f)
+ && (Math.abs(particles[i].velocity[1]) < 0.2f) )
+ particles[i].alive = false;
+ }
+
+ // Draw the scene.
+
+ gl.glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ gl.glEnable(GL_LIGHTING);
+ if (do_sphere)
+ {
+ gl.glPushMatrix();
+ gl.glTranslatef(sphere.x, sphere.y, sphere.z);
+ gl.glCallList(sphere_list);
+ gl.glPopMatrix();
+ }
+ gl.glDisable(GL_LIGHTING);
+
+ gl.glColor3ub((byte)0, (byte)128, (byte)255);
+ gl.glBegin(GL_QUADS);
+ gl.glVertex3f(-2f, 0f, -2f);
+ gl.glVertex3f(-2f, 0f, 2f);
+ gl.glVertex3f(2f, 0f, 2f);
+ gl.glVertex3f(2f, 0f, -2f);
+ gl.glEnd();
+
+ float r, g;
+ if (!use_lines)
+ {
+ gl.glBegin(GL_POINTS);
+ for (int i = 0; i < num_particles; i++)
+ {
+ if (!particles[i].alive) continue;
+ r = particles[i].position[1]/2.1f*255f;
+ g = 128.0f+(r*0.5f);
+ gl.glColor3ub((byte)r, (byte)g, (byte)255);
+ gl.glVertex3fv(particles[i].position);
+ }
+ gl.glEnd();
+ }
+ else
+ {
+ gl.glBegin(GL_LINES);
+ for (int i = 0; i < num_particles; i++)
+ {
+ if (!particles[i].alive) continue;
+ r = particles[i].previous[1]/2.1f*255f;
+ g = 128.0f+(r*0.5f);
+ gl.glColor3ub((byte)r, (byte)g, (byte)255);
+ gl.glVertex3fv(particles[i].previous);
+ r = particles[i].position[1]/2.1f*255f;
+ g = 128.0f+(r*0.5f);
+ gl.glColor3ub((byte)r, (byte)g, (byte)255);
+ gl.glVertex3fv(particles[i].position);
+ }
+ gl.glEnd();
+ }
+
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ //if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+
+ /* timedelta: returns the number of seconds that have elapsed
+ since the previous call to the function. */
+ private long timedelta_prev = 0L;
+ private float timedelta()
+ {
+ long current = System.currentTimeMillis();
+ if (timedelta_prev == 0L) timedelta_prev = current;
+ long delta = current-timedelta_prev;
+ timedelta_prev = current;
+ return ((float)delta) * 0.001f;
+ }
+
+ // Reset the rotation matrix to the default view.
+ private void setInitialRotation()
+ {
+ for (int i = 0; i < 16; i++)
+ rot_matrix[i] = ((i % 5) == 0) ? 1.0f : 0.0f;
+ }
+
+ private void fixRotationMatrix()
+ {
+ // Fix any problems with the rotation matrix.
+ rot_matrix[3] =
+ rot_matrix[7] =
+ rot_matrix[11] =
+ rot_matrix[12] =
+ rot_matrix[13] =
+ rot_matrix[14] = 0.0f;
+ rot_matrix[15] = 1.0f;
+ float fac;
+ if ((fac = (float)Math.sqrt
+ ((rot_matrix[0]*rot_matrix[0]) +
+ (rot_matrix[4]*rot_matrix[4]) +
+ (rot_matrix[8]*rot_matrix[8]))) != 1.0f)
+ {
+ if (fac != 0.0f)
+ {
+ fac = 1.0f/fac;
+ rot_matrix[0] *= fac;
+ rot_matrix[4] *= fac;
+ rot_matrix[8] *= fac;
+ }
+ }
+ if ((fac = (float)Math.sqrt
+ ((rot_matrix[1]*rot_matrix[1]) +
+ (rot_matrix[5]*rot_matrix[5]) +
+ (rot_matrix[9]*rot_matrix[9]))) != 1.0f)
+ {
+ if (fac != 0.0f)
+ {
+ fac = 1.0f/fac;
+ rot_matrix[1] *= fac;
+ rot_matrix[5] *= fac;
+ rot_matrix[9] *= fac;
+ }
+ }
+ if ((fac = (float)Math.sqrt
+ ((rot_matrix[2]*rot_matrix[2]) +
+ (rot_matrix[6]*rot_matrix[6]) +
+ (rot_matrix[10]*rot_matrix[10]))) != 1.0f)
+ {
+ if (fac != 0.0f)
+ {
+ fac = 1.0f/fac;
+ rot_matrix[2] *= fac;
+ rot_matrix[6] *= fac;
+ rot_matrix[10] *= fac;
+ }
+ }
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ prevMouseX = evt.getX();
+ prevMouseY = evt.getY();
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ mouseRButtonDown = true;
+ evt.consume();
+ }
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ mouseRButtonDown = false;
+ evt.consume();
+ }
+ }
+
+ // Methods required for the implementation of MouseMotionListener
+ public void mouseDragged( MouseEvent evt )
+ {
+ int x = evt.getX();
+ int y = evt.getY();
+ float thetaX = (float)(x-prevMouseX)*(360.0f/(float)getSize().width);
+ float thetaY = (float)(prevMouseY-y)*(360.0f/(float)getSize().height);
+ float mtxbuf[] = new float[16];
+ float mtxbuf2[] = new float[16];
+
+ prevMouseX = x;
+ prevMouseY = y;
+ if ( (thetaX != 0.0f) || (thetaY != 0.0f) )
+ {
+ mtxfuncs.rotateAroundY(((float)thetaX),mtxbuf);
+ if (mouseRButtonDown)
+ mtxfuncs.rotateAroundZ(thetaY,mtxbuf2);
+ else
+ mtxfuncs.rotateAroundX(-thetaY,mtxbuf2);
+ mtxfuncs.multiplyMatrices(mtxbuf2,mtxbuf,mtxbuf);
+ mtxfuncs.multiplyMatrices(rot_matrix,mtxbuf,rot_matrix);
+ fixRotationMatrix();
+ }
+ evt.consume();
+ }
+
+ public void mouseMoved( MouseEvent evt )
+ {
+ }
+
+ // Methods required for the implementation of KeyListener
+ public void keyPressed(KeyEvent e)
+ {
+ }
+
+ public void keyReleased(KeyEvent e)
+ {
+ }
+
+ public void keyTyped(KeyEvent e)
+ {
+ if (glj.gljMakeCurrent() == false) return;
+ switch ((char)e.getKeyChar())
+ {
+ case 'W':
+ case 'w':
+ type = PS_WATERFALL;
+ break;
+ case 'F':
+ case 'f':
+ type = PS_FOUNTAIN;
+ break;
+ case 'S':
+ case 's':
+ do_sphere = !do_sphere;
+ break;
+ case 'L':
+ case 'l':
+ use_lines = !use_lines;
+ break;
+ case 'P':
+ point_size++;
+ gl.glPointSize(point_size);
+ break;
+ case 'p':
+ point_size--;
+ if (point_size < 1) point_size = 1;
+ gl.glPointSize(point_size);
+ break;
+ case '+':
+ flow += 100;
+ if (flow > num_particles) flow = num_particles;
+ System.out.println(flow + " particles/second");
+ break;
+ case '-':
+ flow -= 100;
+ if (flow < 0) flow = 0;
+ System.out.println(flow + " particles/second");
+ break;
+ case 'R':
+ case 'r':
+ setInitialRotation();
+ break;
+ }
+ glj.gljFree();
+ }
+ }
+}
diff --git a/demos/RonsDemos/particle_plugin13.html b/demos/RonsDemos/particle_plugin13.html
new file mode 100644
index 0000000..84268df
--- /dev/null
+++ b/demos/RonsDemos/particle_plugin13.html
@@ -0,0 +1,57 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Particle by Nate Robins; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Particle applet
+<br>Originially written by Nate Robins
+<br>Ported to Java by Ron Cemer
+<br>Drag the mouse inside the window to rotate the view.
+<br>Click inside the window, then press any of the following keys:
+<br>W/w: waterfall mode
+<br>F/f: fountain mode
+<br>S/s: toggle sphere collision
+<br>L/l: toggle between points lines
+<br>P/p: increase/decrease point size
+<br>+/-: increase/decrease number of particles
+<br>R/r: reset view rotation
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "particle.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "particle.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "particle.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "particle.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/pointblast.html b/demos/RonsDemos/pointblast.html
new file mode 100644
index 0000000..d469a51
--- /dev/null
+++ b/demos/RonsDemos/pointblast.html
@@ -0,0 +1,19 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Pointblast by Mark J. Kilgard; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Pointblast applet
+<br>Originially written by Mark J. Kilgard
+<br>Ported to Java by Ron Cemer
+<br>Drag the mouse within the window to spin the image.
+<br>Right-click within the window for a menu of options.
+<br>
+<applet code="pointblast.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/pointblast.java b/demos/RonsDemos/pointblast.java
new file mode 100644
index 0000000..08570d1
--- /dev/null
+++ b/demos/RonsDemos/pointblast.java
@@ -0,0 +1,664 @@
+/**
+ * @(#) pointblast.java
+ * @(#) author: Mark J. Kilgard (converted to Java by Ron Cemer)
+ */
+
+/* Copyright (c) Mark J. Kilgard, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+/* This example demonstrates how to render particle effects
+ with OpenGL. A cloud of pinkish/orange particles explodes with the
+ particles bouncing off the ground. When the EXT_point_parameters
+ is present , the particle size is attenuated based on eye distance. */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class pointblast extends SimpleGLAnimApplet1
+{
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new pointblastCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class pointblastCanvas extends GLAnimCanvas
+ implements MouseListener, MouseMotionListener, ActionListener
+ {
+ private final double M_PI = 3.14159265;
+
+ private final String MENU_PAUSE = "Pause";
+ private final String MENU_RESUME = "Resume";
+ private final String MENU_RESET_TIME = "Reset time";
+// private final String MENU_CONSTANT = "Constant";
+// private final String MENU_LINEAR = "Linear";
+// private final String MENU_QUADRATIC = "Quadratic";
+ private final String MENU_BLEND_ON = "Blend on";
+ private final String MENU_BLEND_OFF = "Blend off";
+// private final String MENU_THRESHOLD_1 = "Threshold 1";
+// private final String MENU_THRESHOLD_10 = "Threshold 10";
+ private final String MENU_POINT_SMOOTH_ON = "Point smooth on";
+ private final String MENU_POINT_SMOOTH_OFF = "Point smooth off";
+ private final String MENU_POINT_SIZE_2 = "Point size 2";
+ private final String MENU_POINT_SIZE_4 = "Point size 4";
+ private final String MENU_POINT_SIZE_8 = "Point size 8";
+ private final String MENU_ENABLE_SPIN = "Enable spin";
+ private final String MENU_DISABLE_SPIN = "Disable spin";
+ private final String MENU_200_POINTS = "200 points";
+ private final String MENU_500_POINTS = "500 points";
+ private final String MENU_1000_POINTS = "1000 points";
+ private final String MENU_2000_POINTS = "2000 points";
+ private final String MENU_ENABLE_TEXTURING = "Enable texturing";
+ private final String MENU_DISABLE_TEXTURING = "Disable texturing";
+ private final String MENU_LINEAR_TEXTURE_FILTERING = "Linear texture filtering";
+ private final String MENU_POINT_TEXTURE_FILTERING = "Point texture filtering";
+
+ private PopupMenu menu = null;
+ private boolean menu_showing = false;
+ private boolean save_suspended = false;
+
+ private float angle = -150; /* in degrees */
+ private boolean spin = false;
+ private boolean moving = false;
+ private int begin;
+ private boolean newModel = true;
+ private float theTime;
+ private boolean repeat = true;
+ private boolean blend = true;
+ private boolean texturing = true;
+// private boolean useMipmaps = true;
+ private boolean linearFiltering = true;
+
+ private float constant[] = { 1.0f/5.0f, 0.0f, 0.0f };
+ private float linear[] = { 0.0f, 1.0f/5.0f, 0.0f };
+ private float theQuad[] = { 0.25f, 0.0f, 1.0f/60.0f };
+
+ private final int MAX_POINTS = 2000;
+
+ private int numPoints = 200;
+
+ private float pointList[][] = new float[MAX_POINTS][3];
+ private float pointTime[] = new float[MAX_POINTS];
+ private float pointVelocity[][] = new float[MAX_POINTS][2];
+ private float pointDirection[][] = new float[MAX_POINTS][2];
+ private int colorList[] = new int[MAX_POINTS];
+ private boolean motion = false;
+
+ private Random random = new Random(System.currentTimeMillis());
+
+ private final float MEAN_VELOCITY = 3.0f;
+ private final float GRAVITY = 2.0f;
+ private final float TIME_DELTA = 0.025f; /* The speed of time. */
+
+ /* Modeling units of ground extent in each X and Z direction. */
+ private final int EDGE = 12;
+
+ private final float colorSet[][] =
+ {
+ /* Shades of red. */
+ { 0.7f, 0.2f, 0.4f, 0.5f },
+ { 0.8f, 0.0f, 0.7f, 0.5f },
+ { 1.0f, 0.0f, 0.0f, 0.5f },
+ { 0.9f, 0.3f, 0.6f, 0.5f },
+ { 1.0f, 0.4f, 0.0f, 0.5f },
+ { 1.0f, 0.0f, 0.5f, 0.5f }
+ };
+ private final int NUM_COLORS = colorSet.length;
+ private final int DEAD = NUM_COLORS;
+
+ public pointblastCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ gl.glShadeModel(GL_FLAT);
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glEnable(GL_POINT_SMOOTH);
+ gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ gl.glPointSize(8.0f);
+// gl.glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, theQuad);
+ gl.glMatrixMode(GL_PROJECTION);
+ glu.gluPerspective
+ (/* field of view in degree */ 40.0,
+ /* aspect ratio */ 1.0,
+ /* Z near */ 0.5,
+ /* Z far */ 40.0);
+ gl.glMatrixMode(GL_MODELVIEW);
+ glu.gluLookAt
+ (0.0f, 1.0f, 8.0f, /* eye location */
+ 0.0f, 1.0f, 0.0f, /* center is at (0,0,0) */
+ 0.0f, 1.0f, 0.0f); /* up is in postivie Y direction */
+ gl.glPushMatrix(); /* dummy push so we can pop on model
+ recalc */
+ makePointList();
+ makeFloorTexture();
+
+ glj.gljCheckGL();
+
+ menu = new PopupMenu("Options");
+ menu.add(MENU_PAUSE);
+ menu.add(MENU_RESUME);
+ menu.add(MENU_RESET_TIME);
+// menu.add(MENU_CONSTANT);
+// menu.add(MENU_LINEAR);
+// menu.add(MENU_QUADRATIC);
+ menu.add(MENU_BLEND_ON);
+ menu.add(MENU_BLEND_OFF);
+// menu.add(MENU_THRESHOLD_1);
+// menu.add(MENU_THRESHOLD_10);
+ menu.add(MENU_POINT_SMOOTH_ON);
+ menu.add(MENU_POINT_SMOOTH_OFF);
+ menu.add(MENU_POINT_SIZE_2);
+ menu.add(MENU_POINT_SIZE_4);
+ menu.add(MENU_POINT_SIZE_8);
+ menu.add(MENU_ENABLE_SPIN);
+ menu.add(MENU_DISABLE_SPIN);
+ menu.add(MENU_200_POINTS);
+ menu.add(MENU_500_POINTS);
+ menu.add(MENU_1000_POINTS);
+ menu.add(MENU_2000_POINTS);
+ menu.add(MENU_ENABLE_TEXTURING);
+ menu.add(MENU_DISABLE_TEXTURING);
+ menu.add(MENU_LINEAR_TEXTURE_FILTERING);
+ menu.add(MENU_POINT_TEXTURE_FILTERING);
+ menu.addActionListener(this);
+ add(menu);
+
+ addMouseListener(this);
+ addMouseMotionListener(this);
+ }
+
+ public void doCleanup()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ removeMouseMotionListener(this);
+ menu.removeActionListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ if (!isSuspended())
+ {
+ if (spin)
+ {
+ angle += 0.3f;
+ newModel = true;
+ }
+ updatePointList();
+ }
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ if (newModel) recalcModelView();
+
+ gl.glDepthMask(false);
+
+ /* Draw the floor. */
+ if (texturing) gl.glEnable(GL_TEXTURE_2D);
+ gl.glColor3f(0.5f, 1.0f, 0.5f);
+ gl.glBegin(GL_QUADS);
+ gl.glTexCoord2f(0.0f, 0.0f);
+ gl.glVertex3f(-EDGE, -0.05f, -EDGE);
+ gl.glTexCoord2f(20.0f, 0.0f);
+ gl.glVertex3f(EDGE, -0.05f, -EDGE);
+ gl.glTexCoord2f(20.0f, 20.0f);
+ gl.glVertex3f(EDGE, -0.05f, EDGE);
+ gl.glTexCoord2f(0.0f, 20.0f);
+ gl.glVertex3f(-EDGE, -0.05f, EDGE);
+ gl.glEnd();
+
+ /* Allow particles to blend with each other. */
+ gl.glDepthMask(true);
+
+ if (blend) gl.glEnable(GL_BLEND);
+
+ if (texturing) gl.glDisable(GL_TEXTURE_2D);
+ gl.glBegin(GL_POINTS);
+ for (int i = 0; i < numPoints; i++)
+ {
+ /* Draw alive particles. */
+ int c = colorList[i];
+ if ( (c < 0) || (c >= DEAD) ) continue;
+ gl.glColor4fv(colorSet[colorList[i]]);
+ gl.glVertex3fv(pointList[i]);
+ }
+ gl.glEnd();
+
+ gl.glDisable(GL_BLEND);
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ //if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered(MouseEvent evt)
+ {
+ }
+
+ public void mouseExited(MouseEvent evt)
+ {
+ }
+
+ public void mousePressed(MouseEvent evt)
+ {
+ // If user presses right mouse button within canvas area,
+ // suspend animation and pop up menu.
+ // If menu was already popped up and user presses either
+ // mouse button within canvas area, resume animation
+ // because the menu will have been removed automatically.
+ if (!menu_showing)
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ menu_showing = true;
+ save_suspended = isSuspended();
+ if (!save_suspended)
+ {
+ setSuspended(true);
+ repaint(100);
+ try
+ {
+ Thread.currentThread().sleep(200);
+ }
+ catch (Exception e)
+ { }
+ }
+ menu.show(this,evt.getX(),evt.getY());
+ }
+ else
+ {
+ // Must be left button.
+ moving = true;
+ begin = evt.getX();
+ }
+ }
+ else
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+
+ public void mouseReleased(MouseEvent evt)
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) == 0)
+ {
+ // Must be left button.
+ moving = false;
+ }
+ }
+
+ public void mouseClicked(MouseEvent evt)
+ {
+ }
+
+ // Methods required for the implementation of MouseMotionListener
+ public void mouseDragged(MouseEvent evt)
+ {
+ if (moving)
+ {
+ int x = evt.getX();
+ angle = angle + (x - begin);
+ begin = x;
+ newModel = true;
+ if (isSuspended()) repaint();
+ }
+ }
+
+ public void mouseMoved(MouseEvent evt)
+ {
+ }
+
+ // Method required for the implementation of ActionListener
+ public void actionPerformed(ActionEvent evt)
+ {
+ if (glj.gljMakeCurrent() == false) return;
+ boolean dorepaint = false;
+ String c = evt.getActionCommand();
+ if (c.equals(MENU_PAUSE))
+ {
+ if (menu_showing)
+ save_suspended = true;
+ else if (!isSuspended())
+ setSuspended(true);
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_RESUME))
+ {
+ if (menu_showing)
+ save_suspended = false;
+ else if (isSuspended())
+ setSuspended(false);
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_RESET_TIME))
+ {
+ makePointList();
+ dorepaint = true;
+ }
+// else if (c.equals(MENU_CONSTANT))
+// {
+// gl.glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, constant);
+// dorepaint = true;
+// }
+// else if (c.equals(MENU_LINEAR))
+// {
+// gl.glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, linear);
+// dorepaint = true;
+// }
+// else if (c.equals(MENU_QUADRATIC))
+// {
+// gl.glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, theQuad);
+// dorepaint = true;
+// }
+ else if (c.equals(MENU_BLEND_ON))
+ {
+ blend = true;
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_BLEND_OFF))
+ {
+ blend = false;
+ dorepaint = true;
+ }
+// else if (c.equals(MENU_THRESHOLD_1))
+// {
+// gl.glPointParameterfEXT(GL_POINT_FADE_THRESHOLD_SIZE_EXT, 1.0f);
+// dorepaint = true;
+// }
+// else if (c.equals(MENU_THRESHOLD_10))
+// {
+// gl.glPointParameterfEXT(GL_POINT_FADE_THRESHOLD_SIZE_EXT, 10.0f);
+// dorepaint = true;
+// }
+ else if (c.equals(MENU_POINT_SMOOTH_ON))
+ {
+ gl.glEnable(GL_POINT_SMOOTH);
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_POINT_SMOOTH_OFF))
+ {
+ gl.glDisable(GL_POINT_SMOOTH);
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_POINT_SIZE_2))
+ {
+ gl.glPointSize(2.0f);
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_POINT_SIZE_4))
+ {
+ gl.glPointSize(4.0f);
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_POINT_SIZE_8))
+ {
+ gl.glPointSize(8.0f);
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_ENABLE_SPIN))
+ {
+ spin = true;
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_DISABLE_SPIN))
+ {
+ spin = false;
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_200_POINTS))
+ {
+ numPoints = 200;
+ makePointList();
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_500_POINTS))
+ {
+ numPoints = 500;
+ makePointList();
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_1000_POINTS))
+ {
+ numPoints = 1000;
+ makePointList();
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_2000_POINTS))
+ {
+ numPoints = 2000;
+ makePointList();
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_ENABLE_TEXTURING))
+ {
+ texturing = true;
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_DISABLE_TEXTURING))
+ {
+ texturing = false;
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_LINEAR_TEXTURE_FILTERING))
+ {
+ linearFiltering = true;
+ makeFloorTexture();
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_POINT_TEXTURE_FILTERING))
+ {
+ linearFiltering = false;
+ makeFloorTexture();
+ dorepaint = true;
+ }
+
+ glj.gljFree();
+ if (menu_showing)
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ if ( (isSuspended()) && (dorepaint) ) repaint();
+ }
+
+ private float float_rand()
+ {
+ return random.nextFloat();
+ }
+
+ private float RANDOM_RANGE(float lo, float hi)
+ {
+ return lo + ((hi - lo) * float_rand());
+ }
+
+ private void makePointList()
+ {
+ float angle, velocity, direction;
+ motion = true;
+ for (int i = 0; i < numPoints; i++)
+ {
+ pointList[i][0] = 0.0f;
+ pointList[i][1] = 0.0f;
+ pointList[i][2] = 0.0f;
+ pointTime[i] = 0.0f;
+ angle = (RANDOM_RANGE(60.0f, 70.0f)) * ((float)M_PI)/180.0f;
+ direction = RANDOM_RANGE(0.0f, 360.0f) * ((float)M_PI)/180.0f;
+ pointDirection[i][0] = (float)Math.cos(direction);
+ pointDirection[i][1] = (float)Math.sin(direction);
+ velocity = MEAN_VELOCITY + RANDOM_RANGE(-0.8f, 1.0f);
+ pointVelocity[i][0] = velocity * (float)Math.cos(angle);
+ pointVelocity[i][1] = velocity * (float)Math.sin(angle);
+ colorList[i] = random.nextInt() % NUM_COLORS;
+ }
+ theTime = 0.0f;
+ }
+
+ private void updatePointList()
+ {
+ float distance;
+ motion = false;
+ for (int i = 0; i < numPoints; i++)
+ {
+ distance = pointVelocity[i][0] * theTime;
+
+ /* X and Z */
+ pointList[i][0] = pointDirection[i][0] * distance;
+ pointList[i][2] = pointDirection[i][1] * distance;
+
+ /* Z */
+ pointList[i][1] =
+ (pointVelocity[i][1] - 0.5f * GRAVITY * pointTime[i])*pointTime[i];
+
+ /* If we hit the ground, bounce the point upward again. */
+ if (pointList[i][1] <= 0.0f)
+ {
+ if (distance > EDGE)
+ {
+ /* Particle has hit ground past the distance duration of
+ the particles. Mark particle as dead. */
+ colorList[i] = DEAD; /* Not moving. */
+ continue;
+ }
+ pointVelocity[i][1] *= 0.8f; /* 80% of previous up velocity. */
+ pointTime[i] = 0.0f; /* Reset the particles sense of up time. */
+ }
+ motion = true;
+ pointTime[i] += TIME_DELTA;
+ }
+ theTime += TIME_DELTA;
+ if ( (repeat) && (!motion) ) makePointList();
+ }
+
+ private void recalcModelView()
+ {
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(angle, 0.0f, 1.0f, 0.0f);
+ newModel = false;
+ }
+
+ private void makeFloorTexture()
+ {
+ /* Nice floor texture tiling pattern. */
+ String circles[] =
+ {
+ "....xxxx........",
+ "..xxxxxxxx......",
+ ".xxxxxxxxxx.....",
+ ".xxx....xxx.....",
+ "xxx......xxx....",
+ "xxx......xxx....",
+ "xxx......xxx....",
+ "xxx......xxx....",
+ ".xxx....xxx.....",
+ ".xxxxxxxxxx.....",
+ "..xxxxxxxx......",
+ "....xxxx........",
+ "................",
+ "................",
+ "................",
+ "................"
+ };
+ byte floorTexture[] = new byte[16*16*3];
+
+ /* Setup RGB image for the texture. */
+ int idx = 0;
+ for (int t = 0; t < 16; t++)
+ {
+ for (int s = 0; s < 16; s++)
+ {
+ if (circles[t].charAt(s) == 'x')
+ {
+ /* Nice blue. */
+ floorTexture[idx++] = (byte)0x1f;
+ floorTexture[idx++] = (byte)0x1f;
+ floorTexture[idx++] = (byte)0x8f;
+ }
+ else
+ {
+ /* Light gray. */
+ floorTexture[idx++] = (byte)0xca;
+ floorTexture[idx++] = (byte)0xca;
+ floorTexture[idx++] = (byte)0xca;
+ }
+ }
+ }
+
+ gl.glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+// if (useMipmaps)
+// {
+// gl.glTexParameteri
+// (GL_TEXTURE_2D,
+// GL_TEXTURE_MIN_FILTER,
+// GL_LINEAR_MIPMAP_LINEAR);
+// glu.gluBuild2DMipmaps
+// (GL_TEXTURE_2D,3,16,16,GL_RGB,GL_UNSIGNED_BYTE,floorTexture);
+// }
+// else
+ {
+ if (linearFiltering)
+ {
+ gl.glTexParameteri
+ (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ gl.glTexParameteri
+ (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ }
+ else
+ {
+ gl.glTexParameteri
+ (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ gl.glTexParameteri
+ (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ }
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,0,3,16,16,0,GL_RGB,GL_UNSIGNED_BYTE,floorTexture);
+ }
+ }
+ }
+}
diff --git a/demos/RonsDemos/pointblast_plugin13.html b/demos/RonsDemos/pointblast_plugin13.html
new file mode 100644
index 0000000..0133e90
--- /dev/null
+++ b/demos/RonsDemos/pointblast_plugin13.html
@@ -0,0 +1,50 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Pointblast by Mark J. Kilgard; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Pointblast applet
+<br>Originially written by Mark J. Kilgard
+<br>Ported to Java by Ron Cemer
+<br>Drag the mouse within the window to spin the image.
+<br>Right-click within the window for a menu of options.
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "pointblast.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "pointblast.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "pointblast.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "pointblast.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/polyoff.html b/demos/RonsDemos/polyoff.html
new file mode 100644
index 0000000..78ba14d
--- /dev/null
+++ b/demos/RonsDemos/polyoff.html
@@ -0,0 +1,23 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Polyoff by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Polyoff applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>Use the Java Console in your browser to see messages generated by this applet.
+<br>Click inside the window, then press any of the following keys:
+<br>Arrows: rotate the object
+<br>t/T: decrease/increase translation distance
+<br>f/F: decrease/increase polygon offset factor
+<br>u/U: decrease/increase polygon offset units
+<br>
+<applet code="polyoff.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/polyoff.java b/demos/RonsDemos/polyoff.java
new file mode 100644
index 0000000..a79a398
--- /dev/null
+++ b/demos/RonsDemos/polyoff.java
@@ -0,0 +1,332 @@
+/**
+ * @(#) polyoff.java
+ * @(#) author: Silicon Graphics, Inc. (converted to Java by Ron Cemer)
+ */
+
+/*
+ * Copyright (c) 1993-1997, 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(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+
+/*
+ * This program demonstrates polygon offset to draw a shaded
+ * polygon and its wireframe counterpart without ugly visual
+ * artifacts ("stitching").
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+public class polyoff extends Applet
+{
+ polyoffCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new polyoffCanvas(d.width, d.height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+
+ /* Destroy the applet */
+
+
+ public void destroy()
+ {
+ canvas.cvsDispose();
+ }
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class polyoffCanvas extends GLCanvas
+ implements KeyListener, MouseListener
+ {
+ private int list;
+ private int spinx = 0;
+ private int spiny = 0;
+ private float tdist = 0.0f;
+ private float polyfactor = 1.0f;
+ private float polyunits = 1.0f;
+
+ public polyoffCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ /* specify initial properties
+ * create display list with sphere
+ * initialize lighting and depth buffer
+ */
+
+ float light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
+ float light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float light_position[] = { 1.0f, 1.0f, 1.0f, 0.0f };
+
+ float global_ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+
+ list = gl.glGenLists(1);
+ gl.glNewList (list, GL_COMPILE);
+
+ int qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,1.0f,20,12);
+ glu.gluDeleteQuadric(qobj);
+
+ gl.glEndList();
+
+ gl.glEnable(GL_DEPTH_TEST);
+
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, light_position);
+ gl.glLightModelfv (GL_LIGHT_MODEL_AMBIENT, global_ambient);
+
+ glj.gljCheckGL();
+
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+ public void cvsDispose()
+ {
+ System.out.println("destroy(): " + this);
+ removeKeyListener(this);
+ super.cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective(45.0,(double)width/(double)height,1.0,10.0);
+ gl.glMatrixMode (GL_MODELVIEW);
+ gl.glLoadIdentity();
+ glu.gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ float mat_ambient[] = { 0.8f, 0.8f, 0.8f, 1.0f };
+ float mat_diffuse[] = { 1.0f, 0.0f, 0.5f, 1.0f };
+ float mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float gray[] = { 0.8f, 0.8f, 0.8f, 1.0f };
+ float black[] = { 0.0f, 0.0f, 0.0f, 1.0f };
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, 0.0f, tdist);
+ gl.glRotatef((float)spinx, 1.0f, 0.0f, 0.0f);
+ gl.glRotatef((float)spiny, 0.0f, 1.0f, 0.0f);
+
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gray);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, black);
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, 0.0f);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_POLYGON_OFFSET_FILL);
+ gl.glPolygonOffset(polyfactor, polyunits);
+ gl.glCallList (list);
+ gl.glDisable(GL_POLYGON_OFFSET_FILL);
+
+ gl.glDisable(GL_LIGHTING);
+ gl.glDisable(GL_LIGHT0);
+ gl.glColor3f(1.0f, 1.0f, 1.0f);
+ gl.glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ gl.glCallList (list);
+ gl.glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+ gl.glPopMatrix();
+ gl.glFlush();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ // Methods required for the implementation of KeyListener
+ public void keyPressed(KeyEvent e)
+ {
+ switch (e.getKeyCode())
+ {
+ case KeyEvent.VK_LEFT:
+ int j = (spiny-5);
+ while (j < 0) j += 360;
+ spiny = j;
+ repaint();
+ break;
+ case KeyEvent.VK_RIGHT:
+ spiny = (spiny + 5) % 360;
+ repaint();
+ break;
+ case KeyEvent.VK_UP:
+ int i = (spinx-5);
+ while (i < 0) i += 360;
+ spinx = i;
+ repaint();
+ break;
+ case KeyEvent.VK_DOWN:
+ spinx = (spinx + 5) % 360;
+ repaint();
+ break;
+ }
+ }
+
+ public void keyReleased(KeyEvent e)
+ {
+ }
+
+ public void keyTyped(KeyEvent e)
+ {
+ switch ((char)e.getKeyChar())
+ {
+ case 'T':
+ if (tdist < 4.0f)
+ {
+ tdist += 0.5f;
+ System.out.println("translation distance is " + tdist);
+ repaint();
+ }
+ break;
+ case 't':
+ if (tdist > -5.0f)
+ {
+ tdist -= 0.5f;
+ System.out.println("translation distance is " + tdist);
+ repaint();
+ }
+ break;
+ case 'F':
+ polyfactor += 0.1f;
+ System.out.println("polyfactor is " + polyfactor);
+ repaint();
+ break;
+ case 'f':
+ polyfactor -= 0.1f;
+ System.out.println("polyfactor is " + polyfactor);
+ repaint();
+ break;
+ case 'U':
+ polyunits += 1.0f;
+ System.out.println("polyunits is " + polyunits);
+ repaint();
+ break;
+ case 'u':
+ polyunits -= 1.0f;
+ System.out.println("polyunits is " + polyunits);
+ repaint();
+ break;
+ }
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+ }
+}
diff --git a/demos/RonsDemos/polyoff_plugin13.html b/demos/RonsDemos/polyoff_plugin13.html
new file mode 100644
index 0000000..aab6878
--- /dev/null
+++ b/demos/RonsDemos/polyoff_plugin13.html
@@ -0,0 +1,54 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Polyoff by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Polyoff applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>Use the Java Console in your browser to see messages generated by this applet.
+<br>Click inside the window, then press any of the following keys:
+<br>Arrows: rotate the object
+<br>t/T: decrease/increase translation distance
+<br>f/F: decrease/increase polygon offset factor
+<br>u/U: decrease/increase polygon offset units
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "polyoff.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "polyoff.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "polyoff.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "polyoff.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/quadric.html b/demos/RonsDemos/quadric.html
new file mode 100644
index 0000000..d104772
--- /dev/null
+++ b/demos/RonsDemos/quadric.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Quadric by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Quadric applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<applet code="quadric.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/quadric.java b/demos/RonsDemos/quadric.java
new file mode 100644
index 0000000..932f428
--- /dev/null
+++ b/demos/RonsDemos/quadric.java
@@ -0,0 +1,250 @@
+/**
+ * @(#) quadric.java
+ * @(#) author: Silicon Graphics, Inc. (converted to Java by Ron Cemer)
+ */
+
+/*
+ * Copyright (c) 1993-1997, 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(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+
+/*
+ * This program demonstrates the use of some of the gluQuadric*
+ * routines. Quadric objects are created with some quadric
+ * properties and the callback routine to handle errors.
+ * Note that the cylinder has no top or bottom and the circle
+ * has a hole in it.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+public class quadric extends Applet
+{
+ quadricCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new quadricCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+
+ /* Destroy the applet */
+
+
+ public void destroy()
+ {
+ canvas.cvsDispose();
+ }
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class quadricCanvas extends GLCanvas
+ {
+ int startList;
+
+ public quadricCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ int qobj;
+ float mat_ambient[] = { 0.5f, 0.5f, 0.5f, 1.0f };
+ float mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float mat_shininess[] = { 50.0f };
+ float light_position[] = { 1.0f, 1.0f, 1.0f, 0.0f };
+ float model_ambient[] = { 0.5f, 0.5f, 0.5f, 1.0f };
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, light_position);
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, model_ambient);
+
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ /* Create 4 display lists, each with a different quadric object.
+ * Different drawing styles and surface normal specifications
+ * are demonstrated.
+ */
+ startList = gl.glGenLists(4);
+ qobj = glu.gluNewQuadric();
+
+ glu.gluQuadricDrawStyle(qobj, GLU_FILL); /* smooth shaded */
+ glu.gluQuadricNormals(qobj, GLU_SMOOTH);
+ gl.glNewList(startList, GL_COMPILE);
+ glu.gluSphere(qobj, 0.75f, 15, 10);
+ gl.glEndList();
+
+ glu.gluQuadricDrawStyle(qobj, GLU_FILL); /* flat shaded */
+ glu.gluQuadricNormals(qobj, GLU_FLAT);
+ gl.glNewList(startList+1, GL_COMPILE);
+ glu.gluCylinder(qobj, 0.5f, 0.3f, 1.0f, 15, 5);
+ gl.glEndList();
+
+ glu.gluQuadricDrawStyle(qobj, GLU_LINE); /* all polygons wireframe */
+ glu.gluQuadricNormals(qobj, GLU_NONE);
+ gl.glNewList(startList+2, GL_COMPILE);
+ glu.gluDisk(qobj, 0.25f, 1.0f, 20, 4);
+ gl.glEndList();
+
+ glu.gluQuadricDrawStyle(qobj, GLU_SILHOUETTE); /* boundary only */
+ glu.gluQuadricNormals(qobj, GLU_NONE);
+ gl.glNewList(startList+3, GL_COMPILE);
+ glu.gluPartialDisk(qobj, 0.0f, 1.0f, 20, 4, 0.0f, 225.0f);
+ gl.glEndList();
+
+ glu.gluDeleteQuadric(qobj);
+
+ glj.gljCheckGL();
+ }
+
+ public void cvsDispose()
+ {
+ System.out.println("destroy(): " + this);
+ super.cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ if (width <= height)
+ gl.glOrtho
+ (-2.5f,
+ 2.5f,
+ -2.5f*(float)height/(float)width,
+ 2.5f*(float)height/(float)width,
+ -10.0f,
+ 10.0f);
+ else
+ gl.glOrtho
+ (-2.5f*(float)width/(float)height,
+ 2.5f*(float)width/(float)height,
+ -2.5f,
+ 2.5f,
+ -10.0f,
+ 10.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gl.glPushMatrix();
+
+ gl.glEnable(GL_LIGHTING);
+ gl.glShadeModel(GL_SMOOTH);
+ gl.glTranslatef(-1.0f, -1.0f, 0.0f);
+ gl.glCallList(startList);
+
+ gl.glShadeModel(GL_FLAT);
+ gl.glTranslatef(0.0f, 2.0f, 0.0f);
+ gl.glPushMatrix();
+ gl.glRotatef(300.0f, 1.0f, 0.0f, 0.0f);
+ gl.glCallList(startList+1);
+ gl.glPopMatrix();
+
+ gl.glDisable(GL_LIGHTING);
+ gl.glColor3f(0.0f, 1.0f, 1.0f);
+ gl.glTranslatef(2.0f, -2.0f, 0.0f);
+ gl.glCallList(startList+2);
+
+ gl.glColor3f(1.0f, 1.0f, 0.0f);
+ gl.glTranslatef(0.0f, 2.0f, 0.0f);
+ gl.glCallList(startList+3);
+
+ gl.glPopMatrix();
+ gl.glFlush();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+ }
+}
diff --git a/demos/RonsDemos/quadric_plugin13.html b/demos/RonsDemos/quadric_plugin13.html
new file mode 100644
index 0000000..9d4db49
--- /dev/null
+++ b/demos/RonsDemos/quadric_plugin13.html
@@ -0,0 +1,48 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Quadric by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Quadric applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "quadric.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "quadric.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "quadric.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "quadric.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/reflect.html b/demos/RonsDemos/reflect.html
new file mode 100644
index 0000000..3ade9b6
--- /dev/null
+++ b/demos/RonsDemos/reflect.html
@@ -0,0 +1,22 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Reflect by Brian Paul; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Reflect applet
+<br>Originially written by Brian Paul
+<br>Ported to Java by Ron Cemer
+<br>
+<hr>You can rotate the view by holding the left mouse button down and
+<br>dragging the mouse within the applet's window.
+<br>If you hold the right button down instead, the view will rotate
+<br>around the Z axis.
+<br>
+<applet code="reflect.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/reflect.java b/demos/RonsDemos/reflect.java
new file mode 100644
index 0000000..e857881
--- /dev/null
+++ b/demos/RonsDemos/reflect.java
@@ -0,0 +1,424 @@
+/**
+ * @(#) reflect.java
+ * @(#) author: Brian Paul (converted to Java by Ron Cemer)
+ */
+
+/*
+ * Demo of a reflective, texture-mapped surface with OpenGL.
+ * Brian Paul August 14, 1995 This file is in the public domain.
+ *
+ * Hardware texture mapping is highly recommended!
+ *
+ * The basic steps are:
+ * 1. Render the reflective object (a polygon) from the normal viewpoint,
+ * setting the stencil planes = 1.
+ * 2. Render the scene from a special viewpoint: the viewpoint which
+ * is on the opposite side of the reflective plane. Only draw where
+ * stencil = 1. This draws the objects in the reflective surface.
+ * 3. Render the scene from the original viewpoint. This draws the
+ * objects in the normal fashion. Use blending when drawing
+ * the reflective, textured surface.
+ *
+ * This is a very crude demo. It could be much better.
+ */
+
+/*
+ * Dirk Reiners ([email protected]) made some modifications to this code.
+ *
+ * August 1996 - A few optimizations by Brian
+ */
+
+/*
+ * April, 1997 - Added Mark Kilgard's changes.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class reflect extends SimpleGLAnimApplet1
+{
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new reflectCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class reflectCanvas extends GLAnimCanvas implements MouseListener, MouseMotionListener
+ {
+ private static final float M_PI = 3.14159265359f;
+ private static final float DEG2RAD = (M_PI/180.0f);
+ private static final int MAX_OBJECTS = 2;
+
+ private final float light_pos[] = { 0.0f, 20.0f, 0.0f, 1.0f };
+
+ private int textureid = 0;
+
+ private int table_list;
+ private int objects_list[];
+
+ private float spin, xrot, yrot;
+
+ private MatrixFuncs mtxfuncs = null;
+ private int prevMouseX, prevMouseY;
+ private boolean mouseRButtonDown = false;
+
+ public reflectCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(60.0f);
+
+ mtxfuncs = new MatrixFuncs();
+ objects_list = new int[MAX_OBJECTS];
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ stencilBits = 3;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ make_table();
+ make_objects();
+
+ int texIdBuf[] = new int[1];
+ gl.glGenTextures(1, texIdBuf);
+ textureid = texIdBuf[0];
+
+ gl.glBindTexture(GL_TEXTURE_2D,textureid);
+
+ HardCodedTexture texture = new DemoTex1();
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,
+ 0,
+ texture.getComponents(),
+ texture.getWidth(),
+ texture.getHeight(),
+ 0,
+ texture.getFormat(),
+ texture.getType(),
+ texture.getBits());
+
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ gl.glBindTexture(GL_TEXTURE_2D,0);
+
+ spin = 0.0f;
+ xrot = 30.0f;
+ yrot = 50.0f;
+
+ gl.glShadeModel(GL_FLAT);
+
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_LIGHTING);
+
+ gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
+
+ gl.glEnable(GL_NORMALIZE);
+
+ glj.gljCheckGL();
+
+ addMouseListener(this);
+ addMouseMotionListener(this);
+ }
+
+ public void doCleanup()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ removeMouseMotionListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ float aspect = (float)width / (float)height;
+
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glFrustum(-aspect, aspect, -1.0f, 1.0f, 4.0f, 300.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ spin += 0.8f;
+ yrot += 1.2f;
+ if (yrot >= 360.0f) yrot -= 360.0f;
+
+ float dist = 20.0f;
+ float eyex, eyey, eyez;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+
+ eyex = dist * (float)Math.cos(yrot*DEG2RAD) * (float)Math.cos(xrot*DEG2RAD);
+ eyez = dist * (float)Math.sin(yrot*DEG2RAD) * (float)Math.cos(xrot*DEG2RAD);
+ eyey = dist * (float)Math.sin(xrot*DEG2RAD);
+
+ /* view from top */
+ gl.glPushMatrix();
+
+ glu.gluLookAt(eyex,eyey,eyez,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f);
+
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
+
+ /* draw table into stencil planes (non-textured for speed) */
+ gl.glEnable(GL_STENCIL_TEST);
+ gl.glDisable(GL_DEPTH_TEST);
+ gl.glStencilFunc(GL_ALWAYS, 1, 0xffffffff);
+ gl.glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
+ gl.glColorMask(false, false, false, false);
+ draw_table();
+ gl.glColorMask(true, true, true, true);
+
+ gl.glEnable(GL_DEPTH_TEST);
+
+ /* render view from below (reflected viewport) */
+ /* only draw where stencil==1 */
+ if (eyey > 0.0f)
+ {
+ gl.glPushMatrix();
+
+ gl.glStencilFunc(GL_EQUAL, 1, 0xffffffff); /* draw if ==1 */
+ gl.glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+ gl.glScalef(1.0f, -1.0f, 1.0f);
+
+ /* Reposition light in reflected space. */
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
+
+ draw_objects(eyex, eyey, eyez);
+ gl.glPopMatrix();
+
+ /* Restore light's original unreflected position. */
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
+ }
+
+ /* draw table into color planes (textured this time) */
+ gl.glDisable(GL_STENCIL_TEST);
+
+ gl.glEnable(GL_BLEND);
+ gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ gl.glBindTexture(GL_TEXTURE_2D,textureid);
+ gl.glEnable(GL_TEXTURE_2D);
+ draw_table();
+ gl.glDisable(GL_TEXTURE_2D);
+ gl.glBindTexture(GL_TEXTURE_2D,0);
+ gl.glDisable(GL_BLEND);
+
+ /* view from top */
+ gl.glPushMatrix();
+
+ draw_objects(eyex, eyey, eyez);
+
+ gl.glPopMatrix();
+
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ //if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+
+ private void make_table()
+ {
+ float table_mat[] = { 1.0f, 1.0f, 1.0f, 0.6f };
+ float gray[] = { 0.4f, 0.4f, 0.4f, 1.0f };
+
+ table_list = gl.glGenLists(1);
+ gl.glNewList(table_list,GL_COMPILE);
+
+ /* load table's texture */
+ gl.glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,table_mat);
+ gl.glMaterialfv(GL_FRONT,GL_DIFFUSE,table_mat);
+ gl.glMaterialfv(GL_FRONT,GL_AMBIENT,gray);
+
+ /* draw textured square for the table */
+ gl.glPushMatrix();
+ gl.glScalef(4.0f, 4.0f, 4.0f);
+ gl.glBegin(GL_POLYGON);
+ gl.glNormal3f(0.0f, 1.0f, 0.0f);
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex3f(-1.0f, 0.0f, 1.0f);
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex3f( 1.0f, 0.0f, 1.0f);
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex3f( 1.0f, 0.0f, -1.0f);
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex3f(-1.0f, 0.0f, -1.0f);
+ gl.glEnd();
+ gl.glPopMatrix();
+
+ gl.glEndList();
+ }
+
+ private void make_objects()
+ {
+ int q;
+
+ float cyan[] = { 0.0f, 1.0f, 1.0f, 1.0f };
+ float green[] = { 0.2f, 1.0f, 0.2f, 1.0f };
+ float black[] = { 0.0f, 0.0f, 0.0f, 0.0f };
+
+ q = glu.gluNewQuadric();
+ glu.gluQuadricDrawStyle(q, GLU_FILL);
+ glu.gluQuadricNormals(q, GLU_SMOOTH);
+
+ objects_list[0] = gl.glGenLists(1);
+ gl.glNewList(objects_list[0], GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cyan );
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, black );
+ glu.gluCylinder(q, 0.5f, 0.5f, 1.0f, 15, 10);
+ gl.glEndList();
+
+ objects_list[1] = gl.glGenLists(1);
+ gl.glNewList(objects_list[1], GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, black);
+ glu.gluCylinder(q, 1.5, 0.0f, 2.5f, 15, 10);
+ gl.glEndList();
+ }
+
+
+ private void draw_objects(float eyex, float eyey, float eyez)
+ {
+ gl.glPushMatrix();
+ gl.glTranslatef(1.0f, 1.5f, 0.0f);
+ gl.glRotatef(spin, 1.0f, 0.5f, 0.0f);
+ gl.glRotatef(0.5f*spin, 0.0f, 0.5f, 1.0f);
+ gl.glCallList(objects_list[0]);
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(-1.0f, 0.85f+3.0f*(float)Math.abs((float)Math.cos(0.01f*spin)),0.0f);
+ gl.glRotatef(0.5f*spin, 0.0f, 0.5f, 1.0f);
+ gl.glRotatef(spin, 1.0f, 0.5f, 0.0f);
+ gl.glScalef(0.5f, 0.5f, 0.5f);
+ gl.glCallList(objects_list[1]);
+ gl.glPopMatrix();
+ }
+
+ private void draw_table()
+ {
+ gl.glCallList(table_list);
+ }
+
+ float[] MatrixTransform(float m[], float vx, float vy, float vz, float vw)
+ {
+ float v[] = new float[4];
+ float nx, ny, nz, nw, ninvw;
+
+ nx = ((vx*m[0])+(vy*m[4])+(vz*m[ 8])+(vw*m[12]));
+ ny = ((vx*m[1])+(vy*m[5])+(vz*m[ 9])+(vw*m[13]));
+ nz = ((vx*m[2])+(vy*m[6])+(vz*m[10])+(vw*m[14]));
+ nw = ((vx*m[3])+(vy*m[7])+(vz*m[11])+(vw*m[15]));
+ if ( (nw != 0.0f) && (nw != 1.0f) )
+ {
+ ninvw = 1.0f/nw;
+ nx *= ninvw;
+ ny *= ninvw;
+ nz *= ninvw;
+ }
+ v[0] = nx;
+ v[1] = ny;
+ v[2] = nz;
+ v[3] = 1.0f;
+ return(v);
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ prevMouseX = evt.getX();
+ prevMouseY = evt.getY();
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ mouseRButtonDown = true;
+ evt.consume();
+ }
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ mouseRButtonDown = false;
+ evt.consume();
+ }
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ }
+
+ // Methods required for the implementation of MouseMotionListener
+ public void mouseDragged( MouseEvent evt )
+ {
+ int x = evt.getX();
+ int y = evt.getY();
+ float thetaX = (float)(x-prevMouseX)*(360.0f/(float)getSize().width);
+ float thetaY = (float)(prevMouseY-y)*(360.0f/(float)getSize().height);
+ float mtxbuf[] = new float[16];
+ float mtxbuf2[] = new float[16];
+
+ prevMouseX = x;
+ prevMouseY = y;
+ if ( (thetaX != 0.0f) || (thetaY != 0.0f) )
+ {
+// This is a special hack for this applet only, due to
+// the fact that we are not using a rotation matrix!!!
+ yrot += thetaX;
+ while (yrot < 0.0f) yrot += 360.0f;
+ while (yrot >= 360.0f) yrot -= 360.0f;
+
+ xrot -= thetaY;
+ if (xrot > 90.0f)
+ xrot = 90.0f;
+ else if (xrot < -90.0f)
+ xrot = -90.0f;
+ }
+ evt.consume();
+ }
+
+ public void mouseMoved( MouseEvent evt )
+ {
+ }
+ }
+}
diff --git a/demos/RonsDemos/reflect_plugin13.html b/demos/RonsDemos/reflect_plugin13.html
new file mode 100644
index 0000000..306e8d6
--- /dev/null
+++ b/demos/RonsDemos/reflect_plugin13.html
@@ -0,0 +1,53 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Reflect by Brian Paul; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Reflect applet
+<br>Originially written by Brian Paul
+<br>Ported to Java by Ron Cemer
+<br>
+<hr>You can rotate the view by holding the left mouse button down and
+<br>dragging the mouse within the applet's window.
+<br>If you hold the right button down instead, the view will rotate
+<br>around the Z axis.
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "reflect.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "reflect.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "reflect.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "reflect.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/renormal.html b/demos/RonsDemos/renormal.html
new file mode 100644
index 0000000..c0aa238
--- /dev/null
+++ b/demos/RonsDemos/renormal.html
@@ -0,0 +1,18 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Renormal by Brian Paul; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Renormal applet
+<br>Originially written by Brian Paul
+<br>Ported to Java by Ron Cemer
+<br>
+<hr>
+<applet code="renormal.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/renormal.java b/demos/RonsDemos/renormal.java
new file mode 100644
index 0000000..783bf15
--- /dev/null
+++ b/demos/RonsDemos/renormal.java
@@ -0,0 +1,112 @@
+/**
+ * @(#) renormal.java
+ * @(#) author: Brian Paul (converted to Java by Ron Cemer)
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class renormal extends SimpleGLAnimApplet1
+{
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new renormalCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class renormalCanvas extends GLAnimCanvas
+ {
+ private static final float M_PI = 3.14159265359f;
+ private float Phi = 0.0f;
+
+ public renormalCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ float mat[] = { 0.8f, 0.8f, 0.0f, 1.0f };
+ float pos[] = { -1.0f, 1.0f, 1.0f, 0.0f };
+
+ /* setup lighting, etc */
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ gl.glEnable(GL_CULL_FACE);
+ gl.glEnable(GL_NORMALIZE);
+
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glFrustum(-1.0f, 1.0f, -1.0f, 1.0f, 5.0f, 25.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glTranslatef(0.0f, 0.0f, -15.0f);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ Phi += 0.05f;
+ while (Phi >= (M_PI*2.0f)) Phi -= (M_PI*2.0f);
+
+ float scale = 0.6f + (0.5f * (float)Math.sin(Phi));
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+ gl.glPushMatrix();
+ gl.glScalef(scale, scale, scale);
+
+ int qobj = glu.gluNewQuadric();
+ glu.gluQuadricOrientation(qobj,GLU_OUTSIDE);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluQuadricTexture(qobj,false);
+ glu.gluSphere(qobj,2.0f,40,40);
+ glu.gluDeleteQuadric(qobj);
+
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ //if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+ }
+}
diff --git a/demos/RonsDemos/renormal_plugin13.html b/demos/RonsDemos/renormal_plugin13.html
new file mode 100644
index 0000000..d40bb7b
--- /dev/null
+++ b/demos/RonsDemos/renormal_plugin13.html
@@ -0,0 +1,49 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Renormal by Brian Paul; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Renormal applet
+<br>Originially written by Brian Paul
+<br>Ported to Java by Ron Cemer
+<br>
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "renormal.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "renormal.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "renormal.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "renormal.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/rings.html b/demos/RonsDemos/rings.html
new file mode 100644
index 0000000..a393253
--- /dev/null
+++ b/demos/RonsDemos/rings.html
@@ -0,0 +1,18 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Rings by Philip Winston; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Rings applet
+<br>Originially written by Philip Winston
+<br>Ported to Java by Ron Cemer
+<br>Right-click within the window for a menu of commands.
+<br>
+<applet code="rings.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/rings.java b/demos/RonsDemos/rings.java
new file mode 100644
index 0000000..8a08bb5
--- /dev/null
+++ b/demos/RonsDemos/rings.java
@@ -0,0 +1,406 @@
+/**
+ * @(#) rings.java
+ * @(#) author: Philip Winston (converted to Java by Ron Cemer)
+ */
+
+/*
+ * Homework 4, Part 1: perspective, hierarchical coords, moving eye pos.
+ *
+ * Do a slow zoom on a bunch of rings (ala Superman III?)
+ *
+ * Philip Winston - 2/21/95
+ * http://www.cs.hmc.edu/people/pwinston
+ *
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class rings extends SimpleGLAnimApplet1
+{
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new ringsCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class ringsCanvas extends GLAnimCanvas
+ implements MouseListener, ActionListener
+ {
+ private final double M_PI = 3.14159265;
+ private final String MENU_STARTOVER = "Start Over";
+ private final String MENU_ZOOM_OUT = "Zoom Out";
+ private final String MENU_START_RINGS = "Start rings";
+ private final String MENU_STOP_RINGS = "Stop rings";
+ private final String MENU_START_FADE = "Start fade";
+ private final String MENU_STOP_FADE = "Stop fade";
+ private final int CONE = 1, TORUS = 2, INNERMAT = 3, OUTTERMAT = 4;
+ private final double STEPS = 30.0;
+
+ private PopupMenu menu = null;
+ private boolean menu_showing = false;
+ private boolean save_suspended = false;
+ private boolean Fade = true; /* Start moving out */
+ private float Axis = 0.0f;
+ private float AxisInc = (float)(2.0 * M_PI / STEPS);
+ private float InnerRad, OutterRad, Tilt, Trans, TransCone, Dist;
+
+ public ringsCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ float sinoftilt;
+ InnerRad = 0.70f;
+ OutterRad = 5.0f;
+ Tilt = 15.0f;
+ Dist = 10.0f;
+ sinoftilt = (float)Math.sin(Tilt * M_PI*2.0/360.0);
+ Trans = (float)
+ ((2.0f*OutterRad + InnerRad) * sinoftilt +
+ InnerRad +
+ ((1 - sinoftilt) * InnerRad) - (InnerRad * 0.1));
+ TransCone = Trans + (OutterRad * sinoftilt + InnerRad);
+ /* I used code from the book's accnot.c as a starting
+ point for lighting. I have one positional light in
+ center, then one directional */
+ float light0_position[] = { 1.0f, 0.2f, 1.0f, 0.0f };
+ float light1_position[] = { 0.0f, 0.0f, 0.0f, 1.0f };
+ float light1_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float light1_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float lm_ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
+
+ gl.glEnable(GL_NORMALIZE);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
+ gl.glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
+ gl.glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
+ gl.glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);
+ gl.glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.2f);
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lm_ambient);
+
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_LIGHT1);
+
+ gl.glDepthFunc(GL_LESS);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ // Make display lists
+
+ float cone_diffuse[] = { 0.0f, 0.7f, 0.7f, 1.0f };
+ float mat1_ambient[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float mat2_ambient[] = { 0.0f, 0.0f, 0.0f, 0.0f };
+ float torus1_diffuse[] = { 0.7f, 0.7f, 0.0f, 1.0f };
+ float torus2_diffuse[] = { 0.3f, 0.0f, 0.0f, 1.0f };
+ float mat1_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float mat2_specular[] = { 0.5f, 0.5f, 0.5f, 1.0f };
+
+ gl.glNewList(INNERMAT, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat1_specular);
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, 50.0f);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, torus1_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat1_ambient);
+ gl.glEndList();
+
+ gl.glNewList(OUTTERMAT, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat2_specular);
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, 25.0f);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, torus2_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat2_ambient);
+ gl.glEndList();
+
+ gl.glNewList(CONE, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, cone_diffuse);
+ gl.glPushMatrix();
+ gl.glTranslatef(0, -TransCone, 0);
+ gl.glRotatef(90, 1, 0, 0);
+ glutSolidCone(OutterRad, 10, 8, 8);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ gl.glNewList(TORUS, GL_COMPILE);
+ gl.glPushMatrix();
+ gl.glRotatef(90, 1, 0, 0);
+ glutSolidTorus(InnerRad, OutterRad, 15, 25);
+ gl.glPopMatrix();
+ gl.glEndList();
+
+ glj.gljCheckGL();
+
+ menu = new PopupMenu("Options");
+ menu.add(MENU_STARTOVER);
+ menu.add(MENU_ZOOM_OUT);
+ menu.add(MENU_START_RINGS);
+ menu.add(MENU_STOP_RINGS);
+ menu.add(MENU_START_FADE);
+ menu.add(MENU_STOP_FADE);
+ menu.addActionListener(this);
+ add(menu);
+
+ addMouseListener(this);
+ }
+
+ public void doCleanup()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ menu.removeActionListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ Axis += AxisInc;
+
+ if ( (Dist < 15.0f) && (Fade) ) /* start slow */
+ Dist += 0.1f;
+ else if ( (Dist < 800.0f) && (Fade) ) /* don't go back too far */
+ Dist *= 1.005f;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glFrustum(-1.0f,1.0f,-1.0f,1.0f,10.0f,1000.0f);
+ glu.gluLookAt(0.0f,0.0f,Dist,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f);
+
+ gl.glMatrixMode(GL_MODELVIEW);
+
+ gl.glCallList(INNERMAT);
+ DrawRings(Axis);
+ gl.glCallList(CONE);
+
+ gl.glCallList(OUTTERMAT);
+ gl.glPushMatrix();
+ gl.glScalef(10, 10, 10);
+ DrawRings(Axis/3.0f);
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ //if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered(MouseEvent evt)
+ {
+ }
+
+ public void mouseExited(MouseEvent evt)
+ {
+ }
+
+ public void mousePressed(MouseEvent evt)
+ {
+ // If user presses right mouse button within canvas area,
+ // suspend animation and pop up menu.
+ // If menu was already popped up and user presses either
+ // mouse button within canvas area, resume animation
+ // because the menu will have been removed automatically.
+ if (!menu_showing)
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ menu_showing = true;
+ save_suspended = isSuspended();
+ if (!save_suspended)
+ {
+ setSuspended(true);
+ repaint(100);
+ try
+ {
+ Thread.currentThread().sleep(200);
+ }
+ catch (Exception e)
+ { }
+ }
+ menu.show(this,evt.getX(),evt.getY());
+ }
+ }
+ else
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+
+ public void mouseReleased(MouseEvent evt)
+ {
+ }
+
+ public void mouseClicked(MouseEvent evt)
+ {
+ }
+
+ // Method required for the implementation of ActionListener
+ public void actionPerformed(ActionEvent evt)
+ {
+ String c = evt.getActionCommand();
+ if (c.equals(MENU_STARTOVER))
+ {
+ Dist = 10.0f;
+ Axis = 0.0f;
+ Fade = true;
+ AxisInc = (float)(2.0 * M_PI / STEPS);
+ }
+ else if (c.equals(MENU_ZOOM_OUT))
+ {
+ Dist = 800.0f;
+ }
+ else if (c.equals(MENU_START_RINGS))
+ {
+ AxisInc = (float)(2.0 * M_PI / STEPS);
+ }
+ else if (c.equals(MENU_STOP_RINGS))
+ {
+ AxisInc = 0.0f;
+ }
+ else if (c.equals(MENU_START_FADE))
+ {
+ Fade = true;
+ }
+ else if (c.equals(MENU_STOP_FADE))
+ {
+ Fade = false;
+ }
+ if (menu_showing)
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+
+ /* Draw three rings, rotated and translate so they look cool */
+ private void DrawRings(float axis)
+ {
+ float x = (float)Math.sin(axis), y = (float)Math.cos(axis);
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, Trans, 0.0f);
+ gl.glRotatef(Tilt, x, 0.0f, y);
+ gl.glCallList(TORUS);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(-Tilt, x, 0.0f, y);
+ gl.glCallList(TORUS);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, -Trans, 0.0f);
+ gl.glRotatef(Tilt, x, 0.0f, y);
+ gl.glCallList(TORUS);
+ gl.glPopMatrix();
+ }
+
+ // Imported from glut.
+ private void glutSolidTorus
+ (float innerRadius,
+ float outerRadius,
+ int nsides,
+ int rings)
+ {
+ doughnut(innerRadius, outerRadius, nsides, rings);
+ }
+
+ // Imported from glut.
+ private void glutSolidCone
+ (float base,
+ float height,
+ int slices,
+ int stacks)
+ {
+ int qobj = glu.gluNewQuadric();
+
+ glu.gluQuadricDrawStyle(qobj,GLU_FILL);
+ glu.gluQuadricNormals(qobj,GLU_SMOOTH);
+ glu.gluCylinder(qobj,base,0.0f,height,slices,stacks);
+ glu.gluDeleteQuadric(qobj);
+ }
+
+ // Imported from glut.
+ private void doughnut(float r, float R, int nsides, int rings)
+ {
+ int i, j;
+ float theta, phi, theta1;
+ float cosTheta, sinTheta;
+ float cosTheta1, sinTheta1;
+ float ringDelta, sideDelta;
+
+ ringDelta = 2.0f * (float)M_PI / rings;
+ sideDelta = 2.0f * (float)M_PI / nsides;
+
+ theta = 0.0f;
+ cosTheta = 1.0f;
+ sinTheta = 0.0f;
+ for (i = rings - 1; i >= 0; i--)
+ {
+ theta1 = theta + ringDelta;
+ cosTheta1 = (float)Math.cos(theta1);
+ sinTheta1 = (float)Math.sin(theta1);
+ gl.glBegin(GL_QUAD_STRIP);
+ phi = 0.0f;
+ for (j = nsides; j >= 0; j--)
+ {
+ float cosPhi, sinPhi, dist;
+
+ phi += sideDelta;
+ cosPhi = (float)Math.cos(phi);
+ sinPhi = (float)Math.sin(phi);
+ dist = R + r * cosPhi;
+
+ gl.glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi);
+ gl.glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi);
+ gl.glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi);
+ gl.glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi);
+ }
+ gl.glEnd();
+ theta = theta1;
+ cosTheta = cosTheta1;
+ sinTheta = sinTheta1;
+ }
+ }
+ }
+}
diff --git a/demos/RonsDemos/rings_plugin13.html b/demos/RonsDemos/rings_plugin13.html
new file mode 100644
index 0000000..48ac24c
--- /dev/null
+++ b/demos/RonsDemos/rings_plugin13.html
@@ -0,0 +1,49 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Rings by Philip Winston; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Rings applet
+<br>Originially written by Philip Winston
+<br>Ported to Java by Ron Cemer
+<br>Right-click within the window for a menu of commands.
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "rings.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "rings.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "rings.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "rings.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/sappletviewer.bat b/demos/RonsDemos/sappletviewer.bat
new file mode 100755
index 0000000..90f7666
--- /dev/null
+++ b/demos/RonsDemos/sappletviewer.bat
@@ -0,0 +1 @@
+appletviewer.exe -J-Djava.security.policy=gl4java.policy %*
diff --git a/demos/RonsDemos/sappletviewer.sh b/demos/RonsDemos/sappletviewer.sh
new file mode 100755
index 0000000..7add0f7
--- /dev/null
+++ b/demos/RonsDemos/sappletviewer.sh
@@ -0,0 +1,3 @@
+#! /bin/sh
+
+appletviewer -J-Djava.security.policy=gl4java.policy $*
diff --git a/demos/RonsDemos/scube.html b/demos/RonsDemos/scube.html
new file mode 100644
index 0000000..b889faf
--- /dev/null
+++ b/demos/RonsDemos/scube.html
@@ -0,0 +1,27 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Scube by David G Yu/Mark J. Kilgard/Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Scube applet
+<br>Originially written by David G Yu/Mark J. Kilgard/Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>Click inside the window, then press any of the following keys:
+<br>L/l: toggle lighting
+<br>S/s: toggle SGI logo on/off
+<br>Q/q: toggle between quads and polygons for drawing
+<br>F/f: toggle fog
+<br>1: linear fog mode
+<br>2: exponential fog mode
+<br>3: exponential squared fog mode
+<br>p/P: toggle motion (pause/resume)
+<br>spacebar: single-step while paused
+<br>
+<applet code="scube.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/scube.java b/demos/RonsDemos/scube.java
new file mode 100644
index 0000000..f06cc4e
--- /dev/null
+++ b/demos/RonsDemos/scube.java
@@ -0,0 +1,590 @@
+/**
+ * @(#) scube.java
+ * @(#) author: David G Yu/Mark J. Kilgard/Silicon Graphics (converted to Java by Ron Cemer)
+ */
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/**
+ * (c) Copyright 1993, 1994, 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.
+ */
+
+/*
+ * 1992 David G Yu -- Silicon Graphics Computer Systems
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class scube extends SimpleGLAnimApplet1
+{
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new scubeCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class scubeCanvas extends GLAnimCanvas
+ implements KeyListener, MouseListener
+ {
+ private static final int
+ GREY=0,RED=1,GREEN=2,BLUE=3,CYAN=4,MAGENTA=5,YELLOW=6,BLACK=7;
+
+ private float materialColor[][] =
+ {
+ {0.8f, 0.8f, 0.8f, 1.0f},
+ {0.8f, 0.0f, 0.0f, 1.0f},
+ {0.0f, 0.8f, 0.0f, 1.0f},
+ {0.0f, 0.0f, 0.8f, 1.0f},
+ {0.0f, 0.8f, 0.8f, 1.0f},
+ {0.8f, 0.0f, 0.8f, 1.0f},
+ {0.8f, 0.8f, 0.0f, 1.0f},
+ {0.0f, 0.0f, 0.0f, 0.6f},
+ };
+
+ private float lightPos[] = {2.0f, 4.0f, 2.0f, 1.0f};
+ private float lightAmb[] = {0.2f, 0.2f, 0.2f, 1.0f};
+ private float lightDiff[] = {0.8f, 0.8f, 0.8f, 1.0f};
+ private float lightSpec[] = {0.4f, 0.4f, 0.4f, 1.0f};
+
+ private float groundPlane[] = {0.0f, 1.0f, 0.0f, 1.499f};
+ private float backPlane[] = {0.0f, 0.0f, 1.0f, 0.899f};
+
+ private float fogColor[] = {0.0f, 0.0f, 0.0f, 0.0f};
+ private float fogIndex[] = {0.0f};
+
+ private byte shadowPattern[] =
+ {
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55, /* 50% Grey */
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55,
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55,
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55,
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55,
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55,
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55,
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55,
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55,
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55,
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55,
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55,
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55,
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55,
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55,
+ (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0xaa, (byte)0x55, (byte)0x55, (byte)0x55, (byte)0x55
+ };
+
+ private byte sgiPattern[] =
+ {
+ (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, /* SGI Logo */
+ (byte)0xff, (byte)0xbd, (byte)0xff, (byte)0x83, (byte)0xff, (byte)0x5a, (byte)0xff, (byte)0xef,
+ (byte)0xfe, (byte)0xdb, (byte)0x7f, (byte)0xef, (byte)0xfd, (byte)0xdb, (byte)0xbf, (byte)0xef,
+ (byte)0xfb, (byte)0xdb, (byte)0xdf, (byte)0xef, (byte)0xf7, (byte)0xdb, (byte)0xef, (byte)0xef,
+ (byte)0xfb, (byte)0xdb, (byte)0xdf, (byte)0xef, (byte)0xfd, (byte)0xdb, (byte)0xbf, (byte)0x83,
+ (byte)0xce, (byte)0xdb, (byte)0x73, (byte)0xff, (byte)0xb7, (byte)0x5a, (byte)0xed, (byte)0xff,
+ (byte)0xbb, (byte)0xdb, (byte)0xdd, (byte)0xc7, (byte)0xbd, (byte)0xdb, (byte)0xbd, (byte)0xbb,
+ (byte)0xbe, (byte)0xbd, (byte)0x7d, (byte)0xbb, (byte)0xbf, (byte)0x7e, (byte)0xfd, (byte)0xb3,
+ (byte)0xbe, (byte)0xe7, (byte)0x7d, (byte)0xbf, (byte)0xbd, (byte)0xdb, (byte)0xbd, (byte)0xbf,
+ (byte)0xbb, (byte)0xbd, (byte)0xdd, (byte)0xbb, (byte)0xb7, (byte)0x7e, (byte)0xed, (byte)0xc7,
+ (byte)0xce, (byte)0xdb, (byte)0x73, (byte)0xff, (byte)0xfd, (byte)0xdb, (byte)0xbf, (byte)0xff,
+ (byte)0xfb, (byte)0xdb, (byte)0xdf, (byte)0x87, (byte)0xf7, (byte)0xdb, (byte)0xef, (byte)0xfb,
+ (byte)0xf7, (byte)0xdb, (byte)0xef, (byte)0xfb, (byte)0xfb, (byte)0xdb, (byte)0xdf, (byte)0xfb,
+ (byte)0xfd, (byte)0xdb, (byte)0xbf, (byte)0xc7, (byte)0xfe, (byte)0xdb, (byte)0x7f, (byte)0xbf,
+ (byte)0xff, (byte)0x5a, (byte)0xff, (byte)0xbf, (byte)0xff, (byte)0xbd, (byte)0xff, (byte)0xc3,
+ (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff
+ };
+
+ private float cube_vertexes[][][] =
+ {
+ {
+ {-1.0f, -1.0f, -1.0f, 1.0f},
+ {-1.0f, -1.0f, 1.0f, 1.0f},
+ {-1.0f, 1.0f, 1.0f, 1.0f},
+ {-1.0f, 1.0f, -1.0f, 1.0f}
+ },
+ {
+ {1.0f, 1.0f, 1.0f, 1.0f},
+ {1.0f, -1.0f, 1.0f, 1.0f},
+ {1.0f, -1.0f, -1.0f, 1.0f},
+ {1.0f, 1.0f, -1.0f, 1.0f}
+ },
+ {
+ {-1.0f, -1.0f, -1.0f, 1.0f},
+ {1.0f, -1.0f, -1.0f, 1.0f},
+ {1.0f, -1.0f, 1.0f, 1.0f},
+ {-1.0f, -1.0f, 1.0f, 1.0f}
+ },
+ {
+ {1.0f, 1.0f, 1.0f, 1.0f},
+ {1.0f, 1.0f, -1.0f, 1.0f},
+ {-1.0f, 1.0f, -1.0f, 1.0f},
+ {-1.0f, 1.0f, 1.0f, 1.0f}
+ },
+ {
+ {-1.0f, -1.0f, -1.0f, 1.0f},
+ {-1.0f, 1.0f, -1.0f, 1.0f},
+ {1.0f, 1.0f, -1.0f, 1.0f},
+ {1.0f, -1.0f, -1.0f, 1.0f}
+ },
+ {
+ {1.0f, 1.0f, 1.0f, 1.0f},
+ {-1.0f, 1.0f, 1.0f, 1.0f},
+ {-1.0f, -1.0f, 1.0f, 1.0f},
+ {1.0f, -1.0f, 1.0f, 1.0f}
+ }
+ };
+
+ private float cube_normals[][] =
+ {
+ {-1.0f, 0.0f, 0.0f, 0.0f},
+ {1.0f, 0.0f, 0.0f, 0.0f},
+ {0.0f, -1.0f, 0.0f, 0.0f},
+ {0.0f, 1.0f, 0.0f, 0.0f},
+ {0.0f, 0.0f, -1.0f, 0.0f},
+ {0.0f, 0.0f, 1.0f, 0.0f}
+ };
+
+ private boolean useLighting = true;
+ private boolean useFog = false;
+ private boolean useLogo = false;
+ private boolean useQuads = true;
+ private int tick = -1;
+
+ public scubeCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ /* setup context */
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glFrustum(-1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 3.0f);
+
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glTranslatef(0.0f, 0.0f, -2.0f);
+
+ gl.glEnable(GL_DEPTH_TEST);
+
+ if (useLighting) gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmb);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiff);
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpec);
+
+ gl.glEnable(GL_NORMALIZE);
+
+ if (useFog) gl.glEnable(GL_FOG);
+ gl.glFogfv(GL_FOG_COLOR, fogColor);
+ gl.glFogfv(GL_FOG_INDEX, fogIndex);
+ gl.glFogf(GL_FOG_MODE, GL_EXP);
+ gl.glFogf(GL_FOG_DENSITY, 0.5f);
+ gl.glFogf(GL_FOG_START, 1.0f);
+ gl.glFogf(GL_FOG_END, 3.0f);
+
+ gl.glEnable(GL_CULL_FACE);
+ gl.glCullFace(GL_BACK);
+
+ gl.glShadeModel(GL_SMOOTH);
+
+ gl.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ if (useLogo)
+ gl.glPolygonStipple(sgiPattern);
+ else
+ gl.glPolygonStipple(shadowPattern);
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ gl.glClearIndex(0);
+ gl.glClearDepth(1);
+
+ glj.gljCheckGL();
+
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+ public void doCleanup()
+ {
+ System.out.println("destroy(): " + this);
+ removeKeyListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+
+// Put any custom reshape code here.
+
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ if (!isSuspended()) inctick();
+
+ float cubeXform[] = new float[16];
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, -1.5f, 0.0f);
+ gl.glRotatef(-90.0f, 1f, 0f, 0f);
+ gl.glScalef(2.0f, 2.0f, 2.0f);
+
+ drawCheck(6, 6, BLUE, YELLOW); /* draw ground */
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, 0.0f, -0.9f);
+ gl.glScalef(2.0f, 2.0f, 2.0f);
+
+ drawCheck(6, 6, BLUE, YELLOW); /* draw back */
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, 0.2f, 0.0f);
+ gl.glScalef(0.3f, 0.3f, 0.3f);
+ gl.glRotatef((360.0f / (30 * 1)) * tick, 1f, 0f, 0f);
+ gl.glRotatef((360.0f / (30 * 2)) * tick, 0f, 1f, 0f);
+ gl.glRotatef((360.0f / (30 * 4)) * tick, 0f, 0f, 1f);
+ gl.glScalef(1.0f, 2.0f, 1.0f);
+ gl.glGetFloatv(GL_MODELVIEW_MATRIX, cubeXform);
+
+ drawCube(RED); /* draw cube */
+ gl.glPopMatrix();
+
+ gl.glDepthMask(false);
+ gl.glEnable(GL_POLYGON_STIPPLE);
+ if (useFog) gl.glDisable(GL_FOG);
+ gl.glPushMatrix();
+ myShadowMatrix(groundPlane, lightPos);
+ gl.glTranslatef(0.0f, 0.0f, 2.0f);
+ gl.glMultMatrixf(cubeXform);
+
+ drawCube(BLACK); /* draw ground shadow */
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ myShadowMatrix(backPlane, lightPos);
+ gl.glTranslatef(0.0f, 0.0f, 2.0f);
+ gl.glMultMatrixf(cubeXform);
+
+ drawCube(BLACK); /* draw back shadow */
+ gl.glPopMatrix();
+
+ gl.glDepthMask(true);
+ gl.glDisable(GL_POLYGON_STIPPLE);
+ if (useFog) gl.glEnable(GL_FOG);
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ //if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+
+ // Methods required for the implementation of KeyListener
+ public void keyPressed(KeyEvent e)
+ {
+ }
+
+ public void keyReleased(KeyEvent e)
+ {
+ }
+
+ public void keyTyped(KeyEvent e)
+ {
+ if (glj.gljMakeCurrent() == false) return;
+ boolean dorepaint = false;
+ switch ((char)e.getKeyChar())
+ {
+ case 'L':
+ case 'l':
+ useLighting = !useLighting;
+ if (useLighting)
+ gl.glEnable(GL_LIGHTING);
+ else
+ gl.glDisable(GL_LIGHTING);
+ dorepaint = isSuspended();
+ break;
+ case 'S':
+ case 's':
+ useLogo = !useLogo;
+ if (useLogo)
+ gl.glPolygonStipple(sgiPattern);
+ else
+ gl.glPolygonStipple(shadowPattern);
+ dorepaint = isSuspended();
+ break;
+ case 'Q':
+ case 'q':
+ useQuads = !useQuads;
+ dorepaint = isSuspended();
+ break;
+ case 'F':
+ case 'f':
+ useFog = !useFog;
+ if (useFog)
+ gl.glEnable(GL_FOG);
+ else
+ gl.glDisable(GL_FOG);
+ dorepaint = isSuspended();
+ break;
+ case '1':
+ gl.glFogf(GL_FOG_MODE, GL_LINEAR);
+ dorepaint = isSuspended();
+ break;
+ case '2':
+ gl.glFogf(GL_FOG_MODE, GL_EXP);
+ dorepaint = isSuspended();
+ break;
+ case '3':
+ gl.glFogf(GL_FOG_MODE, GL_EXP2);
+ dorepaint = isSuspended();
+ break;
+ case 'P':
+ case 'p':
+ setSuspended(!isSuspended());
+ break;
+ case ' ':
+ if (isSuspended())
+ {
+ inctick();
+ dorepaint = true;
+ }
+ break;
+ }
+ glj.gljFree();
+ if (dorepaint) repaint();
+ }
+
+ private void inctick()
+ {
+ tick++;
+ if (tick >= 120) tick = 0;
+ }
+
+ private void setColor(int c)
+ {
+ if (useLighting)
+ gl.glMaterialfv
+ (GL_FRONT_AND_BACK,
+ GL_AMBIENT_AND_DIFFUSE,
+ materialColor[c]);
+ else
+ gl.glColor4fv(materialColor[c]);
+ }
+
+ private void drawCube(int color)
+ {
+ setColor(color);
+
+ for (int i = 0; i < 6; ++i)
+ {
+ gl.glNormal3fv(cube_normals[i]);
+ gl.glBegin(GL_POLYGON);
+ gl.glVertex4fv(cube_vertexes[i][0]);
+ gl.glVertex4fv(cube_vertexes[i][1]);
+ gl.glVertex4fv(cube_vertexes[i][2]);
+ gl.glVertex4fv(cube_vertexes[i][3]);
+ gl.glEnd();
+ }
+ }
+
+ private boolean check_initialized = false;
+ private boolean check_usedLighting = false;
+ private boolean check_usedQuads = false;
+ private int checklist = 0;
+
+ private void drawCheck(int w, int h, int evenColor, int oddColor)
+ {
+ if ( (!check_initialized)
+ || (check_usedLighting != useLighting)
+ || (check_usedQuads != useQuads) )
+ {
+ float square_normal[] = {0.0f, 0.0f, 1.0f, 0.0f};
+ float square[][] = new float[4][4];
+ int i, j;
+
+ if (checklist == 0) checklist = gl.glGenLists(1);
+ gl.glNewList(checklist, GL_COMPILE_AND_EXECUTE);
+ if (useQuads)
+ {
+ gl.glNormal3fv(square_normal);
+ gl.glBegin(GL_QUADS);
+ }
+ for (j = 0; j < h; ++j)
+ {
+ for (i = 0; i < w; ++i)
+ {
+ square[0][0] = -1.0f + 2.0f / w * i;
+ square[0][1] = -1.0f + 2.0f / h * (j + 1);
+ square[0][2] = 0.0f;
+ square[0][3] = 1.0f;
+
+ square[1][0] = -1.0f + 2.0f / w * i;
+ square[1][1] = -1.0f + 2.0f / h * j;
+ square[1][2] = 0.0f;
+ square[1][3] = 1.0f;
+
+ square[2][0] = -1.0f + 2.0f / w * (i + 1);
+ square[2][1] = -1.0f + 2.0f / h * j;
+ square[2][2] = 0.0f;
+ square[2][3] = 1.0f;
+
+ square[3][0] = -1.0f + 2.0f / w * (i + 1);
+ square[3][1] = -1.0f + 2.0f / h * (j + 1);
+ square[3][2] = 0.0f;
+ square[3][3] = 1.0f;
+
+ if ( ((i & 1) != 0) ^ ((j & 1) != 0) )
+ setColor(oddColor);
+ else
+ setColor(evenColor);
+
+ if (!useQuads)gl.glBegin(GL_POLYGON);
+ gl.glVertex4fv(square[0]);
+ gl.glVertex4fv(square[1]);
+ gl.glVertex4fv(square[2]);
+ gl.glVertex4fv(square[3]);
+ if (!useQuads) gl.glEnd();
+ }
+ }
+
+ if (useQuads) gl.glEnd();
+ gl.glEndList();
+
+ check_initialized = true;
+ check_usedLighting = useLighting;
+ check_usedQuads = useQuads;
+ }
+ else
+ gl.glCallList(checklist);
+ }
+
+ private void myShadowMatrix(float ground[], float light[])
+ {
+ float dot;
+ float shadowMat[] = new float[4*4];
+
+ dot =
+ ground[0] * light[0] +
+ ground[1] * light[1] +
+ ground[2] * light[2] +
+ ground[3] * light[3];
+
+ shadowMat[0] = dot - light[0] * ground[0];
+ shadowMat[4] = -light[0] * ground[1];
+ shadowMat[8] = -light[0] * ground[2];
+ shadowMat[12] = -light[0] * ground[3];
+
+ shadowMat[1] = -light[1] * ground[0];
+ shadowMat[5] = dot - light[1] * ground[1];
+ shadowMat[9] = -light[1] * ground[2];
+ shadowMat[13] = -light[1] * ground[3];
+
+ shadowMat[2] = -light[2] * ground[0];
+ shadowMat[6] = -light[2] * ground[1];
+ shadowMat[10] = dot - light[2] * ground[2];
+ shadowMat[14] = -light[2] * ground[3];
+
+ shadowMat[3] = -light[3] * ground[0];
+ shadowMat[7] = -light[3] * ground[1];
+ shadowMat[11] = -light[3] * ground[2];
+ shadowMat[15] = dot - light[3] * ground[3];
+
+ gl.glMultMatrixf(shadowMat);
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+ }
+}
diff --git a/demos/RonsDemos/scube_plugin13.html b/demos/RonsDemos/scube_plugin13.html
new file mode 100644
index 0000000..660f48f
--- /dev/null
+++ b/demos/RonsDemos/scube_plugin13.html
@@ -0,0 +1,58 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Scube by David G Yu/Mark J. Kilgard/Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Scube applet
+<br>Originially written by David G Yu/Mark J. Kilgard/Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>Click inside the window, then press any of the following keys:
+<br>L/l: toggle lighting
+<br>S/s: toggle SGI logo on/off
+<br>Q/q: toggle between quads and polygons for drawing
+<br>F/f: toggle fog
+<br>1: linear fog mode
+<br>2: exponential fog mode
+<br>3: exponential squared fog mode
+<br>p/P: toggle motion (pause/resume)
+<br>spacebar: single-step while paused
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "scube.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "scube.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "scube.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "scube.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/shadowvol.html b/demos/RonsDemos/shadowvol.html
new file mode 100644
index 0000000..e709826
--- /dev/null
+++ b/demos/RonsDemos/shadowvol.html
@@ -0,0 +1,18 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Shadowvol by Tom McReynolds, SGI; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Shadowvol applet
+<br>Originially written by Tom McReynolds, SGI
+<br>Ported to Java by Ron Cemer
+<br>Click inside the window to cycle the shadow and lighting mode.
+<br>
+<applet code="shadowvol.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/shadowvol.java b/demos/RonsDemos/shadowvol.java
new file mode 100644
index 0000000..f40f20b
--- /dev/null
+++ b/demos/RonsDemos/shadowvol.java
@@ -0,0 +1,458 @@
+/**
+ * @(#) shadowvol.java
+ * @(#) author: Tom McReynolds, SGI (converted to Java by Ron Cemer)
+ */
+
+/* Shadows: Shadow maps */
+/* Demonstrate shadow volumes */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+public class shadowvol extends Applet
+{
+ private static final int SPHERE = 1, CONE = 2, LIGHT = 3, SHADOWVOL = 4;
+ private static final int X = 0, Y = 1, Z = 2;
+ private static final int NONE = 0, NOLIGHT = 1, VOLUME = 2, SHADOW = 3;
+ private static final int TEXDIM = 256;
+
+ shadowvolCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new shadowvolCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+
+ /* Destroy the applet */
+
+
+ public void destroy()
+ {
+ canvas.cvsDispose();
+ }
+
+ private class ShadObj
+ {
+ float[] vertices;
+ float[] normal;
+ int n;
+ }
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class shadowvolCanvas extends GLCanvas implements MouseListener
+ {
+ private float shadVerts[] =
+ {
+ 30.0f, 30.0f, -350.0f,
+ 60.0f, 20.0f, -340.0f,
+ 40.0f, 40.0f, -400.0f
+ };
+ private float shadNormal[] =
+ {
+ 1.0f, 10.f, 1.0f
+ };
+ private float leftwallshadow[] = new float[16];
+ private float floorshadow[] = new float[16];
+ private float lightpos[] = { 50.0f, 50.0f, -340.0f, 1.0f };
+ private ShadObj shadower = new ShadObj();
+ private int rendermode = SHADOW;
+
+ public shadowvolCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ stencilBits = 3;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ byte tex[];
+ int sphere, cone, base;
+ float sphere_mat[] = {1.0f, 0.5f, 0.0f, 1.0f};
+ float cone_mat[] = {0.0f, 0.5f, 1.0f, 1.0f};
+
+ /* turn on features */
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_CULL_FACE);
+
+ /* place light 0 in the right place */
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
+
+ /* remove back faces to speed things up */
+ gl.glCullFace(GL_BACK);
+
+ gl.glTexParameteri
+ (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ /* make display lists for sphere and cone; for efficiency */
+
+ gl.glNewList(SPHERE, GL_COMPILE);
+ sphere = glu.gluNewQuadric();
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, sphere_mat);
+ glu.gluSphere(sphere, 20.0f, 20, 20);
+ glu.gluDeleteQuadric(sphere);
+ gl.glEndList();
+
+ gl.glNewList(CONE, GL_COMPILE);
+ cone = glu.gluNewQuadric();
+ base = glu.gluNewQuadric();
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cone_mat);
+ gl.glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
+ glu.gluDisk(base, 0., 20., 20, 1);
+ glu.gluCylinder(cone, 20., 0., 60., 20, 20);
+ glu.gluDeleteQuadric(cone);
+ glu.gluDeleteQuadric(base);
+ gl.glEndList();
+
+ gl.glNewList(LIGHT, GL_COMPILE);
+ sphere = glu.gluNewQuadric();
+ gl.glPushMatrix();
+ gl.glTranslatef(lightpos[X], lightpos[Y], lightpos[Z]);
+ gl.glDisable(GL_LIGHTING);
+ gl.glColor3f(0.9f, 0.9f, 0.6f);
+ glu.gluSphere(sphere, 5.0f, 20, 20);
+ gl.glEnable(GL_LIGHTING);
+ gl.glPopMatrix();
+ glu.gluDeleteQuadric(sphere);
+ gl.glEndList();
+
+ /* load pattern for current 2d texture */
+ tex = make_texture(TEXDIM, TEXDIM);
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,
+ 0,
+ 1,
+ TEXDIM,
+ TEXDIM,
+ 0,
+ GL_RED,
+ GL_UNSIGNED_BYTE,
+ tex);
+ tex = null;
+
+ shadower.vertices = shadVerts;
+ shadower.normal = shadNormal;
+ shadower.n = shadVerts.length/3;
+
+ makeShadowVolume(shadower, lightpos, 10.f, SHADOWVOL);
+
+ glj.gljCheckGL();
+
+ addMouseListener(this);
+ }
+
+ public void cvsDispose()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ super.cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ /* draw a perspective scene */
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glFrustum(-100.0f, 100.0f, -100.0f, 100.0f, 320.0f, 640.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+
+
+
+ gl.glClear
+ (GL_COLOR_BUFFER_BIT |
+ GL_DEPTH_BUFFER_BIT |
+ GL_STENCIL_BUFFER_BIT);
+ switch (rendermode)
+ {
+ case NONE:
+ render(shadower);
+ break;
+ case NOLIGHT:
+ gl.glDisable(GL_LIGHT0);
+ render(shadower);
+ gl.glEnable(GL_LIGHT0);
+ break;
+ case VOLUME:
+ render(shadower);
+ gl.glCallList(SHADOWVOL);
+ break;
+ case SHADOW:
+ gl.glColorMask(false, false, false, false);
+ render(shadower); /* render scene in depth buffer */
+ gl.glEnable(GL_STENCIL_TEST);
+ gl.glDepthMask(false);
+ gl.glStencilFunc(GL_ALWAYS, 0, 0);
+ gl.glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
+ gl.glCullFace(GL_BACK); /* increment using front face of shadow volume */
+ gl.glCallList(SHADOWVOL);
+ gl.glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
+ gl.glCullFace(GL_FRONT); /* increment using front face of shadow volume */
+ gl.glCallList(SHADOWVOL);
+ gl.glDepthMask(true);
+ gl.glColorMask(true, true, true, true);
+ gl.glCullFace(GL_BACK);
+ gl.glDepthFunc(GL_LEQUAL);
+ gl.glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+ gl.glStencilFunc(GL_EQUAL, 1, 1); /* draw shadowed part */
+ gl.glDisable(GL_LIGHT0);
+ render(shadower);
+ gl.glStencilFunc(GL_EQUAL, 0, 1); /* draw lit part */
+ gl.glEnable(GL_LIGHT0);
+ render(shadower);
+ gl.glDepthFunc(GL_LESS);
+ gl.glDisable(GL_STENCIL_TEST);
+ break;
+ }
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ rendermode++;
+ if (rendermode > SHADOW) rendermode = NONE;
+ repaint();
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ }
+
+ private byte[] make_texture(int maxs, int maxt)
+ {
+ byte texture[] = new byte[maxs*maxt];
+ for (int t = 0; t < maxt; t++)
+ {
+ for (int s = 0; s < maxs; s++)
+ {
+ texture[s + maxs * t] =
+ ( (((s >> 4) & 0x1) != 0) ^ (((t >> 4) & 0x1) != 0) ) ?
+ (byte)0xff :
+ (byte)0;
+ }
+ }
+ return texture;
+ }
+
+ /* simple way to extend a point to build shadow volume */
+ private void extend(float newvertex[], float light[], float vertex[], float t)
+ {
+ float delta[] = new float[3];
+
+ delta[X] = vertex[X] - light[X];
+ delta[Y] = vertex[Y] - light[Y];
+ delta[Z] = vertex[Z] - light[Z];
+
+ newvertex[X] = light[X] + delta[X] * t;
+ newvertex[Y] = light[Y] + delta[Y] * t;
+ newvertex[Z] = light[Z] + delta[Z] * t;
+ }
+
+ /* Create a shadow volume in a display list */
+ /* XXX light should have 4 compoents */
+ void makeShadowVolume(ShadObj shadower, float light[], float t, int dlist)
+ {
+ float v[] = new float[3], newv[] = new float[3];
+ int j;
+
+ gl.glNewList(dlist, GL_COMPILE);
+ gl.glDisable(GL_LIGHTING);
+ gl.glBegin(GL_QUADS);
+ /* for debugging */
+ gl.glColor3f(0.2f, 0.8f, 0.4f);
+ for (int i = 0; i < shadower.n; i++)
+ {
+ j = ((i + 1) % shadower.n);
+ v[0] = shadower.vertices[i * 3];
+ v[1] = shadower.vertices[(i * 3) + 1];
+ v[2] = shadower.vertices[(i * 3) + 2];
+ gl.glVertex3fv(v);
+ extend(newv, light, v, t);
+ gl.glVertex3fv(newv);
+ v[0] = shadower.vertices[j * 3];
+ v[1] = shadower.vertices[(j * 3) + 1];
+ v[2] = shadower.vertices[(j * 3) + 2];
+ extend(newv, light, v, t);
+ gl.glVertex3fv(newv);
+ gl.glVertex3fv(v);
+ }
+ gl.glEnd();
+ gl.glEnable(GL_LIGHTING);
+ gl.glEndList();
+ }
+
+ private void sphere()
+ {
+ gl.glPushMatrix();
+ gl.glTranslatef(60.0f, -50.0f, -360.0f);
+ gl.glCallList(SPHERE);
+ gl.glPopMatrix();
+ }
+
+ private void cone()
+ {
+ gl.glPushMatrix();
+ gl.glTranslatef(-40.0f, -40.0f, -400.0f);
+ gl.glCallList(CONE);
+ gl.glPopMatrix();
+ }
+
+ /* render while jittering the shadows */
+ private void render(ShadObj obj)
+ {
+ float shad_mat[] = {10.f, 0.1f, 0.1f, 1.0f};
+ float v[] = new float[3];
+ /* material properties for objects in scene */
+ float wall_mat[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ /* Note: wall vertices are ordered so they are all
+ front facing this lets me do back face culling to
+ speed things up. */
+
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, wall_mat);
+
+ /* floor */
+ /* make the floor textured */
+ gl.glEnable(GL_TEXTURE_2D);
+
+ /* Since we want to turn texturing on for floor only, we have
+ to make floor a separate glBegin()/glEnd() sequence. You
+ can't turn texturing on and off between begin and end calls */
+ gl.glBegin(GL_QUADS);
+ gl.glNormal3f(0.0f, 1.0f, 0.0f);
+ gl.glTexCoord2i(0, 0);
+ gl.glVertex3f(-100.0f, -100.0f, -320.0f);
+ gl.glTexCoord2i(1, 0);
+ gl.glVertex3f(100.0f, -100.0f, -320.0f);
+ gl.glTexCoord2i(1, 1);
+ gl.glVertex3f(100.0f, -100.0f, -520.0f);
+ gl.glTexCoord2i(0, 1);
+ gl.glVertex3f(-100.0f, -100.0f, -520.0f);
+ gl.glEnd();
+
+ gl.glDisable(GL_TEXTURE_2D);
+
+ /* walls */
+
+ gl.glBegin(GL_QUADS);
+ /* left wall */
+ gl.glNormal3f(1.0f, 0.0f, 0.0f);
+ gl.glVertex3f(-100.0f, -100.0f, -320.0f);
+ gl.glVertex3f(-100.0f, -100.0f, -520.0f);
+ gl.glVertex3f(-100.0f, 100.0f, -520.0f);
+ gl.glVertex3f(-100.0f, 100.0f, -320.0f);
+
+ /* right wall */
+ gl.glNormal3f(-1.0f, 0.0f, 0.0f);
+ gl.glVertex3f(100.0f, -100.0f, -320.0f);
+ gl.glVertex3f(100.0f, 100.0f, -320.0f);
+ gl.glVertex3f(100.0f, 100.0f, -520.0f);
+ gl.glVertex3f(100.0f, -100.0f, -520.0f);
+
+ /* ceiling */
+ gl.glNormal3f(0.0f, -1.0f, 0.0f);
+ gl.glVertex3f(-100.0f, 100.0f, -320.0f);
+ gl.glVertex3f(-100.0f, 100.0f, -520.0f);
+ gl.glVertex3f(100.0f, 100.0f, -520.0f);
+ gl.glVertex3f(100.0f, 100.0f, -320.0f);
+
+ /* back wall */
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+ gl.glVertex3f(-100.0f, -100.0f, -520.0f);
+ gl.glVertex3f(100.0f, -100.0f, -520.0f);
+ gl.glVertex3f(100.0f, 100.0f, -520.0f);
+ gl.glVertex3f(-100.0f, 100.0f, -520.0f);
+
+ gl.glEnd();
+
+ cone();
+
+ sphere();
+
+ gl.glCallList(LIGHT);
+
+ /* draw shadowing object */
+ gl.glMaterialfv
+ (GL_FRONT_AND_BACK,
+ GL_AMBIENT_AND_DIFFUSE,
+ shad_mat);
+ gl.glBegin(GL_POLYGON);
+ gl.glNormal3fv(obj.normal);
+ for (int i = 0; i < obj.n; i++)
+ {
+ int j = i * 3;
+ v[0] = obj.vertices[j];
+ v[1] = obj.vertices[j+1];
+ v[2] = obj.vertices[j+2];
+ gl.glVertex3fv(v);
+ }
+ gl.glEnd();
+ }
+ }
+}
diff --git a/demos/RonsDemos/shadowvol_plugin13.html b/demos/RonsDemos/shadowvol_plugin13.html
new file mode 100644
index 0000000..ed62530
--- /dev/null
+++ b/demos/RonsDemos/shadowvol_plugin13.html
@@ -0,0 +1,49 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Shadowvol by Tom McReynolds, SGI; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Shadowvol applet
+<br>Originially written by Tom McReynolds, SGI
+<br>Ported to Java by Ron Cemer
+<br>Click inside the window to cycle the shadow and lighting mode.
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "shadowvol.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "shadowvol.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "shadowvol.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "shadowvol.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/softshadow.html b/demos/RonsDemos/softshadow.html
new file mode 100644
index 0000000..be13230
--- /dev/null
+++ b/demos/RonsDemos/softshadow.html
@@ -0,0 +1,19 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Softshadow by Tom McReynolds, SGI; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Softshadow applet
+<br>Originially written by Tom McReynolds, SGI
+<br>Ported to Java by Ron Cemer
+<br>Click inside the window to enable/disable shadows.
+<br>NOTE: WHEN SHADOWS ARE ENABLED, IT MAY TAKE A FEW SECONDS TO DRAW THE SCENE.
+<br>
+<applet code="softshadow.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/softshadow.java b/demos/RonsDemos/softshadow.java
new file mode 100644
index 0000000..0d9e8ef
--- /dev/null
+++ b/demos/RonsDemos/softshadow.java
@@ -0,0 +1,528 @@
+/**
+ * @(#) softshadow.java
+ * @(#) author: Tom McReynolds, SGI (converted to Java by Ron Cemer)
+ */
+
+/* Using the accumulation buffer for soft shadows. */
+/* Demonstrate the use of accumulation buffer to create soft shadows */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+public class softshadow extends Applet
+{
+ private static final int SPHERE=1, CONE=2, LIGHT=3, LEFTWALL=4, FLOOR=5;
+ private static final int X = 0, Y = 1, Z = 2;
+ private static final int A = 0, B = 1, C = 2, D = 3;
+ private static final int NONE = 0, SHADOW = 1;
+ private static final int TEXDIM = 256;
+
+ softshadowCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new softshadowCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+
+ /* Destroy the applet */
+
+
+ private class ShadObj
+ {
+ float[] vertices;
+ float[] normal;
+ int n;
+ }
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class softshadowCanvas extends GLCanvas implements MouseListener
+ {
+ private float leftwallshadow[] = new float[16];
+ private float floorshadow[] = new float[16];
+ private float lightpos[] = { 50.0f, 50.0f, -320.0f, 1.0f };
+ private int rendermode = SHADOW;
+
+ public softshadowCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ stencilBits = 3;
+ accumSize = 8;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ /* turn on features */
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+
+ /* make shadow matricies */
+
+ float v0[] = new float[3];
+ float v1[] = new float[3];
+ float v2[] = new float[3];
+
+ /* 3 points on floor */
+ v0[X] = -100.0f;
+ v0[Y] = -100.0f;
+ v0[Z] = -320.0f;
+ v1[X] = 100.0f;
+ v1[Y] = -100.0f;
+ v1[Z] = -320.0f;
+ v2[X] = 100.0f;
+ v2[Y] = -100.0f;
+ v2[Z] = -520.0f;
+
+ float plane[] = new float[4];
+ findplane(plane, v0, v1, v2);
+ shadowmatrix(floorshadow, plane, lightpos);
+
+ /* 3 points on left wall */
+ v0[X] = -100.0f;
+ v0[Y] = -100.0f;
+ v0[Z] = -320.0f;
+ v1[X] = -100.0f;
+ v1[Y] = -100.0f;
+ v1[Z] = -520.0f;
+ v2[X] = -100.0f;
+ v2[Y] = 100.0f;
+ v2[Z] = -520.0f;
+
+ findplane(plane, v0, v1, v2);
+ shadowmatrix(leftwallshadow, plane, lightpos);
+
+ /* place light 0 in the right place */
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
+
+ /* remove back faces to speed things up */
+ gl.glCullFace(GL_BACK);
+
+ gl.glTexParameteri
+ (GL_TEXTURE_2D,
+ GL_TEXTURE_MIN_FILTER,
+ GL_NEAREST);
+
+ /* make display lists for sphere and cone; for efficiency */
+
+ int sphere, cone, base;
+
+ gl.glNewList(SPHERE, GL_COMPILE);
+ sphere = glu.gluNewQuadric();
+ glu.gluSphere(sphere, 20.f, 20, 20);
+ glu.gluDeleteQuadric(sphere);
+ gl.glEndList();
+
+ gl.glNewList(LIGHT, GL_COMPILE);
+ sphere = glu.gluNewQuadric();
+ glu.gluSphere(sphere, 5.f, 20, 20);
+ glu.gluDeleteQuadric(sphere);
+ gl.glEndList();
+
+ gl.glNewList(CONE, GL_COMPILE);
+ cone = glu.gluNewQuadric();
+ base = glu.gluNewQuadric();
+ gl.glRotatef(-90.f, 1.f, 0.f, 0.f);
+ glu.gluDisk(base, 0., 20., 20, 1);
+ glu.gluCylinder(cone, 20., 0., 60., 20, 20);
+ glu.gluDeleteQuadric(cone);
+ glu.gluDeleteQuadric(base);
+ gl.glEndList();
+
+ gl.glNewList(FLOOR, GL_COMPILE);
+ gl.glEndList();
+
+ gl.glNewList(LEFTWALL, GL_COMPILE);
+ gl.glEndList();
+
+ byte tex[] = make_texture(TEXDIM, TEXDIM);
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,
+ 0,
+ 1,
+ TEXDIM,
+ TEXDIM,
+ 0,
+ GL_RED,
+ GL_UNSIGNED_BYTE,
+ tex);
+ tex = null;
+
+ glj.gljCheckGL();
+
+ addMouseListener(this);
+ }
+
+ public void cvsDispose()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ super.cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ /* draw a perspective scene */
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glFrustum(-100.0f, 100.0f, -100.0f, 100.0f, 320.0f, 640.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+
+ int dx, dy, dz;
+
+ dy = 0;
+ /* jitter the light around */
+ if (rendermode == SHADOW)
+ {
+ gl.glClear(GL_ACCUM_BUFFER_BIT);
+ for (dz = -4; dz < 5; dz += 2)
+ {
+ for (dx = -4; dx < 5; dx += 2)
+ {
+ render((float)dx, (float)dy, (float)dz);
+ gl.glAccum(GL_ACCUM, 1.0f / 25.0f);
+ }
+ }
+ gl.glAccum(GL_RETURN, 1.0f);
+ }
+ else
+ render(0.0f, 0.0f, 0.0f);
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ rendermode++;
+ if (rendermode > SHADOW) rendermode = NONE;
+ repaint();
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ }
+
+ private byte[] make_texture(int maxs, int maxt)
+ {
+ byte texture[] = new byte[maxs*maxt];
+ for (int t = 0; t < maxt; t++)
+ {
+ for (int s = 0; s < maxs; s++)
+ {
+ texture[s + maxs * t] =
+ ( (((s >> 4) & 0x1) != 0) ^ (((t >> 4) & 0x1) != 0) ) ?
+ (byte)0xff :
+ (byte)0;
+ }
+ }
+ return texture;
+ }
+
+ /* create a matrix that will project the desired shadow */
+ void shadowmatrix(float shadowMat[], float groundplane[], float lightpos[])
+ {
+ float dot;
+
+ /* find dot product between light position vector
+ and ground plane normal */
+ dot =
+ groundplane[0] * lightpos[0] +
+ groundplane[1] * lightpos[1] +
+ groundplane[2] * lightpos[2] +
+ groundplane[3] * lightpos[3];
+
+ shadowMat[0] = dot - lightpos[0] * groundplane[0];
+ shadowMat[4] = -lightpos[0] * groundplane[1];
+ shadowMat[8] = -lightpos[0] * groundplane[2];
+ shadowMat[12] = -lightpos[0] * groundplane[3];
+
+ shadowMat[1] = -lightpos[1] * groundplane[0];
+ shadowMat[5] = dot - lightpos[1] * groundplane[1];
+ shadowMat[9] = -lightpos[1] * groundplane[2];
+ shadowMat[13] = -lightpos[1] * groundplane[3];
+
+ shadowMat[2] = -lightpos[2] * groundplane[0];
+ shadowMat[6] = -lightpos[2] * groundplane[1];
+ shadowMat[10] = dot - lightpos[2] * groundplane[2];
+ shadowMat[14] = -lightpos[2] * groundplane[3];
+
+ shadowMat[3] = -lightpos[3] * groundplane[0];
+ shadowMat[7] = -lightpos[3] * groundplane[1];
+ shadowMat[11] = -lightpos[3] * groundplane[2];
+ shadowMat[15] = dot - lightpos[3] * groundplane[3];
+ }
+
+ /* find the plane equation given 3 points */
+ void findplane(float plane[], float v0[], float v1[], float v2[])
+ {
+ float vec0[] = new float[3], vec1[] = new float[3];
+
+ /* need 2 vectors to find cross product */
+ vec0[X] = v1[X] - v0[X];
+ vec0[Y] = v1[Y] - v0[Y];
+ vec0[Z] = v1[Z] - v0[Z];
+
+ vec1[X] = v2[X] - v0[X];
+ vec1[Y] = v2[Y] - v0[Y];
+ vec1[Z] = v2[Z] - v0[Z];
+
+ /* find cross product to get A, B, and C of plane equation */
+ plane[A] = vec0[Y] * vec1[Z] - vec0[Z] * vec1[Y];
+ plane[B] = -(vec0[X] * vec1[Z] - vec0[Z] * vec1[X]);
+ plane[C] = vec0[X] * vec1[Y] - vec0[Y] * vec1[X];
+ plane[D] = -(plane[A]*v0[X] + plane[B]*v0[Y] + plane[C]*v0[Z]);
+ }
+
+ private void sphere()
+ {
+ gl.glPushMatrix();
+ gl.glTranslatef(60.0f, -50.0f, -360.0f);
+ gl.glCallList(SPHERE);
+ gl.glPopMatrix();
+ }
+
+ private void cone()
+ {
+ gl.glPushMatrix();
+ gl.glTranslatef(-40.0f, -40.0f, -400.0f);
+ gl.glCallList(CONE);
+ gl.glPopMatrix();
+ }
+
+ /* render while jittering the shadows */
+ private void render(float dx, float dy, float dz)
+ {
+ float v[] = new float[3];
+ /* material properties for objects in scene */
+ float wall_mat[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float sphere_mat[] = {1.0f, 0.5f, 0.0f, 1.0f};
+ float cone_mat[] = {0.0f, 0.5f, 1.0f, 1.0f};
+
+ gl.glClear
+ (GL_DEPTH_BUFFER_BIT |
+ GL_COLOR_BUFFER_BIT |
+ GL_STENCIL_BUFFER_BIT);
+
+ /* Note: wall vertices are ordered so they are all
+ front facing this lets me do back face culling to
+ speed things up. */
+
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, wall_mat);
+
+ /* floor */
+ /* make the floor textured */
+ gl.glEnable(GL_TEXTURE_2D);
+
+ /* Since we want to turn texturing on for floor only, we have
+ to make floor a separate glBegin()/glEnd() sequence. You
+ can't turn texturing on and off between begin and end calls */
+ gl.glBegin(GL_QUADS);
+ gl.glNormal3f(0.0f, 1.0f, 0.0f);
+ gl.glTexCoord2i(0, 0);
+ gl.glVertex3f(-100.0f, -100.0f, -320.0f);
+ gl.glTexCoord2i(1, 0);
+ gl.glVertex3f(100.0f, -100.0f, -320.0f);
+ gl.glTexCoord2i(1, 1);
+ gl.glVertex3f(100.0f, -100.0f, -520.0f);
+ gl.glTexCoord2i(0, 1);
+ gl.glVertex3f(-100.0f, -100.0f, -520.0f);
+ gl.glEnd();
+
+ gl.glDisable(GL_TEXTURE_2D);
+
+
+
+ if (rendermode == SHADOW)
+ {
+ gl.glDisable(GL_DEPTH_TEST);
+ gl.glDisable(GL_LIGHTING);
+ gl.glColor3f(0.f, 0.f, 0.f); /* shadow color */
+
+ gl.glPushMatrix();
+ gl.glMultMatrixf(floorshadow);
+ gl.glTranslatef(dx, dy, dz);
+ cone();
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glMultMatrixf(floorshadow);
+ gl.glTranslatef(dx, dy, dz);
+ sphere();
+ gl.glPopMatrix();
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glEnable(GL_LIGHTING);
+ }
+
+
+ /* walls */
+
+ if (rendermode == SHADOW)
+ {
+ gl.glEnable(GL_STENCIL_TEST);
+ gl.glStencilFunc(GL_ALWAYS, 1, 0);
+ gl.glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
+ }
+ /* left wall */
+ gl.glBegin(GL_QUADS);
+ gl.glNormal3f(1.0f, 0.0f, 0.0f);
+ gl.glVertex3f(-100.0f, -100.0f, -320.0f);
+ gl.glVertex3f(-100.0f, -100.0f, -520.0f);
+ gl.glVertex3f(-100.0f, 100.0f, -520.0f);
+ gl.glVertex3f(-100.0f, 100.0f, -320.0f);
+ gl.glEnd();
+
+ if (rendermode == SHADOW)
+ {
+ gl.glStencilFunc(GL_EQUAL, 1, 1);
+ gl.glDisable(GL_DEPTH_TEST);
+ gl.glDisable(GL_LIGHTING);
+ gl.glColor3f(0.0f, 0.0f, 0.0f); /* shadow color */
+ gl.glDisable(GL_DEPTH_TEST);
+ gl.glPushMatrix();
+ gl.glMultMatrixf(leftwallshadow);
+ gl.glTranslatef(dx, dy, dz);
+ cone();
+ gl.glPopMatrix();
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glDisable(GL_STENCIL_TEST);
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glEnable(GL_LIGHTING);
+ }
+
+ gl.glBegin(GL_QUADS);
+
+ /* right wall */
+ gl.glNormal3f(-1.0f, 0.0f, 0.0f);
+ gl.glVertex3f(100.0f, -100.0f, -320.0f);
+ gl.glVertex3f(100.0f, 100.0f, -320.0f);
+ gl.glVertex3f(100.0f, 100.0f, -520.0f);
+ gl.glVertex3f(100.0f, -100.0f, -520.0f);
+
+ /* ceiling */
+ gl.glNormal3f(0.0f, -1.0f, 0.0f);
+ gl.glVertex3f(-100.0f, 100.0f, -320.0f);
+ gl.glVertex3f(-100.0f, 100.0f, -520.0f);
+ gl.glVertex3f(100.0f, 100.0f, -520.0f);
+ gl.glVertex3f(100.0f, 100.0f, -320.0f);
+
+ /* back wall */
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+ gl.glVertex3f(-100.0f, -100.0f, -520.0f);
+ gl.glVertex3f(100.0f, -100.0f, -520.0f);
+ gl.glVertex3f(100.0f, 100.0f, -520.0f);
+ gl.glVertex3f(-100.0f, 100.0f, -520.0f);
+
+ gl.glEnd();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(lightpos[X], lightpos[Y], lightpos[Z]);
+ gl.glDisable(GL_LIGHTING);
+ gl.glColor3f(1.0f, 1.0f, 0.7f);
+ gl.glCallList(LIGHT);
+ gl.glEnable(GL_LIGHTING);
+ gl.glPopMatrix();
+
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cone_mat);
+ cone();
+
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, sphere_mat);
+ sphere();
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /* simple way to extend a point to build shadow volume */
+ private void extend(float newvertex[], float light[], float vertex[], float t)
+ {
+ float delta[] = new float[3];
+
+ delta[X] = vertex[X] - light[X];
+ delta[Y] = vertex[Y] - light[Y];
+ delta[Z] = vertex[Z] - light[Z];
+
+ newvertex[X] = light[X] + delta[X] * t;
+ newvertex[Y] = light[Y] + delta[Y] * t;
+ newvertex[Z] = light[Z] + delta[Z] * t;
+ }
+
+ }
+}
diff --git a/demos/RonsDemos/softshadow_plugin13.html b/demos/RonsDemos/softshadow_plugin13.html
new file mode 100644
index 0000000..48eb0d3
--- /dev/null
+++ b/demos/RonsDemos/softshadow_plugin13.html
@@ -0,0 +1,50 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Softshadow by Tom McReynolds, SGI; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Softshadow applet
+<br>Originially written by Tom McReynolds, SGI
+<br>Ported to Java by Ron Cemer
+<br>Click inside the window to enable/disable shadows.
+<br>NOTE: WHEN SHADOWS ARE ENABLED, IT MAY TAKE A FEW SECONDS TO DRAW THE SCENE.
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "softshadow.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "softshadow.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "softshadow.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "softshadow.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/spots.html b/demos/RonsDemos/spots.html
new file mode 100644
index 0000000..cd61548
--- /dev/null
+++ b/demos/RonsDemos/spots.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Spots by Mark J. Kilgard; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Spots applet
+<br>Originially written by Mark J. Kilgard
+<br>Ported to Java by Ron Cemer
+<br>
+<applet code="spots.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/spots.java b/demos/RonsDemos/spots.java
new file mode 100644
index 0000000..60a1813
--- /dev/null
+++ b/demos/RonsDemos/spots.java
@@ -0,0 +1,384 @@
+/**
+ * @(#) [place applet name here].java
+ * @(#) author: [place author here] (converted to Java by Ron Cemer)
+ */
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/**
+ * (c) Copyright 1993, 1994, 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.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class spots extends SimpleGLAnimApplet1
+{
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new spotsCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ private class Light
+ {
+ public float amb[] = new float[4];
+ public float diff[] = new float[4];
+ public float spec[] = new float[4];
+ public float pos[] = new float[4];
+ public float spotDir[] = new float[3];
+ public float spotExp;
+ public float spotCutoff;
+ public float atten[] = new float[3];
+ public float trans[] = new float[3];
+ public float rot[] = new float[3];
+ public float swing[] = new float[3];
+ public float arc[] = new float[3];
+ public float arcIncr[] = new float[3];
+
+ public Light
+ (float ambr, float ambg, float ambb, float amba,
+ float diffr, float diffg, float diffb, float diffa,
+ float specr, float specg, float specb, float speca,
+ float posx, float posy, float posz, float posw,
+ float dirx, float diry, float dirz,
+ float exp,
+ float cutoff,
+ float attenr, float atteng, float attenb,
+ float transx, float transy, float transz,
+ float rotx, float roty, float rotz,
+ float swingx, float swingy, float swingz,
+ float arcx, float arcy, float arcz,
+ float arcincrx, float arcincry, float arcincrz)
+ {
+ amb[0] = ambr;
+ amb[1] = ambg;
+ amb[2] = ambb;
+ amb[3] = amba;
+ diff[0] = diffr;
+ diff[1] = diffg;
+ diff[2] = diffb;
+ diff[3] = diffa;
+ spec[0] = specr;
+ spec[1] = specg;
+ spec[2] = specb;
+ spec[3] = speca;
+ pos[0] = posx;
+ pos[1] = posy;
+ pos[2] = posz;
+ pos[3] = posw;
+ spotDir[0] = dirx;
+ spotDir[1] = diry;
+ spotDir[2] = dirz;
+ spotExp = exp;
+ spotCutoff = cutoff;
+ atten[0] = attenr;
+ atten[1] = atteng;
+ atten[2] = attenb;
+ trans[0] = transx;
+ trans[1] = transy;
+ trans[2] = transz;
+ rot[0] = rotx;
+ rot[1] = roty;
+ rot[2] = rotz;
+ swing[0] = swingx;
+ swing[1] = swingy;
+ swing[2] = swingz;
+ arc[0] = arcx;
+ arc[1] = arcy;
+ arc[2] = arcz;
+ arcIncr[0] = arcincrx;
+ arcIncr[1] = arcincry;
+ arcIncr[2] = arcincrz;
+ }
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class spotsCanvas extends GLAnimCanvas
+ {
+ private final double M_PI = 3.14159265;
+ private final double TWO_PI = (2.0*M_PI);
+ private final int NUM_LIGHTS = 3;
+
+ private boolean useSAME_AMB_SPEC = true;
+ private float modelAmb[] = {0.2f, 0.2f, 0.2f, 1.0f};
+ private float matAmb[] = {0.2f, 0.2f, 0.2f, 1.0f};
+ private float matDiff[] = {0.8f, 0.8f, 0.8f, 1.0f};
+ private float matSpec[] = {0.4f, 0.4f, 0.4f, 1.0f};
+ private float matEmission[] = {0.0f, 0.0f, 0.0f, 1.0f};
+ private Light[] spots =
+ {
+ new Light
+ (0.2f, 0.0f, 0.0f, 1.0f, /* ambient */
+ 0.8f, 0.0f, 0.0f, 1.0f, /* diffuse */
+ 0.4f, 0.0f, 0.0f, 1.0f, /* specular */
+ 0.0f, 0.0f, 0.0f, 1.0f, /* position */
+ 0.0f, -1.0f, 0.0f, /* direction */
+ 20.0f,
+ 60.0f, /* exponent, cutoff */
+ 1.0f, 0.0f, 0.0f, /* attenuation */
+ 0.0f, 1.25f, 0.0f, /* translation */
+ 0.0f, 0.0f, 0.0f, /* rotation */
+ 20.0f, 0.0f, 40.0f, /* swing */
+ 0.0f, 0.0f, 0.0f, /* arc */
+ (float)(TWO_PI / 70.0), 0.0f, (float)(TWO_PI / 140.0)), /* arc increment */
+ new Light
+ (0.0f, 0.2f, 0.0f, 1.0f, /* ambient */
+ 0.0f, 0.8f, 0.0f, 1.0f, /* diffuse */
+ 0.0f, 0.4f, 0.0f, 1.0f, /* specular */
+ 0.0f, 0.0f, 0.0f, 1.0f, /* position */
+ 0.0f, -1.0f, 0.0f, /* direction */
+ 20.0f,
+ 60.0f, /* exponent, cutoff */
+ 1.0f, 0.0f, 0.0f, /* attenuation */
+ 0.0f, 1.25f, 0.0f, /* translation */
+ 0.0f, 0.0f, 0.0f, /* rotation */
+ 20.0f, 0.0f, 40.0f, /* swing */
+ 0.0f, 0.0f, 0.0f, /* arc */
+ (float)(TWO_PI / 120.0), 0.0f, (float)(TWO_PI / 60.0)), /* arc increment */
+ new Light
+ (0.0f, 0.0f, 0.2f, 1.0f, /* ambient */
+ 0.0f, 0.0f, 0.8f, 1.0f, /* diffuse */
+ 0.0f, 0.0f, 0.4f, 1.0f, /* specular */
+ 0.0f, 0.0f, 0.0f, 1.0f, /* position */
+ 0.0f, -1.0f, 0.0f, /* direction */
+ 20.0f,
+ 60.0f, /* exponent, cutoff */
+ 1.0f, 0.0f, 0.0f, /* attenuation */
+ 0.0f, 1.25f, 0.0f, /* translation */
+ 0.0f, 0.0f, 0.0f, /* rotation */
+ 20.0f, 0.0f, 40.0f, /* swing */
+ 0.0f, 0.0f, 0.0f, /* arc */
+ (float)(TWO_PI / 50.0), 0.0f, (float)(TWO_PI / 100.0)), /* arc increment */
+ };
+ float spin = 0.0f;
+
+ public spotsCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glFrustum(-1.0f, 1.0f, -1.0f, 1.0f, 2.0f, 6.0f);
+
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glTranslatef(0.0f, 0.0f, -3.0f);
+ gl.glRotatef(45.0f, 1.0f, 0.0f, 0.0f);
+
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_NORMALIZE);
+
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, modelAmb);
+ gl.glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0f);
+ gl.glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 0.0f);
+
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, matAmb);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, matDiff);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, matSpec);
+ gl.glMaterialfv(GL_FRONT, GL_EMISSION, matEmission);
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, 10.0f);
+
+ initLights();
+
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ spin += 0.5f;
+ if (spin > 360.0f) spin -= 360.0f;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+
+ gl.glPushMatrix();
+ gl.glRotatef(spin, 0.0f, 1.0f, 0.0f);
+
+ aimLights();
+ setLights();
+
+ gl.glPushMatrix();
+ gl.glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
+ gl.glScalef(1.9f, 1.9f, 1.0f);
+ gl.glTranslatef(-0.5f, -0.5f, 0.0f);
+ drawPlane(16, 16);
+ gl.glPopMatrix();
+
+ drawLights();
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ //if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+
+ private void initLights()
+ {
+ for (int k = 0; k < NUM_LIGHTS; ++k)
+ {
+ int lt = GL_LIGHT0 + k;
+ Light light = spots[k];
+ gl.glEnable(lt);
+ gl.glLightfv(lt, GL_AMBIENT, light.amb);
+ gl.glLightfv(lt, GL_DIFFUSE, light.diff);
+ if (useSAME_AMB_SPEC)
+ gl.glLightfv(lt, GL_SPECULAR, light.amb);
+ else
+ gl.glLightfv(lt, GL_SPECULAR, light.spec);
+ gl.glLightf(lt, GL_SPOT_EXPONENT, light.spotExp);
+ gl.glLightf(lt, GL_SPOT_CUTOFF, light.spotCutoff);
+ gl.glLightf(lt, GL_CONSTANT_ATTENUATION, light.atten[0]);
+ gl.glLightf(lt, GL_LINEAR_ATTENUATION, light.atten[1]);
+ gl.glLightf(lt, GL_QUADRATIC_ATTENUATION, light.atten[2]);
+ }
+ }
+
+ private void aimLights()
+ {
+ for (int k = 0; k < NUM_LIGHTS; ++k)
+ {
+ Light light = spots[k];
+ light.rot[0] = light.swing[0] * (float)Math.sin(light.arc[0]);
+ light.arc[0] += light.arcIncr[0];
+ if (light.arc[0] > TWO_PI)
+ light.arc[0] -= TWO_PI;
+ light.rot[1] = light.swing[1] * (float)Math.sin(light.arc[1]);
+ light.arc[1] += light.arcIncr[1];
+ if (light.arc[1] > TWO_PI)
+ light.arc[1] -= TWO_PI;
+ light.rot[2] = light.swing[2] * (float)Math.sin(light.arc[2]);
+ light.arc[2] += light.arcIncr[2];
+ if (light.arc[2] > TWO_PI)
+ light.arc[2] -= TWO_PI;
+ }
+ }
+
+ private void setLights()
+ {
+ for (int k = 0; k < NUM_LIGHTS; ++k)
+ {
+ int lt = GL_LIGHT0 + k;
+ Light light = spots[k];
+ gl.glPushMatrix();
+ gl.glTranslatef(light.trans[0], light.trans[1], light.trans[2]);
+ gl.glRotatef(light.rot[0], 1, 0, 0);
+ gl.glRotatef(light.rot[1], 0, 1, 0);
+ gl.glRotatef(light.rot[2], 0, 0, 1);
+ gl.glLightfv(lt, GL_POSITION, light.pos);
+ gl.glLightfv(lt, GL_SPOT_DIRECTION, light.spotDir);
+ gl.glPopMatrix();
+ }
+ }
+
+ private void drawLights()
+ {
+ gl.glDisable(GL_LIGHTING);
+ for (int k = 0; k < NUM_LIGHTS; ++k)
+ {
+ Light light = spots[k];
+ gl.glColor4fv(light.diff);
+ gl.glPushMatrix();
+ gl.glTranslatef(light.trans[0], light.trans[1], light.trans[2]);
+ gl.glRotatef(light.rot[0], 1, 0, 0);
+ gl.glRotatef(light.rot[1], 0, 1, 0);
+ gl.glRotatef(light.rot[2], 0, 0, 1);
+ gl.glBegin(GL_LINES);
+ gl.glVertex3f(light.pos[0], light.pos[1], light.pos[2]);
+ gl.glVertex3f(light.spotDir[0], light.spotDir[1], light.spotDir[2]);
+ gl.glEnd();
+ gl.glPopMatrix();
+ }
+ gl.glEnable(GL_LIGHTING);
+ }
+
+ private void drawPlane(int w, int h)
+ {
+ int i, j;
+ float dw = 1.0f / (float)w;
+ float dh = 1.0f / (float)h;
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+ for (j = 0; j < h; ++j)
+ {
+ gl.glBegin(GL_TRIANGLE_STRIP);
+ for (i = 0; i <= w; ++i)
+ {
+ gl.glVertex2f(dw * i, dh * (j + 1));
+ gl.glVertex2f(dw * i, dh * j);
+ }
+ gl.glEnd();
+ }
+ }
+ }
+}
diff --git a/demos/RonsDemos/spots_plugin13.html b/demos/RonsDemos/spots_plugin13.html
new file mode 100644
index 0000000..c5cfb39
--- /dev/null
+++ b/demos/RonsDemos/spots_plugin13.html
@@ -0,0 +1,48 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Spots by Mark J. Kilgard; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Spots applet
+<br>Originially written by Mark J. Kilgard
+<br>Ported to Java by Ron Cemer
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "spots.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "spots.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "spots.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "spots.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/star.html b/demos/RonsDemos/star.html
new file mode 100644
index 0000000..7ab40ee
--- /dev/null
+++ b/demos/RonsDemos/star.html
@@ -0,0 +1,22 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Star by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Star applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<hr>By clicking inside the window, you can change the behavior of the
+<br>stars.&nbsp; There are two modes: normal and "weird".&nbsp; Each time
+you
+<br>click inside the window, the current mode will change.
+<br>
+<applet code="star.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/star.java b/demos/RonsDemos/star.java
new file mode 100644
index 0000000..3017b51
--- /dev/null
+++ b/demos/RonsDemos/star.java
@@ -0,0 +1,349 @@
+/**
+ * @(#) star.java
+ * @(#) author: Silicon Graphics (converted to Java by Ron Cemer)
+ */
+
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "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 BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class star extends SimpleGLAnimApplet1
+{
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new starCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class starCanvas extends GLAnimCanvas implements MouseListener
+ {
+ private static final float M_PI = 3.14159265359f;
+ private static final int NORMAL = 0, WEIRD = 1;
+ private static final int STREAK = 0, CIRCLE = 1;
+ private static final int MAXSTARS = 400;
+ private static final int MAXPOS = 10000;
+ private static final int MAXWARP = 10;
+ private static final int MAXANGLES = 6000;
+ private int windW, windH;
+ private int flag = NORMAL;
+ private int starCount = MAXSTARS / 2;
+ private float speed = 1.0f;
+ private int nitro = 0;
+ private starRec stars[];
+ private float sinTable[];
+ private Random rand = null;
+
+ private class starRec
+ {
+ protected int type;
+ protected float x[], y[], z[];
+ protected float offsetX, offsetY, offsetR, rotation;
+
+ public starRec()
+ {
+ x = new float[2];
+ y = new float[2];
+ z = new float[2];
+ }
+ }
+
+ public starCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+
+ stars = new starRec[MAXSTARS];
+ sinTable = new float[MAXANGLES];
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ Date dt = new Date();
+ rand = new Random(dt.getTime());
+
+ int n;
+ for (n = 0; n < MAXSTARS; n++)
+ NewStar(n, 100);
+ float angle = 0.0f;
+ for (n = 0; n < MAXANGLES ; n++)
+ {
+ sinTable[n] = (float)Math.sin(angle);
+ angle += M_PI / (MAXANGLES / 2.0f);
+ }
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ gl.glDisable(GL_DITHER);
+
+ glj.gljCheckGL();
+
+ addMouseListener(this);
+ }
+
+ public void doCleanup()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ windW = width;
+ windH = height;
+
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluOrtho2D(-0.5,(double)width+0.5,-0.5,(double)height+0.5);
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ MoveStars();
+ ShowStars();
+ if (nitro > 0)
+ {
+ speed = (float)(nitro / 10) + 1.0f;
+ if (speed > MAXWARP) speed = MAXWARP;
+ if (++nitro > MAXWARP*10) nitro = -nitro;
+ }
+ else if (nitro < 0)
+ {
+ nitro++;
+ speed = (float)(-nitro / 10) + 1.0f;
+ if (speed > MAXWARP) speed = MAXWARP;
+ }
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ //if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+
+ private float Sin(float angle)
+ {
+ int ang;
+ ang = (int)angle;
+ while (ang < 0) ang += MAXANGLES;
+ while (ang >= MAXANGLES) ang -= MAXANGLES;
+ return (sinTable[ang]);
+ }
+
+ private float Cos(float angle)
+ {
+ return Sin(angle+(((float)MAXANGLES)*0.25f));
+ }
+
+ private void NewStar(int n, int d)
+ {
+ stars[n] = new starRec();
+ if (rand.nextInt() % 4 == 0)
+ stars[n].type = CIRCLE;
+ else
+ stars[n].type = STREAK;
+ stars[n].x[0] = (float)(rand.nextInt() % MAXPOS - MAXPOS / 2);
+ stars[n].y[0] = (float)(rand.nextInt() % MAXPOS - MAXPOS / 2);
+ stars[n].z[0] = (float)(rand.nextInt() % MAXPOS + d);
+ if ( (rand.nextInt() % 4 == 0) && (flag == WEIRD) )
+ {
+ stars[n].offsetX = (float)(rand.nextInt() % 100 - 100 / 2);
+ stars[n].offsetY = (float)(rand.nextInt() % 100 - 100 / 2);
+ stars[n].offsetR = (float)(rand.nextInt() % 25 - 25 / 2);
+ }
+ else
+ {
+ stars[n].offsetX = 0.0f;
+ stars[n].offsetY = 0.0f;
+ stars[n].offsetR = 0.0f;
+ }
+ }
+
+ private void RotatePoint(float[] x, float[] y, float rotation)
+ {
+ float tmpX, tmpY;
+
+ tmpX = x[0] * Cos(rotation) - y[0] * Sin(rotation);
+ tmpY = y[0] * Cos(rotation) + x[0] * Sin(rotation);
+ x[0] = tmpX;
+ y[0] = tmpY;
+ }
+
+ private void MoveStars()
+ {
+ float offset;
+ int n;
+
+ offset = speed * 60.0f;
+
+ for (n = 0; n < starCount; n++)
+ {
+ stars[n].x[1] = stars[n].x[0];
+ stars[n].y[1] = stars[n].y[0];
+ stars[n].z[1] = stars[n].z[0];
+ stars[n].x[0] += stars[n].offsetX;
+ stars[n].y[0] += stars[n].offsetY;
+ stars[n].z[0] -= offset;
+ int rot = (int)(stars[n].rotation = stars[n].offsetR);
+ while (rot < 0) rot += MAXANGLES;
+ while (rot >= MAXANGLES) rot -= MAXANGLES;
+ stars[n].rotation = (float)rot;
+ }
+ }
+
+ private boolean StarPoint(int n)
+ {
+ float x0, y0, x1, y1, width;
+ float xbuf[] = new float[1], ybuf[] = new float[1];
+ int i;
+
+ x0 = stars[n].x[0] * windW / stars[n].z[0];
+ y0 = stars[n].y[0] * windH / stars[n].z[0];
+ xbuf[0] = x0;
+ ybuf[0] = y0;
+ RotatePoint(xbuf, ybuf, stars[n].rotation);
+ x0 = xbuf[0];
+ y0 = ybuf[0];
+ x0 += windW / 2.0f;
+ y0 += windH / 2.0f;
+
+ if ( (x0 >= 0.0f) && (x0 < windW) && (y0 >= 0.0f) && (y0 < windH) )
+ {
+ if (stars[n].type == STREAK)
+ {
+ x1 = stars[n].x[1] * windW / stars[n].z[1];
+ y1 = stars[n].y[1] * windH / stars[n].z[1];
+ xbuf[0] = x1;
+ ybuf[0] = y1;
+ RotatePoint(xbuf, ybuf, stars[n].rotation);
+ x1 = xbuf[0];
+ y1 = ybuf[0];
+ x1 += windW / 2.0f;
+ y1 += windH / 2.0f;
+
+ gl.glLineWidth(MAXPOS/100.0f/stars[n].z[0]+1.0f);
+ gl.glColor3f(1.0f, (MAXWARP-speed)/MAXWARP, (MAXWARP-speed)/MAXWARP);
+ if (Math.abs(x0-x1) < 1.0f && Math.abs(y0-y1) < 1.0f)
+ {
+ gl.glBegin(GL_POINTS);
+ gl.glVertex2f(x0, y0);
+ gl.glEnd();
+ }
+ else
+ {
+ gl.glBegin(GL_LINES);
+ gl.glVertex2f(x0, y0);
+ gl.glVertex2f(x1, y1);
+ gl.glEnd();
+ }
+ }
+ else
+ {
+ width = MAXPOS / 10.0f / stars[n].z[0] + 1.0f;
+ gl.glColor3f(1.0f, 0.0f, 0.0f);
+ gl.glBegin(GL_POLYGON);
+ for (i = 0; i < 8; i++)
+ {
+ float x = x0 + width * Cos((float)i*MAXANGLES/8.0f);
+ float y = y0 + width * Sin((float)i*MAXANGLES/8.0f);
+ gl.glVertex2f(x, y);
+ };
+ gl.glEnd();
+ }
+
+ return true;
+ }
+ return false;
+ }
+
+ private void ShowStars()
+ {
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+ for (int n = 0; n < starCount; n++)
+ {
+ if ( (stars[n].z[0] > speed)
+ || ( (stars[n].z[0] > 0.0f) && (speed < MAXWARP) ) )
+ {
+ if (!StarPoint(n))
+ NewStar(n, MAXPOS);
+ }
+ else
+ NewStar(n, MAXPOS);
+ }
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ flag = (flag == NORMAL) ? WEIRD : NORMAL;
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ }
+ }
+}
diff --git a/demos/RonsDemos/star_plugin13.html b/demos/RonsDemos/star_plugin13.html
new file mode 100644
index 0000000..8a3f8e1
--- /dev/null
+++ b/demos/RonsDemos/star_plugin13.html
@@ -0,0 +1,53 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Star by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Star applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<hr>By clicking inside the window, you can change the behavior of the
+<br>stars.&nbsp; There are two modes: normal and "weird".&nbsp; Each time
+you
+<br>click inside the window, the current mode will change.
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "star.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "star.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "star.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "star.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/steam.html b/demos/RonsDemos/steam.html
new file mode 100644
index 0000000..b02826e
--- /dev/null
+++ b/demos/RonsDemos/steam.html
@@ -0,0 +1,22 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Steam by Troy Robinette; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Steam applet
+<br>Originially written by Troy Robinette
+<br>Ported to Java by Ron Cemer
+<br>Right click within the window for a menu of options.
+<br>Left-click within the window, then press any of the following keys:
+<br>Arrow keys rotate the model.
+<br>+ and - keys speed up or slow down the simulation.
+<br>While paused, a and z keys single-step forward and backward.
+<br>
+<applet code="steam.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/steam.java b/demos/RonsDemos/steam.java
new file mode 100644
index 0000000..3f19f7e
--- /dev/null
+++ b/demos/RonsDemos/steam.java
@@ -0,0 +1,791 @@
+/**
+ * @(#) steam.java
+ * @(#) author: Troy Robinette (converted to Java by Ron Cemer)
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+/**
+ Description: Interactive 3D graphics, Assignment #1
+ Miniature Steam Engine Simulation.
+ Author: Troy Robinette
+ Date: 29/9/95
+ Notes: - Transparence doesn't quite work. The color of the
+ underlying object doesn't show through.
+ - Also only the front side of the transparent objects are
+ transparent.
+**/
+
+public class steam extends SimpleGLAnimApplet1
+{
+ private static final float boxnormals[][] =
+ {
+ {-1.0f, 0.0f, 0.0f},
+ {0.0f, 1.0f, 0.0f},
+ {1.0f, 0.0f, 0.0f},
+ {0.0f, -1.0f, 0.0f},
+ {0.0f, 0.0f, 1.0f},
+ {0.0f, 0.0f, -1.0f}
+ };
+ private static final int boxfaces[][] =
+ {
+ {0, 1, 2, 3},
+ {3, 2, 6, 7},
+ {7, 6, 5, 4},
+ {4, 5, 1, 0},
+ {5, 6, 2, 1},
+ {7, 4, 0, 3}
+ };
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new steamCanvas(d.width, d.height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class steamCanvas extends GLAnimCanvas
+ implements MouseListener, ActionListener, KeyListener
+ {
+ /* Dimensions of texture image. */
+ private final int IMAGE_WIDTH = 64;
+ private final int IMAGE_HEIGHT = 64;
+ /* Step to be taken for each rotation. */
+ private final int ANGLE_STEP = 10;
+ /* Magic numbers for relationship b/w cylinder head and crankshaft. */
+ private final float MAGNITUDE = 120.0f;
+ private final float PHASE = 270.112f;
+ private final float FREQ_DIV = 58.0f;
+ private final float ARC_LENGTH = 2.7f;
+ private final float ARC_RADIUS = 0.15f;
+ /* Rotation angles */
+ private float view_h = 270.0f, view_v = 0.0f;
+ private float head_angle = 0.0f;
+ private int crank_angle = 0;
+ /* Crank rotation step. */
+ private float crank_step = 5.0f;
+ /* Toggles */
+ private boolean filled = true;
+ private boolean textured = false, transparent = false;
+ /* Storage for the angle look up table and the texture map */
+ private float head_look_up_table[] = new float[360];
+ private byte image[] = new byte[IMAGE_WIDTH*IMAGE_HEIGHT*3];
+ /* Indentifiers for each Display list */
+ private int list_piston_filled = 1;
+ private int list_piston_texture = 2;
+ private int list_flywheel_filled = 4;
+ private int list_flywheel_texture = 8;
+ /* Variable used in the creaton of glu objects */
+ int obj; // (GLU quadric object)
+
+ private PopupMenu menu = null;
+ private boolean menu_showing = false;
+ private boolean save_suspended = false;
+
+ private final String MENU_FILLED = "Filled";
+ private final String MENU_WIREFRAME = "Wireframe";
+ private final String MENU_TEXTURED = "Textured";
+ private final String MENU_UNTEXTURED = "Untextured";
+ private final String MENU_TRANSPARENT = "Transparent";
+ private final String MENU_OPAQUE = "Opaque";
+ private final String MENU_RIGHT_LIGHT_ON = "Right light on";
+ private final String MENU_RIGHT_LIGHT_OFF = "Right light off";
+ private final String MENU_LEFT_LIGHT_ON = "Left light on";
+ private final String MENU_LEFT_LIGHT_OFF = "Left light off";
+ private final String MENU_PAUSE = "Pause (use a and z to step)";
+ private final String MENU_RESUME = "Resume animation";
+ private final String MENU_SPEED_UP = "Speed up (+)";
+ private final String MENU_SLOW_DOWN = "Slow down (-)";
+
+ public steamCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ float mat_specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float mat_shininess[] = {50.0f};
+ float light_position0[] = {1.0f, 1.0f, 1.0f, 0.0f};
+ float light_position1[] = {-1.0f, 1.0f, 1.0f, 0.0f};
+ float light_diffuse1[] = {1.0f,1.0f,1.0f,1.0f};
+ float light_specular1[] = {1.0f,1.0f,1.0f,1.0f};
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ obj = glu.gluNewQuadric();
+ make_table();
+ make_image();
+
+ /* Set up Texturing */
+ gl.glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,
+ 0,
+ 3,
+ IMAGE_WIDTH,
+ IMAGE_HEIGHT,
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ image);
+ gl.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ gl.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ gl.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ gl.glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ /* Set up Lighting */
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, light_position0);
+ gl.glLightfv(GL_LIGHT1, GL_POSITION, light_position1);
+ gl.glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse1);
+ gl.glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular1);
+
+ /* Initial render mode is with full shading and LIGHT 0
+ enabled. */
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glDisable(GL_LIGHT1);
+ gl.glDepthFunc(GL_LEQUAL);
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glDisable(GL_ALPHA_TEST);
+
+ gl.glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+ gl.glEnable(GL_COLOR_MATERIAL);
+ gl.glShadeModel(GL_SMOOTH);
+
+ /* Initialise display lists */
+ gl.glNewList(list_piston_filled, GL_COMPILE);
+ draw_piston();
+ gl.glEndList();
+ gl.glNewList(list_flywheel_filled, GL_COMPILE);
+ draw_flywheel();
+ gl.glEndList();
+
+ glu.gluQuadricTexture(obj, true);
+ gl.glNewList(list_piston_texture, GL_COMPILE);
+ draw_piston();
+ gl.glEndList();
+ gl.glNewList(list_flywheel_texture, GL_COMPILE);
+ draw_flywheel();
+ gl.glEndList();
+ glu.gluQuadricTexture(obj, false);
+
+ glj.gljCheckGL();
+
+ menu = new PopupMenu("Options");
+ menu.add(MENU_FILLED);
+ menu.add(MENU_WIREFRAME);
+ menu.add(MENU_TEXTURED);
+ menu.add(MENU_UNTEXTURED);
+ menu.add(MENU_TRANSPARENT);
+ menu.add(MENU_OPAQUE);
+ menu.add(MENU_RIGHT_LIGHT_ON);
+ menu.add(MENU_RIGHT_LIGHT_OFF);
+ menu.add(MENU_LEFT_LIGHT_ON);
+ menu.add(MENU_LEFT_LIGHT_OFF);
+ menu.add(MENU_PAUSE);
+ menu.add(MENU_RESUME);
+ menu.add(MENU_SPEED_UP);
+ menu.add(MENU_SLOW_DOWN);
+ menu.addActionListener(this);
+ add(menu);
+
+ addMouseListener(this);
+ addKeyListener(this);
+ }
+
+ public void doCleanup()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ menu.removeActionListener(this);
+ removeKeyListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective(65.0f, (float)width/(float)height, 1.0f, 20.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glTranslatef(0.0f, 0.0f, -5.0f); /* viewing transform */
+ gl.glScalef(1.5f, 1.5f, 1.5f);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ if (!isSuspended())
+ {
+ crank_angle += crank_step;
+ while (crank_angle >= 360) crank_angle -= 360;
+ while (crank_angle < 0) crank_angle += 360;
+ head_angle = head_look_up_table[crank_angle];
+ }
+
+ /* Main display code. Clears the drawing buffer and if
+ transparency is set, displays the model twice, 1st time
+ accepting those fragments with an ALPHA value of 1 only,
+ then with DEPTH_BUFFER writing disabled for those with
+ other values. */
+
+ int pass;
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ gl.glPushMatrix();
+ if (transparent)
+ {
+ gl.glEnable(GL_ALPHA_TEST);
+ pass = 2;
+ }
+ else
+ {
+ gl.glDisable(GL_ALPHA_TEST);
+ pass = 0;
+ }
+
+ /* Rotate the whole model */
+ gl.glRotatef(view_h, 0.0f, 1.0f, 0.0f);
+ gl.glRotatef(view_v, 1.0f, 0.0f, 0.0f);
+
+ do
+ {
+ if (pass == 2)
+ {
+ gl.glAlphaFunc(GL_EQUAL, 1);
+ gl.glDepthMask(true);
+ pass = 1;
+ }
+ else if (pass != 0)
+ {
+ gl.glAlphaFunc(GL_NOTEQUAL, 1);
+ gl.glDepthMask(false);
+ pass = 0;
+ }
+
+ draw_engine_pole();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(0.5f, 1.4f, 0.0f);
+ draw_cylinder_head();
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, -0.8f, 0.0f);
+ draw_crank();
+ gl.glPopMatrix();
+ } while (pass > 0);
+
+ gl.glDepthMask(true);
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ //if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited(MouseEvent evt)
+ {
+ }
+
+ public void mousePressed(MouseEvent evt)
+ {
+ // If user presses right mouse button within canvas area,
+ // suspend animation and pop up menu.
+ // If menu was already popped up and user presses either
+ // mouse button within canvas area, resume animation
+ // because the menu will have been removed automatically.
+ if (!menu_showing)
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ menu_showing = true;
+ save_suspended = isSuspended();
+ if (!save_suspended)
+ {
+ setSuspended(true);
+ repaint(100);
+ try
+ {
+ Thread.currentThread().sleep(200);
+ }
+ catch (Exception e)
+ { }
+ }
+ menu.show(this,evt.getX(),evt.getY());
+ }
+ }
+ else
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ }
+
+ public void mouseReleased(MouseEvent evt)
+ {
+ }
+
+ // Method required for the implementation of ActionListener
+ public void actionPerformed(ActionEvent evt)
+ {
+ if (glj.gljMakeCurrent() == false) return;
+ boolean dorepaint = false;
+ String c = evt.getActionCommand();
+ if (c.equals(MENU_FILLED))
+ {
+ filled = true;
+ gl.glShadeModel(GL_SMOOTH);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glEnable(GL_COLOR_MATERIAL);
+ glu.gluQuadricNormals(obj, GLU_SMOOTH);
+ glu.gluQuadricDrawStyle(obj, GLU_FILL);
+ // Conditionally re-enable texturing.
+ if (textured)
+ {
+ gl.glEnable(GL_TEXTURE_2D);
+ glu.gluQuadricTexture(obj, true);
+ }
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_WIREFRAME))
+ {
+ filled = false;
+ gl.glShadeModel(GL_FLAT);
+ gl.glDisable(GL_LIGHTING);
+ gl.glDisable(GL_DEPTH_TEST);
+ gl.glDisable(GL_COLOR_MATERIAL);
+ glu.gluQuadricNormals(obj, GLU_NONE);
+ glu.gluQuadricDrawStyle(obj, GLU_LINE);
+ glu.gluQuadricTexture(obj, false);
+ // Be sure texturing is disabled.
+ gl.glDisable(GL_TEXTURE_2D);
+ glu.gluQuadricTexture(obj, false);
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_TEXTURED))
+ {
+ textured = true;
+ if (filled)
+ {
+ gl.glEnable(GL_TEXTURE_2D);
+ glu.gluQuadricTexture(obj, true);
+ dorepaint = true;
+ }
+ }
+ else if (c.equals(MENU_UNTEXTURED))
+ {
+ textured = false;
+ gl.glDisable(GL_TEXTURE_2D);
+ glu.gluQuadricTexture(obj, false);
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_TRANSPARENT))
+ {
+ transparent = true;
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_OPAQUE))
+ {
+ transparent = false;
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_RIGHT_LIGHT_ON))
+ {
+ gl.glEnable(GL_LIGHT0);
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_RIGHT_LIGHT_OFF))
+ {
+ gl.glDisable(GL_LIGHT0);
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_LEFT_LIGHT_ON))
+ {
+ gl.glEnable(GL_LIGHT1);
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_LEFT_LIGHT_OFF))
+ {
+ gl.glDisable(GL_LIGHT1);
+ dorepaint = true;
+ }
+ else if (c.equals(MENU_PAUSE))
+ {
+ if (menu_showing)
+ save_suspended = true;
+ else
+ setSuspended(true);
+ }
+ else if (c.equals(MENU_RESUME))
+ {
+ if (menu_showing)
+ save_suspended = false;
+ else
+ setSuspended(false);
+ }
+ else if (c.equals(MENU_SPEED_UP))
+ {
+ crank_step++;
+ if (crank_step > 45) crank_step = 45;
+ }
+ else if (c.equals(MENU_SLOW_DOWN))
+ {
+ crank_step--;
+ if (crank_step < 1) crank_step = 1;
+ }
+ if (menu_showing)
+ {
+ menu_showing = false;
+ setSuspended(save_suspended);
+ }
+ glj.gljFree();
+ if (dorepaint) repaint();
+ }
+
+ // Methods required for the implementation of KeyListener
+ public void keyPressed(KeyEvent e)
+ {
+ switch (e.getKeyCode())
+ {
+ case KeyEvent.VK_LEFT:
+ view_h -= ANGLE_STEP;
+ while (view_h < 0) view_h += 360;
+ repaint();
+ break;
+ case KeyEvent.VK_RIGHT:
+ view_h += ANGLE_STEP;
+ while (view_h >= 360) view_h -= 360;
+ repaint();
+ break;
+ case KeyEvent.VK_UP:
+ view_v += ANGLE_STEP;
+ while (view_v >= 360) view_v -= 360;
+ repaint();
+ break;
+ case KeyEvent.VK_DOWN:
+ view_v -= ANGLE_STEP;
+ while (view_v < 0) view_v += 360;
+ repaint();
+ break;
+ }
+ }
+
+ public void keyReleased(KeyEvent e)
+ {
+ }
+
+ public void keyTyped(KeyEvent e)
+ {
+ if (glj.gljMakeCurrent() == false) return;
+ boolean dorepaint = false;
+ switch ((char)e.getKeyChar())
+ {
+ case 'a':
+ case 'A':
+ if (!isSuspended()) break;
+ crank_angle += crank_step;
+ while (crank_angle >= 360) crank_angle -= 360;
+ head_angle = head_look_up_table[crank_angle];
+ dorepaint = true;
+ break;
+ case 'z':
+ case 'Z':
+ if (!isSuspended()) break;
+ crank_angle -= crank_step;
+ while (crank_angle < 0) crank_angle += 360;
+ head_angle = head_look_up_table[crank_angle];
+ dorepaint = true;
+ break;
+ case '+':
+ crank_step++;
+ if (crank_step > 45) crank_step = 45;
+ break;
+ case '-':
+ crank_step--;
+ if (crank_step < 1) crank_step = 1;
+ break;
+ }
+ glj.gljFree();
+ if (dorepaint) repaint();
+ }
+
+ /* Draws a box by scaling a glut cube of size 1.
+ Also checks the filled toggle to see which rendering
+ style to use. NB Texture doesn't work correctly due
+ to the cube being scaled. */
+ private void myBox(float x, float y, float z)
+ {
+ gl.glPushMatrix();
+ gl.glScalef(x, y, z);
+ if (filled)
+ glutSolidCube(1);
+ else
+ glutWireCube(1);
+ gl.glPopMatrix();
+ }
+
+ /* Draws a cylinder using glu function, drawing flat discs
+ at each end, to give the appearence of it being solid. */
+ private void myCylinder
+ (int object, float outerRadius, float innerRadius, float length)
+ {
+ gl.glPushMatrix();
+ glu.gluCylinder(object, outerRadius, outerRadius, length, 20, 1);
+ gl.glPushMatrix();
+ gl.glRotatef(180.0f, 0.0f, 1.0f, 0.0f);
+ glu.gluDisk(object, innerRadius, outerRadius, 20, 1);
+ gl.glPopMatrix();
+ gl.glTranslatef(0.0f, 0.0f, length);
+ glu.gluDisk(object, innerRadius, outerRadius, 20, 1);
+ gl.glPopMatrix();
+ }
+
+ /* Draws a piston. */
+ private void draw_piston()
+ {
+ gl.glPushMatrix();
+ gl.glColor4f(0.3f, 0.6f, 0.9f, 1.0f);
+ gl.glPushMatrix();
+ gl.glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+ gl.glTranslatef(0.0f, 0.0f, -0.07f);
+ myCylinder(obj, 0.125f, 0.06f, 0.12f);
+ gl.glPopMatrix();
+ gl.glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
+ gl.glTranslatef(0.0f, 0.0f, 0.05f);
+ myCylinder(obj, 0.06f, 0.0f, 0.6f);
+ gl.glTranslatef(0.0f, 0.0f, 0.6f);
+ myCylinder(obj, 0.2f, 0.0f, 0.5f);
+ gl.glPopMatrix();
+ }
+
+ /* Draws the engine pole and the
+ pivot pole for the cylinder head. */
+ private void draw_engine_pole()
+ {
+ gl.glPushMatrix();
+ gl.glColor4f(0.9f, 0.9f, 0.9f, 1.0f);
+ myBox(0.5f, 3.0f, 0.5f);
+ gl.glColor3f(0.5f, 0.1f, 0.5f);
+ gl.glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+ gl.glTranslatef(0.0f, 0.9f, -0.4f);
+ myCylinder(obj, 0.1f, 0.0f, 2);
+ gl.glPopMatrix();
+ }
+
+ /* Draws the cylinder head at the appropreate angle, doing
+ the necessary translations for the rotation. */
+ private void draw_cylinder_head()
+ {
+ gl.glPushMatrix();
+ gl.glColor4f(0.5f, 1.0f, 0.5f, 0.1f);
+ gl.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
+ gl.glTranslatef(0.0f, 0.0f, 0.4f);
+ gl.glRotatef(head_angle, 1.0f, 0.0f, 0.0f);
+ gl.glTranslatef(0.0f, 0.0f, -0.4f);
+ myCylinder(obj, 0.23f, 0.21f, 1.6f);
+ gl.glRotatef(180.0f, 1.0f, 0.0f, 0.0f);
+ glu.gluDisk(obj, 0.0f, 0.23f, 20, 1);
+ gl.glPopMatrix();
+ }
+
+ /* Draws the flywheel. */
+ private void draw_flywheel()
+ {
+ gl.glPushMatrix();
+ gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f);
+ gl.glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+ myCylinder(obj, 0.625f, 0.08f, 0.5f);
+ gl.glPopMatrix();
+ }
+
+/* Draws the crank bell, and the pivot pin for the piston. Also calls the
+ appropreate display list of a piston doing the nesacary rotations before
+ hand. */
+ private void draw_crankbell()
+ {
+ gl.glPushMatrix();
+ gl.glColor4f(1.0f, 0.5f, 0.5f, 1.0f);
+ gl.glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+ myCylinder(obj, 0.3f, 0.08f, 0.12f);
+
+ gl.glColor4f(0.5f, 0.1f, 0.5f, 1.0f);
+ gl.glTranslatef(0.0f, 0.2f, 0.0f);
+ myCylinder(obj, 0.06f, 0.0f, 0.34f);
+
+ gl.glTranslatef(0.0f, 0.0f, 0.22f);
+ gl.glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+ gl.glRotatef(((float)crank_angle)-head_angle, 1.0f, 0.0f, 0.0f);
+ if (filled)
+ {
+ if (textured)
+ gl.glCallList(list_piston_texture);
+ else
+ gl.glCallList(list_piston_filled);
+ }
+ else
+ draw_piston();
+ gl.glPopMatrix();
+ }
+
+ /* Draws the complete crank. Piston also gets drawn through
+ the crank bell function. */
+ private void draw_crank()
+ {
+ gl.glPushMatrix();
+ gl.glRotatef(crank_angle, 1.0f, 0.0f, 0.0f);
+
+ gl.glPushMatrix();
+ gl.glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+ gl.glTranslatef(0.0f, 0.0f, -1.0f);
+ myCylinder(obj, 0.08f, 0.0f, 1.4f);
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(0.28f, 0.0f, 0.0f);
+ draw_crankbell();
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(-0.77f, 0.0f, 0.0f);
+ if (filled)
+ {
+ if (textured)
+ gl.glCallList(list_flywheel_texture);
+ else
+ gl.glCallList(list_flywheel_filled);
+ }
+ else
+ draw_flywheel();
+ gl.glPopMatrix();
+ gl.glPopMatrix();
+ }
+
+ /* Makes a simple checkered pattern image. (Copied from the
+ redbook example "checker.c".) */
+ private void make_image()
+ {
+ int c, idx = 0;
+ for (int i = 0; i < IMAGE_WIDTH; i++)
+ {
+ for (int j = 0; j < IMAGE_HEIGHT; j++)
+ {
+ c = ((((i & 0x8) == 0) ^ ((j & 0x8)) == 0)) ? 255 : 0;
+ image[idx++] = (byte)c;
+ image[idx++] = (byte)c;
+ image[idx++] = (byte)c;
+ }
+ }
+ }
+
+ /* Makes the head lookup table for all possible crank angles. */
+ private void make_table()
+ {
+ for (int i = 0; i < 360; i++)
+ {
+ float rads = PHASE-(((float)i)/FREQ_DIV);
+ head_look_up_table[i] =
+ MAGNITUDE *
+ (float)Math.atan
+ ((ARC_RADIUS*Math.sin(rads)) /
+ (ARC_LENGTH-(ARC_RADIUS*Math.cos(rads))));
+ }
+ }
+
+ // Imported from glut.
+ private void glutWireCube(float size)
+ {
+ drawBox(size, GL_LINE_LOOP);
+ }
+
+ // Imported from glut.
+ private void glutSolidCube(float size)
+ {
+ drawBox(size, GL_QUADS);
+ }
+
+ // Imported from glut.
+ private void drawBox(float size, int type)
+ {
+ float v[][] = new float[8][3];
+ int i;
+
+ v[0][0] = v[1][0] = v[2][0] = v[3][0] = -size / 2;
+ v[4][0] = v[5][0] = v[6][0] = v[7][0] = size / 2;
+ v[0][1] = v[1][1] = v[4][1] = v[5][1] = -size / 2;
+ v[2][1] = v[3][1] = v[6][1] = v[7][1] = size / 2;
+ v[0][2] = v[3][2] = v[4][2] = v[7][2] = -size / 2;
+ v[1][2] = v[2][2] = v[5][2] = v[6][2] = size / 2;
+
+ for (i = 5; i >= 0; i--)
+ {
+ gl.glBegin(type);
+ gl.glNormal3fv(boxnormals[i]);
+ gl.glVertex3fv(v[boxfaces[i][0]]);
+ gl.glVertex3fv(v[boxfaces[i][1]]);
+ gl.glVertex3fv(v[boxfaces[i][2]]);
+ gl.glVertex3fv(v[boxfaces[i][3]]);
+ gl.glEnd();
+ }
+ }
+ }
+}
diff --git a/demos/RonsDemos/steam_plugin13.html b/demos/RonsDemos/steam_plugin13.html
new file mode 100644
index 0000000..252422e
--- /dev/null
+++ b/demos/RonsDemos/steam_plugin13.html
@@ -0,0 +1,53 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Steam by Troy Robinette; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Steam applet
+<br>Originially written by Troy Robinette
+<br>Ported to Java by Ron Cemer
+<br>Right click within the window for a menu of options.
+<br>Left-click within the window, then press any of the following keys:
+<br>Arrow keys rotate the model.
+<br>+ and - keys speed up or slow down the simulation.
+<br>While paused, a and z keys single-step forward and backward.
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "steam.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "steam.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "steam.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "steam.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/surface.html b/demos/RonsDemos/surface.html
new file mode 100644
index 0000000..fa384a5
--- /dev/null
+++ b/demos/RonsDemos/surface.html
@@ -0,0 +1,18 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Surface by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Surface applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>Click inside the window to toggle visibility of the control points.
+<br>
+<applet code="surface.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/surface.java b/demos/RonsDemos/surface.java
new file mode 100644
index 0000000..2d959b8
--- /dev/null
+++ b/demos/RonsDemos/surface.java
@@ -0,0 +1,263 @@
+/**
+ * @(#) surface.java
+ * @(#) author: Silicon Graphics (converted to Java by Ron Cemer)
+ */
+
+/*
+ * Copyright (c) 1993-1997, 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(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+
+/*
+ * This program draws a NURBS surface in the shape of a
+ * symmetrical hill. The 'c' keyboard key allows you to
+ * toggle the visibility of the control points themselves.
+ * Note that some of the control points are hidden by the
+ * surface itself.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+public class surface extends Applet
+{
+ surfaceCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new surfaceCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+
+ /* Destroy the applet */
+
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class surfaceCanvas extends GLCanvas implements MouseListener
+ {
+ float ctlpoints[] = new float [4*4*3];
+ boolean showPoints = false;
+ int theNurb;
+
+ public surfaceCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ float mat_diffuse[] = { 0.7f, 0.7f, 0.7f, 1.0f };
+ float mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float mat_shininess[] = { 100.0f };
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
+
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glEnable(GL_AUTO_NORMAL);
+ gl.glEnable(GL_NORMALIZE);
+
+ init_surface();
+
+ theNurb = glu.gluNewNurbsRenderer();
+ glu.gluNurbsProperty(theNurb, GLU_SAMPLING_TOLERANCE, 25.0f);
+ glu.gluNurbsProperty(theNurb, GLU_DISPLAY_MODE, GLU_FILL);
+
+ glj.gljCheckGL();
+
+ addMouseListener(this);
+ }
+
+ public void cvsDispose()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ super.cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective(45.0f,(double)width/(double)height,3.0f,8.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glTranslatef(0.0f, 0.0f, -5.0f);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ float knots[] = {0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f};
+ int i, j;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ gl.glPushMatrix();
+ gl.glRotatef(330.0f, 1.0f,0.0f,0.0f);
+ gl.glScalef (0.5f, 0.5f, 0.5f);
+
+ glu.gluBeginSurface(theNurb);
+ glu.gluNurbsSurface
+ (theNurb,
+ 8,
+ knots,
+ 8,
+ knots,
+ (4 * 3),
+ 3,
+ ctlpoints,
+ 4,
+ 4,
+ GL_MAP2_VERTEX_3);
+ glu.gluEndSurface(theNurb);
+
+ if (showPoints)
+ {
+ gl.glPointSize(5.0f);
+ gl.glDisable(GL_LIGHTING);
+ gl.glColor3f(1.0f, 1.0f, 0.0f);
+ gl.glBegin(GL_POINTS);
+ for (i = 0; i < 4; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ gl.glVertex3f
+ (ctlpoints[(i*12)+(j*3)+0],
+ ctlpoints[(i*12)+(j*3)+1],
+ ctlpoints[(i*12)+(j*3)+2]);
+ }
+ }
+ gl.glEnd();
+ gl.glEnable(GL_LIGHTING);
+ }
+ gl.glPopMatrix();
+ gl.glFlush();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ private void init_surface()
+ {
+ for (int u = 0; u < 4; u++)
+ {
+ for (int v = 0; v < 4; v++)
+ {
+ ctlpoints[(u*12)+(v*3)+0] = 2.0f*((float)u - 1.5f);
+ ctlpoints[(u*12)+(v*3)+1] = 2.0f*((float)v - 1.5f);
+ if ( (u == 1 || u == 2) && (v == 1 || v == 2) )
+ ctlpoints[(u*12)+(v*3)+2] = 3.0f;
+ else
+ ctlpoints[(u*12)+(v*3)+2] = -3.0f;
+ }
+ }
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ showPoints = !showPoints;
+ repaint();
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ }
+ }
+}
diff --git a/demos/RonsDemos/surface_plugin13.html b/demos/RonsDemos/surface_plugin13.html
new file mode 100644
index 0000000..711d650
--- /dev/null
+++ b/demos/RonsDemos/surface_plugin13.html
@@ -0,0 +1,49 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Surface by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Surface applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>Click inside the window to toggle visibility of the control points.
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "surface.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "surface.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "surface.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "surface.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/teapots.html b/demos/RonsDemos/teapots.html
new file mode 100644
index 0000000..834c206
--- /dev/null
+++ b/demos/RonsDemos/teapots.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Teapots by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<applet code="teapots.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/teapots.java b/demos/RonsDemos/teapots.java
new file mode 100644
index 0000000..c59945a
--- /dev/null
+++ b/demos/RonsDemos/teapots.java
@@ -0,0 +1,465 @@
+/**
+ * @(#) teapots.java
+ * @(#) author: Silicon Graphics, Inc. (converted to Java by Ron Cemer)
+ */
+
+/*
+ * Copyright (c) 1993-1997, 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(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+
+/*
+ * This program demonstrates lots of material properties.
+ * A single light source illuminates the objects.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+public class teapots extends Applet
+{
+ // Data for drawing teapots:
+ /* Rim, body, lid, and bottom data must be reflected in x and
+ y; handle and spout data across the y axis only. */
+ private static final int patchdata[][] =
+ {
+ /* rim */
+ {102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15},
+ /* body */
+ {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27},
+ {24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 40},
+ /* lid */
+ {96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101,
+ 101, 0, 1, 2, 3,},
+ {0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112,
+ 113, 114, 115, 116, 117},
+ /* bottom */
+ {118, 118, 118, 118, 124, 122, 119, 121, 123, 126,
+ 125, 120, 40, 39, 38, 37},
+ /* handle */
+ {41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
+ 53, 54, 55, 56},
+ {53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+ 28, 65, 66, 67},
+ /* spout */
+ {68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83},
+ {80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
+ 92, 93, 94, 95}
+ };
+ private static final float cpdata[][] =
+ {
+ {0.2f, 0.0f, 2.7f}, {0.2f, -0.112f, 2.7f}, {0.112f, -0.2f, 2.7f}, {0.0f,
+ -0.2f, 2.7f}, {1.3375f, 0.0f, 2.53125f}, {1.3375f, -0.749f, 2.53125f},
+ {0.749f, -1.3375f, 2.53125f}, {0.0f, -1.3375f, 2.53125f}, {1.4375f,
+ 0.0f, 2.53125f}, {1.4375f, -0.805f, 2.53125f}, {0.805f, -1.4375f,
+ 2.53125f}, {0.0f, -1.4375f, 2.53125f}, {1.5f, 0.0f, 2.4f}, {1.5f, -0.84f,
+ 2.4f}, {0.84f, -1.5f, 2.4f}, {0.0f, -1.5f, 2.4f}, {1.75f, 0.0f, 1.875f},
+ {1.75f, -0.98f, 1.875f}, {0.98f, -1.75f, 1.875f}, {0.0f, -1.75f,
+ 1.875f}, {2f, 0.0f, 1.35f}, {2f, -1.12f, 1.35f}, {1.12f, -2f, 1.35f},
+ {0.0f, -2f, 1.35f}, {2f, 0.0f, 0.9f}, {2f, -1.12f, 0.9f}, {1.12f, -2f,
+ 0.9f}, {0.0f, -2f, 0.9f}, {-2f, 0.0f, 0.9f}, {2f, 0.0f, 0.45f}, {2f, -1.12f,
+ 0.45f}, {1.12f, -2f, 0.45f}, {0.0f, -2f, 0.45f}, {1.5f, 0.0f, 0.225f},
+ {1.5f, -0.84f, 0.225f}, {0.84f, -1.5f, 0.225f}, {0.0f, -1.5f, 0.225f},
+ {1.5f, 0.0f, 0.15f}, {1.5f, -0.84f, 0.15f}, {0.84f, -1.5f, 0.15f}, {0.0f,
+ -1.5f, 0.15f}, {-1.6f, 0.0f, 2.025f}, {-1.6f, -0.3f, 2.025f}, {-1.5f,
+ -0.3f, 2.25f}, {-1.5f, 0.0f, 2.25f}, {-2.3f, 0.0f, 2.025f}, {-2.3f, -0.3f,
+ 2.025f}, {-2.5f, -0.3f, 2.25f}, {-2.5f, 0.0f, 2.25f}, {-2.7f, 0.0f,
+ 2.025f}, {-2.7f, -0.3f, 2.025f}, {-3f, -0.3f, 2.25f}, {-3f, 0.0f,
+ 2.25f}, {-2.7f, 0.0f, 1.8f}, {-2.7f, -0.3f, 1.8f}, {-3f, -0.3f, 1.8f},
+ {-3f, 0.0f, 1.8f}, {-2.7f, 0.0f, 1.575f}, {-2.7f, -0.3f, 1.575f}, {-3f,
+ -0.3f, 1.35f}, {-3f, 0.0f, 1.35f}, {-2.5f, 0.0f, 1.125f}, {-2.5f, -0.3f,
+ 1.125f}, {-2.65f, -0.3f, 0.9375f}, {-2.65f, 0.0f, 0.9375f}, {-2f,
+ -0.3f, 0.9f}, {-1.9f, -0.3f, 0.6f}, {-1.9f, 0.0f, 0.6f}, {1.7f, 0.0f,
+ 1.425f}, {1.7f, -0.66f, 1.425f}, {1.7f, -0.66f, 0.6f}, {1.7f, 0.0f,
+ 0.6f}, {2.6f, 0.0f, 1.425f}, {2.6f, -0.66f, 1.425f}, {3.1f, -0.66f,
+ 0.825f}, {3.1f, 0.0f, 0.825f}, {2.3f, 0.0f, 2.1f}, {2.3f, -0.25f, 2.1f},
+ {2.4f, -0.25f, 2.025f}, {2.4f, 0.0f, 2.025f}, {2.7f, 0.0f, 2.4f}, {2.7f,
+ -0.25f, 2.4f}, {3.3f, -0.25f, 2.4f}, {3.3f, 0.0f, 2.4f}, {2.8f, 0.0f,
+ 2.475f}, {2.8f, -0.25f, 2.475f}, {3.525f, -0.25f, 2.49375f},
+ {3.525f, 0.0f, 2.49375f}, {2.9f, 0.0f, 2.475f}, {2.9f, -0.15f, 2.475f},
+ {3.45f, -0.15f, 2.5125f}, {3.45f, 0.0f, 2.5125f}, {2.8f, 0.0f, 2.4f},
+ {2.8f, -0.15f, 2.4f}, {3.2f, -0.15f, 2.4f}, {3.2f, 0.0f, 2.4f}, {0.0f, 0.0f,
+ 3.15f}, {0.8f, 0.0f, 3.15f}, {0.8f, -0.45f, 3.15f}, {0.45f, -0.8f,
+ 3.15f}, {0.0f, -0.8f, 3.15f}, {0.0f, 0.0f, 2.85f}, {1.4f, 0.0f, 2.4f}, {1.4f,
+ -0.784f, 2.4f}, {0.784f, -1.4f, 2.4f}, {0.0f, -1.4f, 2.4f}, {0.4f, 0.0f,
+ 2.55f}, {0.4f, -0.224f, 2.55f}, {0.224f, -0.4f, 2.55f}, {0.0f, -0.4f,
+ 2.55f}, {1.3f, 0.0f, 2.55f}, {1.3f, -0.728f, 2.55f}, {0.728f, -1.3f,
+ 2.55f}, {0.0f, -1.3f, 2.55f}, {1.3f, 0.0f, 2.4f}, {1.3f, -0.728f, 2.4f},
+ {0.728f, -1.3f, 2.4f}, {0.0f, -1.3f, 2.4f}, {0.0f, 0.0f, 0.0f}, {1.425f,
+ -0.798f, 0.0f}, {1.5f, 0.0f, 0.075f}, {1.425f, 0.0f, 0.0f}, {0.798f, -1.425f,
+ 0.0f}, {0.0f, -1.5f, 0.075f}, {0.0f, -1.425f, 0.0f}, {1.5f, -0.84f, 0.075f},
+ {0.84f, -1.5f, 0.075f}
+ };
+ private static final float tex[] =
+ {
+ 0.0f, 0.0f,
+ 1.0f, 0.0f,
+ 0.0f, 1.0f,
+ 1.0f, 1.0f
+ };
+
+ teapotsCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new teapotsCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("teapots");
+
+ teapots applet = new teapots();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class teapotsCanvas extends GLCanvas
+ {
+ int teapotList;
+
+ public teapotsCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ float ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
+ float diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float specular[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ float position[] = {0.0f, 3.0f, 3.0f, 0.0f};
+
+ float lmodel_ambient[] = {0.2f, 0.2f, 0.2f, 1.0f};
+ float local_view[] = {0.0f};
+
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, position);
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ gl.glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);
+
+ gl.glFrontFace(GL_CW);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_AUTO_NORMAL);
+ gl.glEnable(GL_NORMALIZE);
+ gl.glEnable(GL_DEPTH_TEST);
+ /* be efficient--make teapot display list */
+ teapotList = gl.glGenLists(1);
+ gl.glNewList(teapotList, GL_COMPILE);
+ glutSolidTeapot(1.0);
+ gl.glEndList();
+
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ if (width <= height)
+ gl.glOrtho
+ (0.0f,
+ 16.0f,
+ 0.0f,
+ 16.0f*(float)height/(float)width,
+ -10.0f,
+ 10.0f);
+ else
+ gl.glOrtho
+ (0.0f,
+ 16.0f*(float)width/(float)height,
+ 0.0f,
+ 16.0,
+ -10.0f,
+ 10.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ /**
+ * First column: emerald, jade, obsidian, pearl, ruby, turquoise
+ * 2nd column: brass, bronze, chrome, copper, gold, silver
+ * 3rd column: black, cyan, green, red, white, yellow plastic
+ * 4th column: black, cyan, green, red, white, yellow rubber
+ */
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ renderTeapot
+ (2.0f, 17.0f, 0.0215f, 0.1745f, 0.0215f,
+ 0.07568f, 0.61424f, 0.07568f, 0.633f, 0.727811f, 0.633f, 0.6f);
+ renderTeapot
+ (2.0f, 14.0f, 0.135f, 0.2225f, 0.1575f,
+ 0.54f, 0.89f, 0.63f, 0.316228f, 0.316228f, 0.316228f, 0.1f);
+ renderTeapot
+ (2.0f, 11.0f, 0.05375f, 0.05f, 0.06625f,
+ 0.18275f, 0.17f, 0.22525f, 0.332741f, 0.328634f, 0.346435f, 0.3f);
+ renderTeapot
+ (2.0f, 8.0f, 0.25f, 0.20725f, 0.20725f,
+ 1f, 0.829f, 0.829f, 0.296648f, 0.296648f, 0.296648f, 0.088f);
+ renderTeapot
+ (2.0f, 5.0f, 0.1745f, 0.01175f, 0.01175f,
+ 0.61424f, 0.04136f, 0.04136f, 0.727811f, 0.626959f, 0.626959f, 0.6f);
+ renderTeapot
+ (2.0f, 2.0f, 0.1f, 0.18725f, 0.1745f,
+ 0.396f, 0.74151f, 0.69102f, 0.297254f, 0.30829f, 0.306678f, 0.1f);
+ renderTeapot
+ (6.0f, 17.0f, 0.329412f, 0.223529f, 0.027451f,
+ 0.780392f, 0.568627f, 0.113725f, 0.992157f, 0.941176f, 0.807843f,
+ 0.21794872f);
+ renderTeapot
+ (6.0f, 14.0f, 0.2125f, 0.1275f, 0.054f,
+ 0.714f, 0.4284f, 0.18144f, 0.393548f, 0.271906f, 0.166721f, 0.2f);
+ renderTeapot
+ (6.0f, 11.0f, 0.25f, 0.25f, 0.25f,
+ 0.4f, 0.4f, 0.4f, 0.774597f, 0.774597f, 0.774597f, 0.6f);
+ renderTeapot
+ (6.0f, 8.0f, 0.19125f, 0.0735f, 0.0225f,
+ 0.7038f, 0.27048f, 0.0828f, 0.256777f, 0.137622f, 0.086014f, 0.1f);
+ renderTeapot
+ (6.0f, 5.0f, 0.24725f, 0.1995f, 0.0745f,
+ 0.75164f, 0.60648f, 0.22648f, 0.628281f, 0.555802f, 0.366065f, 0.4f);
+ renderTeapot
+ (6.0f, 2.0f, 0.19225f, 0.19225f, 0.19225f,
+ 0.50754f, 0.50754f, 0.50754f, 0.508273f, 0.508273f, 0.508273f, 0.4f);
+ renderTeapot
+ (10.0f, 17.0f, 0.0f, 0.0f, 0.0f, 0.01f, 0.01f, 0.01f,
+ 0.50f, 0.50f, 0.50f, .25f);
+ renderTeapot
+ (10.0f, 14.0f, 0.0f, 0.1f, 0.06f, 0.0f, 0.50980392f, 0.50980392f,
+ 0.50196078f, 0.50196078f, 0.50196078f, .25f);
+ renderTeapot
+ (10.0f, 11.0f, 0.0f, 0.0f, 0.0f,
+ 0.1f, 0.35f, 0.1f, 0.45f, 0.55f, 0.45f, .25f);
+ renderTeapot
+ (10.0f, 8.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f,
+ 0.7f, 0.6f, 0.6f, .25f);
+ renderTeapot
+ (10.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.55f, 0.55f, 0.55f,
+ 0.70f, 0.70f, 0.70f, .25f);
+ renderTeapot
+ (10.0f, 2.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.5f, 0.0f,
+ 0.60f, 0.60f, 0.50f, .25f);
+ renderTeapot
+ (14.0f, 17.0f, 0.02f, 0.02f, 0.02f, 0.01f, 0.01f, 0.01f,
+ 0.4f, 0.4f, 0.4f, .078125f);
+ renderTeapot
+ (14.0f, 14.0f, 0.0f, 0.05f, 0.05f, 0.4f, 0.5f, 0.5f,
+ 0.04f, 0.7f, 0.7f, .078125f);
+ renderTeapot
+ (14.0f, 11.0f, 0.0f, 0.05f, 0.0f, 0.4f, 0.5f, 0.4f,
+ 0.04f, 0.7f, 0.04f, .078125f);
+ renderTeapot
+ (14.0f, 8.0f, 0.05f, 0.0f, 0.0f, 0.5f, 0.4f, 0.4f,
+ 0.7f, 0.04f, 0.04f, .078125f);
+ renderTeapot
+ (14.0f, 5.0f, 0.05f, 0.05f, 0.05f, 0.5f, 0.5f, 0.5f,
+ 0.7f, 0.7f, 0.7f, .078125f);
+ renderTeapot
+ (14.0f, 2.0f, 0.05f, 0.05f, 0.0f, 0.5f, 0.5f, 0.4f,
+ 0.7f, 0.7f, 0.04f, .078125f);
+ gl.glFlush();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ /*
+ * Move object into position. Use 3rd through 12th
+ * parameters to specify the material property. Draw a teapot.
+ */
+ private void renderTeapot
+ (float x,
+ float y,
+ float ambr,
+ float ambg,
+ float ambb,
+ float difr,
+ float difg,
+ float difb,
+ float specr,
+ float specg,
+ float specb,
+ float shine)
+ {
+ float mat[] = new float[4];
+
+ gl.glPushMatrix();
+ gl.glTranslatef(x, y, 0.0f);
+ mat[0] = ambr; mat[1] = ambg; mat[2] = ambb; mat[3] = 1.0f;
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, mat);
+ mat[0] = difr; mat[1] = difg; mat[2] = difb;
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, mat);
+ mat[0] = specr; mat[1] = specg; mat[2] = specb;
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat);
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, shine * 128.0f);
+ gl.glCallList(teapotList);
+ gl.glPopMatrix();
+ }
+
+ // Imported from glut.
+ private void glutSolidTeapot(double scale)
+ {
+ teapot(14, scale, GL_FILL);
+ }
+
+ // Imported from glut.
+ private void teapot(int grid, double scale, int type)
+ {
+ float p[] = new float[4*4*3];
+ float q[] = new float[4*4*3];
+ float r[] = new float[4*4*3];
+ float s[] = new float[4*4*3];
+ float sc = (float)(0.5*scale);
+
+ gl.glPushAttrib(GL_ENABLE_BIT | GL_EVAL_BIT);
+ gl.glEnable(GL_AUTO_NORMAL);
+ gl.glEnable(GL_NORMALIZE);
+ gl.glEnable(GL_MAP2_VERTEX_3);
+ gl.glEnable(GL_MAP2_TEXTURE_COORD_2);
+ gl.glPushMatrix();
+ gl.glRotatef(270.0f, 1.0f, 0.0f, 0.0f);
+ gl.glScalef(sc, sc, sc);
+ gl.glTranslatef(0.0f, 0.0f, -1.5f);
+ for (int i = 0; i < 10; i++)
+ {
+ for (int j = 0; j < 4; j++)
+ {
+ for (int k = 0; k < 4; k++)
+ {
+ for (int l = 0; l < 3; l++)
+ {
+ p[(j*12)+(k*3)+l] = cpdata[patchdata[i][j * 4 + k]][l];
+ q[(j*12)+(k*3)+l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
+ if (l == 1)
+ q[(j*12)+(k*3)+l] *= -1.0f;
+ if (i < 6)
+ {
+ r[(j*12)+(k*3)+l] =
+ cpdata[patchdata[i][j * 4 + (3 - k)]][l];
+ if (l == 0)
+ r[(j*12)+(k*3)+l] *= -1.0f;
+ s[(j*12)+(k*3)+l] =
+ cpdata[patchdata[i][j * 4 + k]][l];
+ if (l == 0)
+ s[(j*12)+(k*3)+l] *= -1.0f;
+ if (l == 1)
+ s[(j*12)+(k*3)+l] *= -1.0f;
+ }
+ }
+ }
+ }
+ gl.glMap2f
+ (GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, tex);
+ gl.glMap2f
+ (GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, p);
+ gl.glMapGrid2f(grid, 0.0f, 1.0f, grid, 0.0f, 1.0f);
+ gl.glEvalMesh2(type, 0, grid, 0, grid);
+ gl.glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, q);
+ gl.glEvalMesh2(type, 0, grid, 0, grid);
+ if (i < 6)
+ {
+ gl.glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, r);
+ gl.glEvalMesh2(type, 0, grid, 0, grid);
+ gl.glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, s);
+ gl.glEvalMesh2(type, 0, grid, 0, grid);
+ }
+ }
+ gl.glPopMatrix();
+ gl.glPopAttrib();
+ }
+ }
+}
diff --git a/demos/RonsDemos/teapots_plugin13.html b/demos/RonsDemos/teapots_plugin13.html
new file mode 100644
index 0000000..19ee75d
--- /dev/null
+++ b/demos/RonsDemos/teapots_plugin13.html
@@ -0,0 +1,48 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Teapots by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Teapots applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "teapots.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "teapots.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "teapots.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "teapots.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/texgen.html b/demos/RonsDemos/texgen.html
new file mode 100644
index 0000000..859d220
--- /dev/null
+++ b/demos/RonsDemos/texgen.html
@@ -0,0 +1,22 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Texgen by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Texgen applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>Click inside the window, then press any of the following keys:
+<br>e/E: generate eye linear texture coordinates
+<br>o/O: generate object linear texture coordinates
+<br>s/S: use a slanted plane for texture coordinate generation
+<br>x/X: use a flat plane (x = 0) for texture coordinate generation
+<br>
+<applet code="texgen.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/texgen.java b/demos/RonsDemos/texgen.java
new file mode 100644
index 0000000..bbc3288
--- /dev/null
+++ b/demos/RonsDemos/texgen.java
@@ -0,0 +1,478 @@
+/**
+ * @(#) texgen.java
+ * @(#) author: Silicon Graphics, Inc. (converted to Java by Ron Cemer)
+ */
+
+/*
+ * Copyright (c) 1993-1997, 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(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+
+/* This program draws a texture mapped teapot with
+ * automatically generated texture coordinates. The
+ * texture is rendered as stripes on the teapot.
+ * Initially, the object is drawn with texture coordinates
+ * based upon the object coordinates of the vertex
+ * and distance from the plane x = 0. Pressing the 'e'
+ * key changes the coordinate generation to eye coordinates
+ * of the vertex. Pressing the 'o' key switches it back
+ * to the object coordinates. Pressing the 's' key
+ * changes the plane to a slanted one (x + y + z = 0).
+ * Pressing the 'x' key switches it back to x = 0.
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+
+public class texgen extends Applet
+{
+ // Data for drawing teapots:
+ /* Rim, body, lid, and bottom data must be reflected in x and
+ y; handle and spout data across the y axis only. */
+ private static final int patchdata[][] =
+ {
+ /* rim */
+ {102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11,
+ 12, 13, 14, 15},
+ /* body */
+ {12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+ 24, 25, 26, 27},
+ {24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36,
+ 37, 38, 39, 40},
+ /* lid */
+ {96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101,
+ 101, 0, 1, 2, 3,},
+ {0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112,
+ 113, 114, 115, 116, 117},
+ /* bottom */
+ {118, 118, 118, 118, 124, 122, 119, 121, 123, 126,
+ 125, 120, 40, 39, 38, 37},
+ /* handle */
+ {41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
+ 53, 54, 55, 56},
+ {53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+ 28, 65, 66, 67},
+ /* spout */
+ {68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83},
+ {80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
+ 92, 93, 94, 95}
+ };
+ private static final float cpdata[][] =
+ {
+ {0.2f, 0.0f, 2.7f}, {0.2f, -0.112f, 2.7f}, {0.112f, -0.2f, 2.7f}, {0.0f,
+ -0.2f, 2.7f}, {1.3375f, 0.0f, 2.53125f}, {1.3375f, -0.749f, 2.53125f},
+ {0.749f, -1.3375f, 2.53125f}, {0.0f, -1.3375f, 2.53125f}, {1.4375f,
+ 0.0f, 2.53125f}, {1.4375f, -0.805f, 2.53125f}, {0.805f, -1.4375f,
+ 2.53125f}, {0.0f, -1.4375f, 2.53125f}, {1.5f, 0.0f, 2.4f}, {1.5f, -0.84f,
+ 2.4f}, {0.84f, -1.5f, 2.4f}, {0.0f, -1.5f, 2.4f}, {1.75f, 0.0f, 1.875f},
+ {1.75f, -0.98f, 1.875f}, {0.98f, -1.75f, 1.875f}, {0.0f, -1.75f,
+ 1.875f}, {2f, 0.0f, 1.35f}, {2f, -1.12f, 1.35f}, {1.12f, -2f, 1.35f},
+ {0.0f, -2f, 1.35f}, {2f, 0.0f, 0.9f}, {2f, -1.12f, 0.9f}, {1.12f, -2f,
+ 0.9f}, {0.0f, -2f, 0.9f}, {-2f, 0.0f, 0.9f}, {2f, 0.0f, 0.45f}, {2f, -1.12f,
+ 0.45f}, {1.12f, -2f, 0.45f}, {0.0f, -2f, 0.45f}, {1.5f, 0.0f, 0.225f},
+ {1.5f, -0.84f, 0.225f}, {0.84f, -1.5f, 0.225f}, {0.0f, -1.5f, 0.225f},
+ {1.5f, 0.0f, 0.15f}, {1.5f, -0.84f, 0.15f}, {0.84f, -1.5f, 0.15f}, {0.0f,
+ -1.5f, 0.15f}, {-1.6f, 0.0f, 2.025f}, {-1.6f, -0.3f, 2.025f}, {-1.5f,
+ -0.3f, 2.25f}, {-1.5f, 0.0f, 2.25f}, {-2.3f, 0.0f, 2.025f}, {-2.3f, -0.3f,
+ 2.025f}, {-2.5f, -0.3f, 2.25f}, {-2.5f, 0.0f, 2.25f}, {-2.7f, 0.0f,
+ 2.025f}, {-2.7f, -0.3f, 2.025f}, {-3f, -0.3f, 2.25f}, {-3f, 0.0f,
+ 2.25f}, {-2.7f, 0.0f, 1.8f}, {-2.7f, -0.3f, 1.8f}, {-3f, -0.3f, 1.8f},
+ {-3f, 0.0f, 1.8f}, {-2.7f, 0.0f, 1.575f}, {-2.7f, -0.3f, 1.575f}, {-3f,
+ -0.3f, 1.35f}, {-3f, 0.0f, 1.35f}, {-2.5f, 0.0f, 1.125f}, {-2.5f, -0.3f,
+ 1.125f}, {-2.65f, -0.3f, 0.9375f}, {-2.65f, 0.0f, 0.9375f}, {-2f,
+ -0.3f, 0.9f}, {-1.9f, -0.3f, 0.6f}, {-1.9f, 0.0f, 0.6f}, {1.7f, 0.0f,
+ 1.425f}, {1.7f, -0.66f, 1.425f}, {1.7f, -0.66f, 0.6f}, {1.7f, 0.0f,
+ 0.6f}, {2.6f, 0.0f, 1.425f}, {2.6f, -0.66f, 1.425f}, {3.1f, -0.66f,
+ 0.825f}, {3.1f, 0.0f, 0.825f}, {2.3f, 0.0f, 2.1f}, {2.3f, -0.25f, 2.1f},
+ {2.4f, -0.25f, 2.025f}, {2.4f, 0.0f, 2.025f}, {2.7f, 0.0f, 2.4f}, {2.7f,
+ -0.25f, 2.4f}, {3.3f, -0.25f, 2.4f}, {3.3f, 0.0f, 2.4f}, {2.8f, 0.0f,
+ 2.475f}, {2.8f, -0.25f, 2.475f}, {3.525f, -0.25f, 2.49375f},
+ {3.525f, 0.0f, 2.49375f}, {2.9f, 0.0f, 2.475f}, {2.9f, -0.15f, 2.475f},
+ {3.45f, -0.15f, 2.5125f}, {3.45f, 0.0f, 2.5125f}, {2.8f, 0.0f, 2.4f},
+ {2.8f, -0.15f, 2.4f}, {3.2f, -0.15f, 2.4f}, {3.2f, 0.0f, 2.4f}, {0.0f, 0.0f,
+ 3.15f}, {0.8f, 0.0f, 3.15f}, {0.8f, -0.45f, 3.15f}, {0.45f, -0.8f,
+ 3.15f}, {0.0f, -0.8f, 3.15f}, {0.0f, 0.0f, 2.85f}, {1.4f, 0.0f, 2.4f}, {1.4f,
+ -0.784f, 2.4f}, {0.784f, -1.4f, 2.4f}, {0.0f, -1.4f, 2.4f}, {0.4f, 0.0f,
+ 2.55f}, {0.4f, -0.224f, 2.55f}, {0.224f, -0.4f, 2.55f}, {0.0f, -0.4f,
+ 2.55f}, {1.3f, 0.0f, 2.55f}, {1.3f, -0.728f, 2.55f}, {0.728f, -1.3f,
+ 2.55f}, {0.0f, -1.3f, 2.55f}, {1.3f, 0.0f, 2.4f}, {1.3f, -0.728f, 2.4f},
+ {0.728f, -1.3f, 2.4f}, {0.0f, -1.3f, 2.4f}, {0.0f, 0.0f, 0.0f}, {1.425f,
+ -0.798f, 0.0f}, {1.5f, 0.0f, 0.075f}, {1.425f, 0.0f, 0.0f}, {0.798f, -1.425f,
+ 0.0f}, {0.0f, -1.5f, 0.075f}, {0.0f, -1.425f, 0.0f}, {1.5f, -0.84f, 0.075f},
+ {0.84f, -1.5f, 0.075f}
+ };
+ private static final float tex[] =
+ {
+ 0.0f, 0.0f,
+ 1.0f, 0.0f,
+ 0.0f, 1.0f,
+ 1.0f, 1.0f
+ };
+
+ texgenCanvas canvas = null;
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ Dimension d = getSize();
+ setLayout(new BorderLayout());
+ canvas = new texgenCanvas(d.width, d.height);
+ canvas.requestFocus();
+ add("Center", canvas);
+ }
+
+
+ /* Start the applet */
+
+
+ public void start()
+ {
+ }
+
+
+ /* Stop the applet */
+
+
+ public void stop()
+ {
+ }
+
+
+
+
+ /* Local GLCanvas extension class */
+
+
+ private class texgenCanvas extends GLCanvas
+ implements KeyListener, MouseListener
+ {
+ private static final int stripeImageWidth = 32;
+ private byte stripeImage[] = new byte[4*stripeImageWidth];
+ private int texName;
+
+ /* planes for texture coordinate generation */
+ private float xequalzero[] = {1.0f, 0.0f, 0.0f, 0.0f};
+ private float slanted[] = {1.0f, 1.0f, 1.0f, 0.0f};
+ private float currentCoeff[];
+ private int currentPlane;
+ private int currentGenMode;
+
+ public texgenCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glShadeModel(GL_SMOOTH);
+
+ makeStripeImage();
+ gl.glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+ int tnbuf[] = new int[1];
+ gl.glGenTextures(1, tnbuf);
+ texName = tnbuf[0];
+ gl.glBindTexture(GL_TEXTURE_1D, texName);
+ gl.glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ gl.glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gl.glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ gl.glTexImage1D
+ (GL_TEXTURE_1D,
+ 0,
+ GL_RGBA,
+ stripeImageWidth,
+ 0,
+ GL_RGBA,
+ GL_UNSIGNED_BYTE,
+ stripeImage);
+ gl.glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ currentCoeff = xequalzero;
+ currentGenMode = GL_OBJECT_LINEAR;
+ currentPlane = GL_OBJECT_PLANE;
+ gl.glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, currentGenMode);
+ gl.glTexGenfv(GL_S, currentPlane, currentCoeff);
+
+ gl.glEnable(GL_TEXTURE_GEN_S);
+ gl.glEnable(GL_TEXTURE_1D);
+ gl.glEnable(GL_CULL_FACE);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_AUTO_NORMAL);
+ gl.glEnable(GL_NORMALIZE);
+ gl.glFrontFace(GL_CW);
+ gl.glCullFace(GL_BACK);
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, 64.0f);
+
+ glj.gljCheckGL();
+
+ addKeyListener(this);
+ addMouseListener(this);
+ }
+
+ public void cvsDispose()
+ {
+ System.out.println("destroy(): " + this);
+ removeKeyListener(this);
+ super.cvsDispose();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ if (width <= height)
+ gl.glOrtho
+ (-3.5f,3.5f,-3.5f*(float)height/(float)width,
+ 3.5f*(float)height/(float)width,-3.5f,3.5f);
+ else
+ gl.glOrtho
+ (-3.5f*(float)width/(float)height,
+ 3.5f*(float)width/(float)height,-3.5f,3.5f,-3.5f,3.5f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ if (width <= height)
+ gl.glOrtho
+ (-3.5f,3.5f,-3.5f*(float)height/(float)width,
+ 3.5f*(float)height/(float)width,-3.5f,3.5f);
+ else
+ gl.glOrtho
+ (-3.5f*(float)width/(float)height,
+ 3.5f*(float)width/(float)height,-3.5f,3.5f,-3.5f,3.5f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ gl.glPushMatrix ();
+ gl.glRotatef(45.0f, 0.0f, 0.0f, 1.0f);
+ gl.glBindTexture(GL_TEXTURE_1D, texName);
+ glutSolidTeapot(2.0f);
+ gl.glPopMatrix();
+ gl.glFlush();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ // Methods required for the implementation of KeyListener
+ public void keyPressed(KeyEvent e)
+ {
+ }
+
+ public void keyReleased(KeyEvent e)
+ {
+ }
+
+ public void keyTyped(KeyEvent e)
+ {
+ if (glj.gljMakeCurrent() == false) return;
+ boolean dorepaint = false;
+ switch ((char)e.getKeyChar())
+ {
+ case 'e':
+ case 'E':
+ currentGenMode = GL_EYE_LINEAR;
+ currentPlane = GL_EYE_PLANE;
+ gl.glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, currentGenMode);
+ gl.glTexGenfv(GL_S, currentPlane, currentCoeff);
+ dorepaint = true;
+ break;
+ case 'o':
+ case 'O':
+ currentGenMode = GL_OBJECT_LINEAR;
+ currentPlane = GL_OBJECT_PLANE;
+ gl.glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, currentGenMode);
+ gl.glTexGenfv(GL_S, currentPlane, currentCoeff);
+ dorepaint = true;
+ break;
+ case 's':
+ case 'S':
+ currentCoeff = slanted;
+ gl.glTexGenfv(GL_S, currentPlane, currentCoeff);
+ dorepaint = true;
+ break;
+ case 'x':
+ case 'X':
+ currentCoeff = xequalzero;
+ gl.glTexGenfv(GL_S, currentPlane, currentCoeff);
+ dorepaint = true;
+ break;
+ }
+ glj.gljFree();
+ if (dorepaint) repaint();
+ }
+
+ private void makeStripeImage()
+ {
+ for (int j = 0; j < stripeImageWidth; j++)
+ {
+ stripeImage[4*j] = (byte)((j<=4) ? 255 : 0);
+ stripeImage[4*j+1] = (byte)((j>4) ? 255 : 0);
+ stripeImage[4*j+2] = (byte)0;
+ stripeImage[4*j+3] = (byte)255;
+ }
+ }
+
+ // Imported from glut.
+ private void glutSolidTeapot(double scale)
+ {
+ teapot(14, scale, GL_FILL);
+ }
+
+ // Imported from glut.
+ private void teapot(int grid, double scale, int type)
+ {
+ float p[] = new float[4*4*3];
+ float q[] = new float[4*4*3];
+ float r[] = new float[4*4*3];
+ float s[] = new float[4*4*3];
+ float sc = (float)(0.5*scale);
+
+ gl.glPushAttrib(GL_ENABLE_BIT | GL_EVAL_BIT);
+ gl.glEnable(GL_AUTO_NORMAL);
+ gl.glEnable(GL_NORMALIZE);
+ gl.glEnable(GL_MAP2_VERTEX_3);
+ gl.glEnable(GL_MAP2_TEXTURE_COORD_2);
+ gl.glPushMatrix();
+ gl.glRotatef(270.0f, 1.0f, 0.0f, 0.0f);
+ gl.glScalef(sc, sc, sc);
+ gl.glTranslatef(0.0f, 0.0f, -1.5f);
+ for (int i = 0; i < 10; i++)
+ {
+ for (int j = 0; j < 4; j++)
+ {
+ for (int k = 0; k < 4; k++)
+ {
+ for (int l = 0; l < 3; l++)
+ {
+ p[(j*12)+(k*3)+l] = cpdata[patchdata[i][j * 4 + k]][l];
+ q[(j*12)+(k*3)+l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l];
+ if (l == 1)
+ q[(j*12)+(k*3)+l] *= -1.0f;
+ if (i < 6)
+ {
+ r[(j*12)+(k*3)+l] =
+ cpdata[patchdata[i][j * 4 + (3 - k)]][l];
+ if (l == 0)
+ r[(j*12)+(k*3)+l] *= -1.0f;
+ s[(j*12)+(k*3)+l] =
+ cpdata[patchdata[i][j * 4 + k]][l];
+ if (l == 0)
+ s[(j*12)+(k*3)+l] *= -1.0f;
+ if (l == 1)
+ s[(j*12)+(k*3)+l] *= -1.0f;
+ }
+ }
+ }
+ }
+ gl.glMap2f
+ (GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, tex);
+ gl.glMap2f
+ (GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, p);
+ gl.glMapGrid2f(grid, 0.0f, 1.0f, grid, 0.0f, 1.0f);
+ gl.glEvalMesh2(type, 0, grid, 0, grid);
+ gl.glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, q);
+ gl.glEvalMesh2(type, 0, grid, 0, grid);
+ if (i < 6)
+ {
+ gl.glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, r);
+ gl.glEvalMesh2(type, 0, grid, 0, grid);
+ gl.glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, s);
+ gl.glEvalMesh2(type, 0, grid, 0, grid);
+ }
+ }
+ gl.glPopMatrix();
+ gl.glPopAttrib();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+
+ public void mouseExited( MouseEvent evt )
+ { }
+ public void mousePressed( MouseEvent evt )
+ { }
+ public void mouseReleased( MouseEvent evt )
+ { }
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ if( comp.equals(this ) )
+ {
+ requestFocus();
+ }
+ }
+ }
+}
diff --git a/demos/RonsDemos/texgen_plugin13.html b/demos/RonsDemos/texgen_plugin13.html
new file mode 100644
index 0000000..f776b4c
--- /dev/null
+++ b/demos/RonsDemos/texgen_plugin13.html
@@ -0,0 +1,53 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Texgen by Silicon Graphics; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Texgen applet
+<br>Originially written by Silicon Graphics
+<br>Ported to Java by Ron Cemer
+<br>Click inside the window, then press any of the following keys:
+<br>e/E: generate eye linear texture coordinates
+<br>o/O: generate object linear texture coordinates
+<br>s/S: use a slanted plane for texture coordinate generation
+<br>x/X: use a flat plane (x = 0) for texture coordinate generation
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "texgen.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "texgen.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "texgen.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "texgen.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/texobj.html b/demos/RonsDemos/texobj.html
new file mode 100644
index 0000000..63f7d5b
--- /dev/null
+++ b/demos/RonsDemos/texobj.html
@@ -0,0 +1,18 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Texobj by Brian Paul; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Texobj applet
+<br>Originially written by Brian Paul
+<br>Ported to Java by Ron Cemer
+<br>
+<hr>
+<applet code="texobj.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/texobj.java b/demos/RonsDemos/texobj.java
new file mode 100644
index 0000000..49923a0
--- /dev/null
+++ b/demos/RonsDemos/texobj.java
@@ -0,0 +1,233 @@
+/**
+ * @(#) texobj.java
+ * @(#) author: Brian Paul (converted to Java by Ron Cemer)
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class texobj extends SimpleGLAnimApplet1
+{
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new texobjCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class texobjCanvas extends GLAnimCanvas
+ {
+ private int TexObj[];
+ float Angle = 0.0f;
+
+ public texobjCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+
+ TexObj = new int[2];
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ int width = 8, height = 8;
+ byte tex1[] =
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 1, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ };
+ byte tex2[] =
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 2, 0, 0, 0,
+ 0, 0, 2, 0, 0, 2, 0, 0,
+ 0, 0, 0, 0, 0, 2, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0,
+ 0, 0, 2, 2, 2, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0
+ };
+ byte tex[] = new byte[64*3];
+ int i, j;
+
+ gl.glDisable(GL_DITHER);
+
+ /* Setup texturing */
+ gl.glEnable(GL_TEXTURE_2D);
+ gl.glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
+ gl.glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_FASTEST);
+
+ /* generate texture object IDs */
+ gl.glGenTextures(2, TexObj);
+
+ /* setup first texture object */
+ gl.glBindTexture(GL_TEXTURE_2D, TexObj[0]);
+ /* red on white */
+ for (i = 0; i < height; i++)
+ {
+ for (j = 0; j < width; j++)
+ {
+ int p = i*width+j;
+ if ((tex1[(height-i-1)*width+j]) != (byte)0)
+ {
+ tex[p*3] = (byte)255;
+ tex[(p*3)+1] = (byte)0;
+ tex[(p*3)+2] = (byte)0;
+ }
+ else
+ {
+ tex[p*3] = (byte)255;
+ tex[(p*3)+1] = (byte)255;
+ tex[(p*3)+2] = (byte)255;
+ }
+ }
+ }
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,
+ 0,
+ 3,
+ width,
+ height,
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ tex);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ /* end of texture object */
+
+ /* setup second texture object */
+ gl.glBindTexture(GL_TEXTURE_2D,TexObj[1]);
+ /* green on blue */
+ for (i = 0; i < height; i++)
+ {
+ for (j = 0; j < width; j++)
+ {
+ int p = i*width+j;
+ if ((tex2[(height-i-1)*width+j]) != (byte)0)
+ {
+ tex[p*3] = (byte)0;
+ tex[(p*3)+1] = (byte)255;
+ tex[(p*3)+2] = (byte)0;
+ }
+ else
+ {
+ tex[p*3] = (byte)0;
+ tex[(p*3)+1] = (byte)0;
+ tex[(p*3)+2] = (byte)255;
+ }
+ }
+ }
+ gl.glTexImage2D
+ (GL_TEXTURE_2D,
+ 0,
+ 3,
+ width,
+ height,
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ tex);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
+ gl.glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
+ /* end texture object */
+
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glFrustum(-2.0, 2.0, -2.0, 2.0, 6.0, 20.0);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glTranslatef(0.0f, 0.0f, -8.0f);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ Angle += 0.2f;
+
+ gl.glDepthFunc(GL_EQUAL);
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+
+ gl.glColor3f(1.0f, 1.0f, 1.0f);
+
+ /* draw first polygon */
+ gl.glPushMatrix();
+ gl.glTranslatef(-1.0f, 0.0f, 0.0f);
+ gl.glRotatef(Angle, 0.0f, 0.0f, 1.0f);
+ gl.glBindTexture(GL_TEXTURE_2D, TexObj[0]);
+ gl.glBegin(GL_POLYGON);
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex2f(-1.0f, -1.0f);
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex2f( 1.0f, -1.0f);
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex2f( 1.0f, 1.0f);
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex2f(-1.0f, 1.0f);
+ gl.glEnd();
+ gl.glPopMatrix();
+
+ /* draw second polygon */
+ gl.glPushMatrix();
+ gl.glTranslatef(1.0f, 0.0f, 0.0f);
+ gl.glRotatef(Angle-90.0f, 0.0f, 1.0f, 0.0f);
+ gl.glBindTexture(GL_TEXTURE_2D, TexObj[1]);
+ gl.glBegin(GL_POLYGON);
+ gl.glTexCoord2f(0.0f, 0.0f); gl.glVertex2f(-1.0f, -1.0f);
+ gl.glTexCoord2f(1.0f, 0.0f); gl.glVertex2f( 1.0f, -1.0f);
+ gl.glTexCoord2f(1.0f, 1.0f); gl.glVertex2f( 1.0f, 1.0f);
+ gl.glTexCoord2f(0.0f, 1.0f); gl.glVertex2f(-1.0f, 1.0f);
+ gl.glEnd();
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ //if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+ }
+}
diff --git a/demos/RonsDemos/texobj_plugin13.html b/demos/RonsDemos/texobj_plugin13.html
new file mode 100644
index 0000000..30f3829
--- /dev/null
+++ b/demos/RonsDemos/texobj_plugin13.html
@@ -0,0 +1,49 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Texobj by Brian Paul; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Texobj applet
+<br>Originially written by Brian Paul
+<br>Ported to Java by Ron Cemer
+<br>
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "texobj.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "texobj.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "texobj.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "texobj.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/text3d.html b/demos/RonsDemos/text3d.html
new file mode 100644
index 0000000..40d67ac
--- /dev/null
+++ b/demos/RonsDemos/text3d.html
@@ -0,0 +1,17 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Text3d by Robert J. Doyle, Jr.; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Text3d applet
+<br>Originially written by Robert J. Doyle, Jr.
+<br>Ported to Java by Ron Cemer
+<br>
+<applet code="text3d.class" width=400 height=400>
+</applet>
+<hr>
+</body>
+</html>
diff --git a/demos/RonsDemos/text3d.java b/demos/RonsDemos/text3d.java
new file mode 100644
index 0000000..ed40bee
--- /dev/null
+++ b/demos/RonsDemos/text3d.java
@@ -0,0 +1,682 @@
+/**
+ * @(#) text3d.java
+ * @(#) author: Robert J. Doyle, Jr. (converted to Java by Ron Cemer)
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class text3d extends SimpleGLAnimApplet1
+{
+ private static final float letterM[][] =
+ {
+ {-3.125000f, 0.000000f, 0.000000f},
+ {-3.125000f, 6.208000f, 0.000000f},
+ {-1.233000f, 6.208000f, 0.000000f},
+ {0.003000f, 1.484000f, 0.000000f},
+ {1.223000f, 6.208000f, 0.000000f},
+ {3.123000f, 6.208000f, 0.000000f},
+ {3.123000f, 0.000000f, 0.000000f},
+ {1.923000f, 0.000000f, 0.000000f},
+ {1.923000f, 5.010000f, 0.000000f},
+ {0.659000f, 0.000000f, 0.000000f},
+ {-0.649000f, 0.000000f, 0.000000f},
+ {-1.925000f, 5.010000f, 0.000000f},
+ {-1.925000f, 0.000000f, 0.000000f}
+ };
+ private static final int letterMtris[][] =
+ {
+ { 1, 0, 12 },
+ { 1, 12, 11 },
+ { 1, 11, 2 },
+ { 2, 11, 3 },
+ { 11, 10, 3 },
+ { 3, 10, 9 },
+ { 3, 9, 8 },
+ { 3, 8, 4 },
+ { 4, 8, 5 },
+ { 5, 8, 7 },
+ { 5, 7, 6 },
+ };
+ private static final float letterO[][] =
+ {
+ {-3.038000f, 3.102000f, 0.0f},
+ {-2.974000f, 3.874000f, 0.0f},
+ {-2.827000f, 4.440000f, 0.0f},
+ {-2.802000f, 4.508000f, 0.0f},
+ {-2.544000f, 5.042000f, 0.0f},
+ {-2.502000f, 5.110000f, 0.0f},
+ {-2.223000f, 5.479000f, 0.0f},
+ {-2.132000f, 5.576000f, 0.0f},
+ {-1.784000f, 5.869000f, 0.0f},
+ {-1.678000f, 5.940000f, 0.0f},
+ {-1.260000f, 6.155000f, 0.0f},
+ {-1.148000f, 6.198000f, 0.0f},
+ {-0.677000f, 6.321000f, 0.0f},
+ {-0.638000f, 6.328000f, 0.0f},
+ {-0.002000f, 6.378000f, 0.0f},
+ {0.634000f, 6.328000f, 0.0f},
+ {1.107000f, 6.210000f, 0.0f},
+ {1.144000f, 6.198000f, 0.0f},
+ {1.570000f, 6.002000f, 0.0f},
+ {1.674000f, 5.940000f, 0.0f},
+ {2.038000f, 5.661000f, 0.0f},
+ {2.128000f, 5.576000f, 0.0f},
+ {2.428000f, 5.217000f, 0.0f},
+ {2.504000f, 5.104000f, 0.0f},
+ {2.762000f, 4.598000f, 0.0f},
+ {2.798000f, 4.508000f, 0.0f},
+ {2.960000f, 3.913000f, 0.0f},
+ {2.970000f, 3.862000f, 0.0f},
+ {3.034000f, 3.102000f, 0.0f},
+ {2.970000f, 2.342000f, 0.0f},
+ {2.815000f, 1.745000f, 0.0f},
+ {2.798000f, 1.696000f, 0.0f},
+ {2.554000f, 1.182000f, 0.0f},
+ {2.504000f, 1.100000f, 0.0f},
+ {2.221000f, 0.726000f, 0.0f},
+ {2.128000f, 0.628000f, 0.0f},
+ {1.776000f, 0.332000f, 0.0f},
+ {1.674000f, 0.264000f, 0.0f},
+ {1.256000f, 0.049000f, 0.0f},
+ {1.144000f, 0.006000f, 0.0f},
+ {0.672000f, -0.117000f, 0.0f},
+ {0.634000f, -0.124000f, 0.0f},
+ {-0.002000f, -0.174000f, 0.0f},
+ {-0.638000f, -0.124000f, 0.0f},
+ {-1.112000f, -0.006000f, 0.0f},
+ {-1.148000f, 0.006000f, 0.0f},
+ {-1.576000f, 0.202000f, 0.0f},
+ {-1.678000f, 0.264000f, 0.0f},
+ {-2.041000f, 0.540000f, 0.0f},
+ {-2.132000f, 0.628000f, 0.0f},
+ {-2.430000f, 0.983000f, 0.0f},
+ {-2.502000f, 1.094000f, 0.0f},
+ {-2.773000f, 1.622000f, 0.0f},
+ {-2.802000f, 1.696000f, 0.0f},
+ {-2.962000f, 2.258000f, 0.0f},
+ {-2.974000f, 2.330000f, 0.0f},
+ {-1.736000f, 3.102000f, 1.0f}, // Begin new strip
+ {-1.710000f, 3.578000f, 0.0f},
+ {-1.644000f, 3.934000f, 0.0f},
+ {-1.503000f, 4.328000f, 0.0f},
+ {-1.494000f, 4.346000f, 0.0f},
+ {-1.352000f, 4.593000f, 0.0f},
+ {-1.306000f, 4.656000f, 0.0f},
+ {-1.120000f, 4.857000f, 0.0f},
+ {-1.040000f, 4.926000f, 0.0f},
+ {-0.825000f, 5.067000f, 0.0f},
+ {-0.726000f, 5.116000f, 0.0f},
+ {-0.480000f, 5.200000f, 0.0f},
+ {-0.402000f, 5.218000f, 0.0f},
+ {-0.041000f, 5.257000f, 0.0f},
+ {-0.002000f, 5.258000f, 0.0f},
+ {0.361000f, 5.227000f, 0.0f},
+ {0.400000f, 5.220000f, 0.0f},
+ {0.650000f, 5.147000f, 0.0f},
+ {0.726000f, 5.116000f, 0.0f},
+ {0.950000f, 4.990000f, 0.0f},
+ {1.038000f, 4.926000f, 0.0f},
+ {1.239000f, 4.736000f, 0.0f},
+ {1.306000f, 4.656000f, 0.0f},
+ {1.462000f, 4.413000f, 0.0f},
+ {1.498000f, 4.342000f, 0.0f},
+ {1.635000f, 3.964000f, 0.0f},
+ {1.644000f, 3.934000f, 0.0f},
+ {1.710000f, 3.568000f, 0.0f},
+ {1.736000f, 3.102000f, 0.0f},
+ {1.710000f, 2.636000f, 0.0f},
+ {1.642000f, 2.268000f, 0.0f},
+ {1.508000f, 1.886000f, 0.0f},
+ {1.496000f, 1.860000f, 0.0f},
+ {1.351000f, 1.610000f, 0.0f},
+ {1.304000f, 1.546000f, 0.0f},
+ {1.115000f, 1.343000f, 0.0f},
+ {1.036000f, 1.276000f, 0.0f},
+ {0.823000f, 1.135000f, 0.0f},
+ {0.724000f, 1.086000f, 0.0f},
+ {0.480000f, 1.001000f, 0.0f},
+ {0.400000f, 0.984000f, 0.0f},
+ {0.035000f, 0.946000f, 0.0f},
+ {-0.002000f, 0.946000f, 0.0f},
+ {-0.368000f, 0.979000f, 0.0f},
+ {-0.402000f, 0.986000f, 0.0f},
+ {-0.653000f, 1.057000f, 0.0f},
+ {-0.726000f, 1.088000f, 0.0f},
+ {-0.952000f, 1.213000f, 0.0f},
+ {-1.040000f, 1.278000f, 0.0f},
+ {-1.240000f, 1.467000f, 0.0f},
+ {-1.306000f, 1.548000f, 0.0f},
+ {-1.460000f, 1.788000f, 0.0f},
+ {-1.494000f, 1.858000f, 0.0f},
+ {-1.639000f, 2.251000f, 0.0f},
+ {-1.644000f, 2.270000f, 0.0f},
+ {-1.710000f, 2.626000f, 0.0f}
+ };
+ private static final int letterOtris[][] =
+ {
+ { 0, 56, 1 },
+ { 1, 56, 57 },
+ { 1, 57, 2 },
+ { 2, 57, 58 },
+ { 2, 58, 3 },
+ { 3, 58, 59 },
+ { 3, 59, 4 },
+ { 4, 59, 60 },
+ { 4, 60, 5 },
+ { 5, 60, 61 },
+ { 5, 61, 6 },
+ { 6, 61, 62 },
+ { 6, 62, 7 },
+ { 7, 62, 63 },
+ { 7, 63, 8 },
+ { 8, 63, 64 },
+ { 8, 64, 9 },
+ { 9, 64, 65 },
+ { 9, 65, 10 },
+ { 10, 65, 66 },
+ { 10, 66, 11 },
+ { 11, 66, 67 },
+ { 11, 67, 12 },
+ { 12, 67, 68 },
+ { 12, 68, 13 },
+ { 13, 68, 69 },
+ { 13, 69, 14 },
+ { 14, 69, 70 },
+ { 14, 70, 15 },
+ { 15, 70, 71 },
+ { 15, 71, 16 },
+ { 16, 71, 72 },
+ { 16, 72, 17 },
+ { 17, 72, 73 },
+ { 17, 73, 18 },
+ { 18, 73, 74 },
+ { 18, 74, 19 },
+ { 19, 74, 75 },
+ { 19, 75, 20 },
+ { 20, 75, 76 },
+ { 20, 76, 21 },
+ { 21, 76, 77 },
+ { 21, 77, 22 },
+ { 22, 77, 78 },
+ { 22, 78, 23 },
+ { 23, 78, 79 },
+ { 23, 79, 24 },
+ { 24, 79, 80 },
+ { 24, 80, 25 },
+ { 25, 80, 81 },
+ { 25, 81, 26 },
+ { 26, 81, 82 },
+ { 26, 82, 27 },
+ { 27, 82, 83 },
+ { 27, 83, 28 },
+ { 28, 83, 84 },
+ { 28, 84, 29 },
+ { 29, 84, 85 },
+ { 29, 85, 30 },
+ { 30, 85, 86 },
+ { 30, 86, 31 },
+ { 31, 86, 87 },
+ { 31, 87, 32 },
+ { 32, 87, 88 },
+ { 32, 88, 33 },
+ { 33, 88, 89 },
+ { 33, 89, 34 },
+ { 34, 89, 90 },
+ { 34, 90, 35 },
+ { 35, 90, 91 },
+ { 35, 91, 36 },
+ { 36, 91, 92 },
+ { 36, 92, 37 },
+ { 37, 92, 93 },
+ { 37, 93, 38 },
+ { 38, 93, 94 },
+ { 38, 94, 39 },
+ { 39, 94, 95 },
+ { 39, 95, 40 },
+ { 40, 95, 96 },
+ { 40, 96, 41 },
+ { 41, 96, 97 },
+ { 41, 97, 42 },
+ { 42, 97, 98 },
+ { 42, 98, 43 },
+ { 43, 98, 99 },
+ { 43, 99, 44 },
+ { 44, 99, 100 },
+ { 44, 100, 45 },
+ { 45, 100, 101 },
+ { 45, 101, 46 },
+ { 46, 101, 102 },
+ { 46, 102, 47 },
+ { 47, 102, 103 },
+ { 47, 103, 48 },
+ { 48, 103, 104 },
+ { 48, 104, 49 },
+ { 49, 104, 105 },
+ { 49, 105, 50 },
+ { 50, 105, 106 },
+ { 50, 106, 51 },
+ { 51, 106, 107 },
+ { 51, 107, 52 },
+ { 52, 107, 108 },
+ { 52, 108, 53 },
+ { 53, 108, 109 },
+ { 53, 109, 54 },
+ { 54, 109, 110 },
+ { 54, 110, 55 },
+ { 55, 110, 111 },
+ { 55, 111, 0 },
+ { 0, 111, 56 },
+ };
+ private static final float letterT[][] =
+ {
+ {-0.640000f, 0.000000f, 0.0f},
+ {-0.640000f, 5.104000f, 0.0f},
+ {-2.476000f, 5.104000f, 0.0f},
+ {-2.476000f, 6.208000f, 0.0f},
+ {2.476000f, 6.208000f, 0.0f},
+ {2.476000f, 5.104000f, 0.0f},
+ {0.640000f, 5.104000f, 0.0f},
+ {0.640000f, 0.000000f, 0.0f}
+ };
+ private static final int letterTtris[][] =
+ {
+ { 1, 0, 7 },
+ { 1, 7, 6 },
+ { 3, 2, 1 },
+ { 3, 1, 6 },
+ { 3, 6, 4 },
+ { 4, 6, 5 },
+ };
+ private static final float letterH[][] =
+ {
+ {-2.570000f, 0.000000f, 0.0f},
+ {-2.570000f, 6.208000f, 0.0f},
+ {-1.282000f, 6.208000f, 0.0f},
+ {-1.282000f, 3.900000f, 0.0f},
+ {1.280000f, 3.900000f, 0.0f},
+ {1.280000f, 6.208000f, 0.0f},
+ {2.568000f, 6.208000f, 0.0f},
+ {2.568000f, 0.000000f, 0.0f},
+ {1.280000f, 0.000000f, 0.0f},
+ {1.280000f, 2.760000f, 0.0f},
+ {-1.282000f, 2.760000f, 0.0f},
+ {-1.282000f, 0.000000f, 0.0f}
+ };
+ private static final int letterHtris[][] =
+ {
+ { 1, 0, 11 },
+ { 1, 11, 10 },
+ { 1, 10, 3 },
+ { 1, 3, 2 },
+ { 3, 10, 9 },
+ { 3, 9, 4 },
+ { 6, 5, 4 },
+ { 6, 4, 9 },
+ { 6, 9, 8 },
+ { 6, 8, 7 },
+ };
+
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new text3dCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class text3dCanvas extends GLAnimCanvas
+ {
+ private final int
+ M_SIDE = 1, M_EDGE = 2, M_WHOLE = 3,
+ O_SIDE = 4, O_EDGE = 5, O_WHOLE = 6,
+ T_SIDE = 7, T_EDGE = 8, T_WHOLE = 9,
+ H_SIDE = 10, H_EDGE = 11, H_WHOLE = 12,
+ REPEAT_SIDE = 13, REPEAT_EDGE = 14, REPEAT1 = 15,
+ REPEAT2_SIDE = 16, REPEAT2_EDGE = 17, REPEAT2 = 18,
+ REPEAT3_SIDE = 19, REPEAT3_EDGE = 20, REPEAT3 = 21,
+ REPEAT4_SIDE = 22, REPEAT4_EDGE = 23, REPEAT4 = 24;
+ private float sideColor[] = {0.0f, 0.0f, 0.5f, 1.0f};
+ private float edgeColor[] = {0.7f, 0.7f, 0.0f, 1.0f};
+ private float shininess[] = {128.0f};
+ private float mat_specular[] = {0.7f, 0.7f, 0.7f, 1.0f};
+ private float width = 0.0f, width2 = 2.0f;
+
+ public text3dCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ accumSize = 8;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ int count1 = letterM.length;
+ int count2 = letterO.length;
+ int count3 = letterT.length;
+ int count4 = letterH.length;
+
+ int i;
+
+ float light_ambient[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ float light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+ /* light_position is NOT default value */
+ float light_position[] = { -1.0f, -1.0f, 1.0f, 0.0f };
+
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, light_position);
+
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glDepthFunc(GL_LESS);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ gl.glDrawBuffer(GL_FRONT_AND_BACK);
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+ gl.glClear(GL_ACCUM_BUFFER_BIT);
+ gl.glDrawBuffer(GL_BACK);
+
+ /* Zero position of text */
+
+ for(i = 0; i < count1; i++)
+ letterM[i][1] -= 3.175f;
+ for(i = 0; i < count2; i++)
+ letterO[i][1] -= 3.175f;
+ for(i = 0; i < count3; i++)
+ letterT[i][1] -= 3.175f;
+ for(i = 0; i < count4; i++)
+ letterH[i][1] -= 3.175f;
+
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glFrustum(-7.0f, 7.0f, -7.0f, 7.0f, 6.0f, 20.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ int i, j;
+ float xPos = -0.34f;
+ gl.glLoadIdentity();
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ gl.glTranslatef(0.0f, 0.0f, -10.0f);
+
+ extrudeSolidFromPolygon
+ (letterM, letterMtris, width2, REPEAT_SIDE, REPEAT_EDGE, REPEAT1);
+ extrudeSolidFromPolygon
+ (letterO, letterOtris, width2, REPEAT2_SIDE, REPEAT2_EDGE, REPEAT2);
+ extrudeSolidFromPolygon
+ (letterT, letterTtris, width2, REPEAT3_SIDE, REPEAT3_EDGE, REPEAT3);
+ extrudeSolidFromPolygon
+ (letterH, letterHtris, width2, REPEAT4_SIDE, REPEAT4_EDGE, REPEAT4);
+
+ for (j = 1; j < 5; j++)
+ {
+ width = 0.0f;
+ glj.gljCheckGL();
+ for (i = 0; i < 10; i++)
+ {
+ gl.glPushMatrix();
+ repeat(j);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
+ switch (j)
+ {
+ case 1:
+ extrudeSolidFromPolygon
+ (letterM, letterMtris, width, M_SIDE, M_EDGE, M_WHOLE);
+ gl.glCallList(M_WHOLE);
+ break;
+ case 2:
+ extrudeSolidFromPolygon
+ (letterO, letterOtris, width, O_SIDE, O_EDGE, O_WHOLE);
+ gl.glCallList(O_WHOLE);
+ break;
+ case 3:
+ extrudeSolidFromPolygon
+ (letterT, letterTtris, width, T_SIDE, T_EDGE, T_WHOLE);
+ gl.glCallList(T_WHOLE);
+ break;
+ case 4:
+ extrudeSolidFromPolygon
+ (letterH, letterHtris, width, H_SIDE, H_EDGE, H_WHOLE);
+ gl.glCallList(H_WHOLE);
+ break;
+ }
+ glj.gljSwap();
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ width += 0.2f;
+ gl.glPopMatrix();
+ }
+ for (i = 0; i < 45 ; i++)
+ {
+ gl.glPushMatrix();
+ repeat(j);
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glRotatef(90.0f - (2.0f * i), 0.0f, 1.0f, 0.0f);
+ switch (j)
+ {
+ case 1:
+ gl.glCallList(M_WHOLE);
+ break;
+ case 2:
+ gl.glCallList(O_WHOLE);
+ break;
+ case 3:
+ gl.glCallList(T_WHOLE);
+ break;
+ case 4:
+ gl.glCallList(H_WHOLE);
+ break;
+ }
+ glj.gljSwap();
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gl.glPopMatrix();
+ }
+ for (i = 1; i < 32 ; i++)
+ {
+ gl.glPushMatrix();
+ repeat(j);
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(i * xPos, i * 0.3f, i * -0.3f);
+ switch (j)
+ {
+ case 1:
+ gl.glCallList(M_WHOLE);
+ break;
+ case 2:
+ gl.glCallList(O_WHOLE);
+ break;
+ case 3:
+ gl.glCallList(T_WHOLE);
+ break;
+ case 4:
+ gl.glCallList(H_WHOLE);
+ break;
+ }
+ glj.gljSwap();
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gl.glPopMatrix();
+ }
+ if (j == 1)
+ xPos += 0.25f;
+ else
+ xPos += 0.21f;
+ }
+ gl.glFlush();
+
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ //if (!isSuspended()) repaint(); // Animate at full speed.
+ }
+
+ /* Mark Kilgard's tessellation code from the "dino" demos.
+ Bug fixes and re-write without GLU tesselator
+ by Ronald B. Cemer */
+ private void extrudeSolidFromPolygon
+ (float data[][],
+ int outlineTriIndices[][],
+ float thickness,
+ int side,
+ int edge,
+ int whole)
+ {
+ double dx, dy, len;
+ int i, j0, j1, j2;
+ int min, max, range;
+ float x0, y0, x1, y1;
+ int count = data.length;
+ int tricount = outlineTriIndices.length;
+
+ gl.glNewList(side, GL_COMPILE);
+ gl.glShadeModel(GL_SMOOTH);
+ gl.glBegin(GL_TRIANGLES);
+ for (i = 0; i < tricount; i++)
+ {
+ j0 = outlineTriIndices[i][0];
+ j1 = outlineTriIndices[i][1];
+ j2 = outlineTriIndices[i][2];
+ gl.glVertex3f(data[j0][0],data[j0][1],0.0f);
+ gl.glVertex3f(data[j1][0],data[j1][1],0.0f);
+ gl.glVertex3f(data[j2][0],data[j2][1],0.0f);
+ }
+ gl.glEnd();
+ gl.glEndList();
+
+ gl.glNewList(edge, GL_COMPILE);
+ for (min = max = 0; min < count; min = max)
+ {
+ for (max = min+1; max < count; max++)
+ if (data[max][2] != 0.0f) break;
+ range = max-min;
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = min; i <= max; i++)
+ {
+ j0 = i;
+ j1 = i+1;
+ if (j0 >= max) j0 -= range;
+ if (j1 >= max) j1 -= range;
+ x0 = data[j0][0];
+ y0 = data[j0][1];
+ x1 = data[j1][0];
+ y1 = data[j1][1];
+ gl.glVertex3f(x0, y0, 0.0f);
+ gl.glVertex3f(x0, y0, thickness);
+ // Normals
+ dx = y1 - y0;
+ dy = x0 - x1;
+ len = Math.sqrt(dx * dx + dy * dy);
+ gl.glNormal3f((float)(dx / len), (float)(dy / len), 0.0f);
+ }
+ gl.glEnd();
+ }
+ gl.glEndList();
+
+ gl.glNewList(whole, GL_COMPILE);
+ gl.glFrontFace(GL_CW);
+
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, edgeColor);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, shininess);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ gl.glCallList(edge);
+
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, sideColor);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, shininess);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ gl.glNormal3f(0.0f, 0.0f, -1.0f);
+ gl.glCallList(side);
+ gl.glPushMatrix();
+ gl.glTranslatef(0.0f, 0.0f, thickness);
+ gl.glFrontFace(GL_CCW);
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+ gl.glCallList(side);
+ gl.glPopMatrix();
+
+ gl.glEndList();
+ }
+
+ private void repeat(int j)
+ {
+ if (j == 2)
+ {
+ gl.glPushMatrix();
+ gl.glTranslatef((31.0f * -0.34f) , 9.3f, -9.6f);
+ gl.glCallList(REPEAT1);
+ gl.glPopMatrix();
+ }
+ if (j == 3)
+ {
+ gl.glPushMatrix();
+ gl.glTranslatef(31.0f * -0.34f, 9.3f, -9.6f);
+ gl.glCallList(REPEAT1);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glTranslatef(31.0f * -0.09f, 9.3f, -9.6f);
+ gl.glCallList(REPEAT2);
+ gl.glPopMatrix();
+ }
+ if (j == 4)
+ {
+ gl.glPushMatrix();
+ gl.glTranslatef(31.0f * -0.34f, 9.3f, -9.6f);
+ gl.glCallList(REPEAT1);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glTranslatef(31.0f * -0.09f, 9.3f, -9.6f);
+ gl.glCallList(REPEAT2);
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glTranslatef(31.0f * 0.12f, 9.3f, -9.6f);
+ gl.glCallList(REPEAT3);
+ gl.glPopMatrix();
+ }
+ }
+ }
+}
diff --git a/demos/RonsDemos/text3d_plugin13.html b/demos/RonsDemos/text3d_plugin13.html
new file mode 100644
index 0000000..79c5976
--- /dev/null
+++ b/demos/RonsDemos/text3d_plugin13.html
@@ -0,0 +1,48 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Text3d by Robert J. Doyle, Jr.; ported to Java by Ron Cemer</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+Text3d applet
+<br>Originially written by Robert J. Doyle, Jr.
+<br>Ported to Java by Ron Cemer
+<br>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.3 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 400 codebase="http://java.sun.com/products/plugin/1.3/jinstall-13-win32.cab#Version=1,3,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.3" CODE = "text3d.class" WIDTH = 400 HEIGHT = 400 scriptable=false pluginspage="http://java.sun.com/products/plugin/1.3/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "text3d.class" WIDTH = 400 HEIGHT = 400></XMP>
+<PARAM NAME = CODE VALUE = "text3d.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.3">
+<PARAM NAME="scriptable" VALUE="false">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "text3d.class" WIDTH = 400 HEIGHT = 400>
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</body>
+</html>
diff --git a/demos/SwingDemos/CrossColorJPanel.java b/demos/SwingDemos/CrossColorJPanel.java
new file mode 100644
index 0000000..44a6492
--- /dev/null
+++ b/demos/SwingDemos/CrossColorJPanel.java
@@ -0,0 +1,55 @@
+import java.awt.*;
+import javax.swing.*;
+import gl4java.*;
+import gl4java.swing.*;
+
+public class CrossColorJPanel extends GLJPanel
+{
+ public CrossColorJPanel( )
+ {
+ super();
+ }
+
+
+ public void init() {
+ reshape(getSize().width, getSize().height);
+ }
+
+ public void display()
+ {
+ System.out.println("i");
+ int i;
+
+ gl.glPushMatrix();
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+
+ gl.glBegin(GLEnum.GL_LINES);
+ gl.glColor4f(0f, 0f, 1f, 1f);
+ gl.glVertex3i( 0, 0, 0);
+ gl.glVertex3i( 10, 10, 0);
+
+ gl.glColor4f(0f, 1f, 0f, 1f);
+ gl.glVertex3i( 0, 10, 0);
+ gl.glVertex3i( 10, 0, 0);
+
+ gl.glColor4f(1f, 0f, 0f, 1f);
+ gl.glVertex3i( 0, 5, 0);
+ gl.glVertex3i( 10, 5, 0);
+
+ gl.glColor4f(1f, 1f, 1f, 1f);
+ gl.glVertex3i( 5, 0, 0);
+ gl.glVertex3i( 5, 10, 0);
+ gl.glEnd();
+
+ gl.glPopMatrix();
+ }
+
+ public void reshape( int width, int height )
+ {
+ gl.glViewport(0, 0, width, height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glOrtho(0, 10, 0, 10, -50.0,50.0);
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+}
diff --git a/demos/SwingDemos/DrawColoredPrimitivesJPanel.java b/demos/SwingDemos/DrawColoredPrimitivesJPanel.java
new file mode 100644
index 0000000..66fc849
--- /dev/null
+++ b/demos/SwingDemos/DrawColoredPrimitivesJPanel.java
@@ -0,0 +1,79 @@
+/**
+ * @(#) DrawColoredPrimitives.java
+ * @(#) author: Joe Zimmerman (converted to Java by Sven Goethel)
+ */
+
+/* This program is free software under the license of LGPL */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.swing.*;
+
+public class DrawColoredPrimitivesJPanel extends GLAnimJPanel
+{
+ float rotate;
+
+ float LightAmbient[] = { 0.75f, 0.75f, 0.75f, 1.5f};
+ float LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 0.9f};
+ float LightSpecular[] = { 0.8f, 0.8f, 0.8f, 1.0f};
+
+ public DrawColoredPrimitivesJPanel()
+ {
+ super(false);
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ reshape(getSize().width, getSize().height);
+
+ gl.glEnable(GL_LIGHT0);
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, LightSpecular);
+
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective(45, (float)width/(float)height, 1, 700);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glViewport(0,0,width,height);
+ }
+
+ public void display()
+ {
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+
+ gl.glColor4f(1, 1, 1, 1);
+
+ rotate++;
+
+ gl.glTranslatef(0, 0, -5);
+ gl.glRotatef(rotate, 0, 1, 0);
+ gl.glBegin(GL_POLYGON);
+ gl.glNormal3f( 1, 0, 0);
+ gl.glColor4f(1, 0, 0, 1); gl.glVertex3f( 0, 1, 0);
+ gl.glColor4f(0, 1, 0, 1); gl.glVertex3f(-1, -1, 0);
+ gl.glColor4f(0, 0, 1, 1); gl.glVertex3f( 1, -1, 0);
+ gl.glEnd();
+ }
+}
diff --git a/demos/SwingDemos/GLSwingDemoApplet.java b/demos/SwingDemos/GLSwingDemoApplet.java
new file mode 100755
index 0000000..33b0d95
--- /dev/null
+++ b/demos/SwingDemos/GLSwingDemoApplet.java
@@ -0,0 +1,168 @@
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.Dimension;
+import javax.swing.*;
+import gl4java.*;
+import gl4java.swing.*;
+import gl4java.utils.glut.*;
+import gl4java.utils.glut.fonts.*;
+
+public class GLSwingDemoApplet extends SimpleGLJApplet1
+ implements GLEnum, GLUEnum, ActionListener, ItemListener
+{
+ String[] dataSize = {"offscreen-size: component",
+ "offscreen-size: 10x10",
+ "offscreen-size: 50x50",
+ "offscreen-size: 100x100",
+ "offscreen-size: 500x500",
+ "offscreen-size: 1000x1000"};
+
+ Dimension[] dimSize = { null,
+ new Dimension(10,10),
+ new Dimension(50,50),
+ new Dimension(100,100),
+ new Dimension(500,500),
+ new Dimension(1000,1000)};
+
+
+ String[] data = {"CrossColorJPanel",
+ "GearsJPanel",
+ "DrawColoredPrimitivesJPanel",
+ "TessJPanel"};
+
+ JPanel masterPanel = null;
+ JComboBox glChoice = null;
+ JComboBox glOffScrnSize = null;
+ boolean isAnApplet = true;
+
+ public void init()
+ {
+ super.init();
+ if(isAnApplet==false)
+ {
+ GLContext.gljNativeDebug = true;
+ GLContext.gljClassDebug = true;
+ }
+
+ masterPanel = new JPanel (new BorderLayout());
+ getContentPane().add("Center",masterPanel);
+ canvas = new CrossColorJPanel();
+ masterPanel.add("Center", canvas);
+
+ JPanel np = new JPanel();
+ masterPanel.add("North", np);
+ glChoice = new JComboBox(data);
+ glChoice.addItemListener(this);
+ np.add(glChoice);
+ glOffScrnSize = new JComboBox(dataSize);
+ glOffScrnSize.addItemListener(this);
+ np.add(glOffScrnSize);
+
+ JButton b1, b2;
+ masterPanel.add("East", (b1 = new JButton("E")));
+ b1.setActionCommand("east");
+ b1.addActionListener(this);
+ masterPanel.add("West", (b2 = new JButton("W")));
+ b2.setActionCommand("west");
+ b2.addActionListener(this);
+
+ JCheckBox c1;
+ masterPanel.add("South", (c1 = new JCheckBox("SouthButton", true)));
+ c1.addItemListener(this);
+ }
+
+ public static void main(java.lang.String[] args) {
+ try {
+ boolean withAWT=false;
+
+ if(args.length>0 && args[0].equals("withAWT"))
+ withAWT=true;
+ Frame mainFrame = new Frame("test1");
+
+ GLSwingDemoApplet applet=new GLSwingDemoApplet();
+
+ applet.isAnApplet=false;
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+ applet.setSize(480, 480);
+
+ if(withAWT)
+ {
+ gears applet2 = new gears();
+ applet2.setSize(300, 300);
+ applet2.init();
+ applet2.start();
+ mainFrame.add(applet2);
+ applet2.setSize(300, 300);
+ }
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+
+ } catch (Throwable exception) {
+ System.err.println("Exception occurred in main()");
+ exception.printStackTrace(System.out);
+ }
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ if (e.getActionCommand().equals("east")) {
+ System.out.println("East pressed");
+ } else if (e.getActionCommand().equals("west")) {
+ System.out.println("West pressed");
+ }
+ }
+
+ public void itemStateChanged(ItemEvent e) {
+ Object source = e.getItemSelectable();
+ Object item = e.getItem();
+ System.out.println("item changed: "+source);
+
+ if(glChoice!=null &&
+ glChoice.equals(e.getItemSelectable()) &&
+ e.getStateChange()==ItemEvent.SELECTED &&
+ (item instanceof String)==true
+ )
+ {
+ String clazzName = (String)item;
+ try {
+ Object obj =
+ Class.forName(clazzName).newInstance();
+ if(obj instanceof GLJPanel)
+ {
+ if(canvas!=null)
+ {
+ masterPanel.remove(canvas);
+ canvas.cvsDispose();
+ }
+ canvas = (GLJPanel)obj;
+ canvas.setVisible(true);
+ masterPanel.add("Center", canvas);
+ masterPanel.invalidate();
+ masterPanel.validate();
+ masterPanel.repaint();
+ glOffScrnSize.setSelectedIndex(0);
+ }
+ if(obj instanceof GLAnimJPanel)
+ {
+ ((GLAnimJPanel)obj).start();
+ }
+ } catch (Exception ex) {
+ System.out.println("Exception during loading: "+
+ clazzName);
+ System.out.println(ex);
+ }
+ } else
+ if(glOffScrnSize!=null && canvas!=null &&
+ glOffScrnSize.equals(e.getItemSelectable()) &&
+ e.getStateChange()==ItemEvent.SELECTED &&
+ (item instanceof String)==true
+ )
+ {
+ int idx = glOffScrnSize.getSelectedIndex();
+ canvas.setOffScreenSize(dimSize[idx]);
+ }
+ }
+}
diff --git a/demos/SwingDemos/GearsJPanel.java b/demos/SwingDemos/GearsJPanel.java
new file mode 100644
index 0000000..3d03111
--- /dev/null
+++ b/demos/SwingDemos/GearsJPanel.java
@@ -0,0 +1,382 @@
+/**
+ * @(#) GearsJPanel.java
+ * @(#) author: Brian Paul (converted to Java by Ron Cemer & Sven Goethel)
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.swing.*;
+
+public class GearsJPanel extends GLAnimJPanel
+ implements MouseListener, MouseMotionListener
+{
+ private static final float M_PI = 3.14159265359f;
+ private int gear1, gear2, gear3;
+ private float angle = 0.0f;
+
+ private MatrixFuncs mtxfuncs = null;
+ private int prevMouseX, prevMouseY;
+ private boolean mouseRButtonDown = false;
+ private float rot_matrix[] =
+ {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f
+ };
+
+ public GearsJPanel()
+ {
+ super();
+ setAnimateFps(30.0);
+
+ mtxfuncs = new MatrixFuncs();
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ setInitialRotation();
+
+ float pos[] = { 5.0f, 5.0f, 10.0f, 0.0f };
+ float red[] = { 0.8f, 0.1f, 0.0f, 1.0f };
+ float green[] = { 0.0f, 0.8f, 0.2f, 1.0f };
+ float blue[] = { 0.2f, 0.2f, 1.0f, 1.0f };
+
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ gl.glEnable(GL_CULL_FACE);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ /* make the gears */
+ gear1 = gl.glGenLists(1);
+ gl.glNewList(gear1, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
+ gear(1.0f, 4.0f, 1.0f, 20, 0.7f);
+ gl.glEndList();
+
+ gear2 = gl.glGenLists(1);
+ gl.glNewList(gear2, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
+ gear(0.5f, 2.0f, 2.0f, 10, 0.7f);
+ gl.glEndList();
+
+ gear3 = gl.glGenLists(1);
+ gl.glNewList(gear3, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+ gear(1.3f, 2.0f, 0.5f, 10, 0.7f);
+ gl.glEndList();
+
+ gl.glEnable(GL_NORMALIZE);
+
+ glj.gljCheckGL();
+
+ addMouseListener(this);
+ addMouseMotionListener(this);
+ }
+
+ public void doCleanup()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ removeMouseMotionListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ float h = (float)height / (float)width;
+
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glFrustum(-1.0f, 1.0f, -h, h, 5.0f, 60.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glTranslatef(0.0f, 0.0f, -40.0f);
+ }
+
+ public void display()
+ {
+ angle += 0.5f;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ gl.glPushMatrix();
+ gl.glMultMatrixf(rot_matrix);
+
+ gl.glPushMatrix();
+ gl.glTranslatef(-3.0f, -2.0f, 0.0f);
+ gl.glRotatef(angle, 0.0f, 0.0f, 1.0f);
+ gl.glCallList(gear1);
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(3.1f, -2.0f, 0.0f);
+ gl.glRotatef(-2.0f * angle - 9.0f, 0.0f, 0.0f, 1.0f);
+ gl.glCallList(gear2);
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(-3.1f, 4.2f, 0.0f);
+ gl.glRotatef(-2.0f * angle - 25.0f, 0.0f, 0.0f, 1.0f);
+ gl.glCallList(gear3);
+ gl.glPopMatrix();
+
+ gl.glPopMatrix();
+
+ glj.gljCheckGL();
+ }
+
+ private void gear
+ (float inner_radius,
+ float outer_radius,
+ float width,
+ int teeth,
+ float tooth_depth)
+ {
+ int i;
+ float r0, r1, r2;
+ float angle, da;
+ float u, v, len;
+
+ r0 = inner_radius;
+ r1 = outer_radius - tooth_depth / 2.0f;
+ r2 = outer_radius + tooth_depth / 2.0f;
+
+ da = 2.0f * M_PI / teeth / 4.0f;
+
+ gl.glShadeModel(GL_FLAT);
+
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+
+ /* draw front face */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3.0f * da), r1 * (float)Math.sin(angle + 3.0f * da), width * 0.5f);
+ }
+ gl.glEnd();
+
+ /* draw front sides of teeth */
+ gl.glBegin(GL_QUADS);
+ da = 2.0f * M_PI / teeth / 4.0f;
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2.0f * da), r2 * (float)Math.sin(angle + 2.0f * da), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3.0f * da), r1 * (float)Math.sin(angle + 3.0f * da), width * 0.5f);
+ }
+ gl.glEnd();
+
+ gl.glNormal3f(0.0f, 0.0f, -1.0f);
+
+ /* draw back face */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
+ }
+ gl.glEnd();
+
+ /* draw back sides of teeth */
+ gl.glBegin(GL_QUADS);
+ da = 2.0f * M_PI / teeth / 4.0f;
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), -width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), -width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
+ }
+ gl.glEnd();
+
+ /* draw outward faces of teeth */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
+ u = r2 * (float)Math.cos(angle + da) - r1 * (float)Math.cos(angle);
+ v = r2 * (float)Math.sin(angle + da) - r1 * (float)Math.sin(angle);
+ len = (float)Math.sqrt(u * u + v * v);
+ u /= len;
+ v /= len;
+ gl.glNormal3f(v, -u, 0.0f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), -width * 0.5f);
+ gl.glNormal3f((float)Math.cos(angle), (float)Math.sin(angle), 0.0f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), -width * 0.5f);
+ u = r1 * (float)Math.cos(angle + 3 * da) - r2 * (float)Math.cos(angle + 2 * da);
+ v = r1 * (float)Math.sin(angle + 3 * da) - r2 * (float)Math.sin(angle + 2 * da);
+ gl.glNormal3f(v, -u, 0.0f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
+ gl.glNormal3f((float)Math.cos(angle), (float)Math.sin(angle), 0.0f);
+ }
+ gl.glVertex3f(r1 * (float)Math.cos(0), r1 * (float)Math.sin(0), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(0), r1 * (float)Math.sin(0), -width * 0.5f);
+ gl.glEnd();
+
+ gl.glShadeModel(GL_SMOOTH);
+
+ /* draw inside radius cylinder */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glNormal3f(-(float)Math.cos(angle), -(float)Math.sin(angle), 0.0f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
+ }
+ gl.glEnd();
+ }
+
+ // Reset the rotation matrix to the default view.
+ private void setInitialRotation()
+ {
+ float mtxbuf[] = new float[16];
+ float mtxbuf2[] = new float[16];
+
+ mtxfuncs.rotateAroundY(30.0f,mtxbuf);
+ mtxfuncs.rotateAroundX(20.0f,mtxbuf2);
+ mtxfuncs.multiplyMatrices(mtxbuf2,mtxbuf,rot_matrix);
+ fixRotationMatrix();
+ }
+
+ private void fixRotationMatrix()
+ {
+ // Fix any problems with the rotation matrix.
+ rot_matrix[3] =
+ rot_matrix[7] =
+ rot_matrix[11] =
+ rot_matrix[12] =
+ rot_matrix[13] =
+ rot_matrix[14] = 0.0f;
+ rot_matrix[15] = 1.0f;
+ float fac;
+ if ((fac = (float)Math.sqrt
+ ((rot_matrix[0]*rot_matrix[0]) +
+ (rot_matrix[4]*rot_matrix[4]) +
+ (rot_matrix[8]*rot_matrix[8]))) != 1.0f)
+ {
+ if (fac != 0.0f)
+ {
+ fac = 1.0f/fac;
+ rot_matrix[0] *= fac;
+ rot_matrix[4] *= fac;
+ rot_matrix[8] *= fac;
+ }
+ }
+ if ((fac = (float)Math.sqrt
+ ((rot_matrix[1]*rot_matrix[1]) +
+ (rot_matrix[5]*rot_matrix[5]) +
+ (rot_matrix[9]*rot_matrix[9]))) != 1.0f)
+ {
+ if (fac != 0.0f)
+ {
+ fac = 1.0f/fac;
+ rot_matrix[1] *= fac;
+ rot_matrix[5] *= fac;
+ rot_matrix[9] *= fac;
+ }
+ }
+ if ((fac = (float)Math.sqrt
+ ((rot_matrix[2]*rot_matrix[2]) +
+ (rot_matrix[6]*rot_matrix[6]) +
+ (rot_matrix[10]*rot_matrix[10]))) != 1.0f)
+ {
+ if (fac != 0.0f)
+ {
+ fac = 1.0f/fac;
+ rot_matrix[2] *= fac;
+ rot_matrix[6] *= fac;
+ rot_matrix[10] *= fac;
+ }
+ }
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ prevMouseX = evt.getX();
+ prevMouseY = evt.getY();
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ mouseRButtonDown = true;
+ evt.consume();
+ }
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ mouseRButtonDown = false;
+ evt.consume();
+ }
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ }
+
+ // Methods required for the implementation of MouseMotionListener
+ public void mouseDragged( MouseEvent evt )
+ {
+ int x = evt.getX();
+ int y = evt.getY();
+ float thetaX = (float)(x-prevMouseX)*(360.0f/(float)getSize().width);
+ float thetaY = (float)(prevMouseY-y)*(360.0f/(float)getSize().height);
+ float mtxbuf[] = new float[16];
+ float mtxbuf2[] = new float[16];
+
+ prevMouseX = x;
+ prevMouseY = y;
+ if ( (thetaX != 0.0f) || (thetaY != 0.0f) )
+ {
+ mtxfuncs.rotateAroundY(((float)thetaX),mtxbuf);
+ if (mouseRButtonDown)
+ mtxfuncs.rotateAroundZ(thetaY,mtxbuf2);
+ else
+ mtxfuncs.rotateAroundX(-thetaY,mtxbuf2);
+ mtxfuncs.multiplyMatrices(mtxbuf2,mtxbuf,mtxbuf);
+ mtxfuncs.multiplyMatrices(rot_matrix,mtxbuf,rot_matrix);
+ fixRotationMatrix();
+ }
+ evt.consume();
+ }
+
+ public void mouseMoved( MouseEvent evt )
+ {
+ }
+}
diff --git a/demos/SwingDemos/InternalGLFrameDemo1.java b/demos/SwingDemos/InternalGLFrameDemo1.java
new file mode 100644
index 0000000..ea5cada
--- /dev/null
+++ b/demos/SwingDemos/InternalGLFrameDemo1.java
@@ -0,0 +1,248 @@
+import javax.swing.*;
+import javax.swing.event.*;
+
+import java.awt.event.*;
+import java.awt.*;
+
+import gl4java.swing.*;
+import gl4java.*;
+
+public class InternalGLFrameDemo1 extends JFrame {
+ JDesktopPane desktop = null;
+
+ public InternalGLFrameDemo1() {
+ super("InternalGLFrameDemo1");
+
+ //Make the big window be indented 50 pixels from each edge
+ //of the screen.
+ int inset = 50;
+ Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+ setBounds(inset, inset,
+ screenSize.width/2 - inset*2,
+ screenSize.height/2*3-inset*2);
+
+ //Quit this app when the big window closes.
+ addWindowListener(new WindowAdapter() {
+ public void windowClosing(WindowEvent e) {
+ System.exit(0);
+ }
+ });
+
+ //Set up the GUI.
+ desktop = new JDesktopPane(); //a specialized layered pane
+ createFrame(); //Create first window
+ setContentPane(desktop);
+ setJMenuBar(createMenuBar());
+
+ //Make dragging faster:
+ desktop.putClientProperty("JDesktopPane.dragMode", "outline");
+ }
+
+ protected JMenuBar createMenuBar() {
+ JMenuBar menuBar = new JMenuBar();
+
+ JMenu menu = new JMenu("Document");
+ menu.setMnemonic(KeyEvent.VK_D);
+ JMenuItem menuItem = new JMenuItem("New");
+ menuItem.setMnemonic(KeyEvent.VK_N);
+ menuItem.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ createFrame();
+ }
+ });
+ menu.add(menuItem);
+ menuBar.add(menu);
+
+ return menuBar;
+ }
+
+ protected void createFrame() {
+ InternalGLFrame frame = new InternalGLFrame("CrossColorJPanel");
+ frame.setVisible(true); //necessary as of kestrel
+ desktop.add(frame);
+ try {
+ frame.setSelected(true);
+ } catch (java.beans.PropertyVetoException e) {}
+ }
+
+ public static void main(String[] args) {
+ GLContext.gljNativeDebug = true;
+ GLContext.gljClassDebug = true;
+ InternalGLFrameDemo1 frame = new InternalGLFrameDemo1();
+ frame.setVisible(true);
+ }
+
+ static int openFrameCount = 0;
+ static final int xOffset = 30, yOffset = 30;
+ static InternalGLFrame activeIF = null;
+
+ public class InternalGLFrame extends JInternalFrame
+ implements ItemListener, InternalFrameListener
+ {
+ String[] data = {"CrossColorJPanel",
+ "GearsJPanel",
+ "DrawColoredPrimitivesJPanel",
+ "TessJPanel"};
+ String[] dataSize = {"offscreen-size: component",
+ "offscreen-size: 10x10",
+ "offscreen-size: 50x50",
+ "offscreen-size: 100x100",
+ "offscreen-size: 500x500",
+ "offscreen-size: 1000x1000"};
+
+ Dimension[] dimSize = { null,
+ new Dimension(10,10),
+ new Dimension(50,50),
+ new Dimension(100,100),
+ new Dimension(500,500),
+ new Dimension(1000,1000)};
+
+
+ GLJPanel canvas = null;
+ JComboBox glChoice = null;
+ JComboBox glOffScrnSize = null;
+ JComponent master = null;
+
+ public InternalGLFrame(String clazzName)
+ {
+ super("Document #" + (++openFrameCount),
+ true, //resizable
+ true, //closable
+ true, //maximizable
+ true);//iconifiable
+
+ //...Create the GUI and put it in the window...
+ master = (JComponent) getContentPane();
+ master.setLayout(new BorderLayout());
+ switchGLJPanel(clazzName);
+
+ JPanel np = new JPanel();
+ master.add("North", np);
+ glChoice = new JComboBox(data);
+ glChoice.addItemListener(this);
+ np.add(glChoice);
+ glOffScrnSize = new JComboBox(dataSize);
+ glOffScrnSize.addItemListener(this);
+ np.add(glOffScrnSize);
+
+ setJMenuBar(createIFMenuBar());
+
+ //...Then set the window size or call pack...
+ setSize(300,300);
+
+ //Set the window's location.
+ setLocation(xOffset*openFrameCount, yOffset*openFrameCount);
+
+ addInternalFrameListener(this);
+ }
+
+ public void switchGLJPanel(String clazzName)
+ {
+ try {
+ Object obj =
+ Class.forName(clazzName).newInstance();
+ if(obj instanceof GLJPanel)
+ {
+ if(canvas!=null)
+ {
+ master.remove(canvas);
+ canvas.cvsDispose();
+ }
+ canvas = (GLJPanel)obj;
+ canvas.setVisible(true);
+ master.add("Center", canvas);
+ master.invalidate();
+ master.validate();
+ master.repaint();
+ glOffScrnSize.setSelectedIndex(0);
+ }
+ if(obj instanceof GLAnimJPanel)
+ {
+ ((GLAnimJPanel)obj).start();
+ }
+ } catch (Exception ex) {
+ System.out.println("Exception during loading: "+
+ clazzName);
+ System.out.println(ex);
+ }
+
+ }
+
+ protected JMenuBar createIFMenuBar()
+ {
+ JMenuBar menuBar = new JMenuBar();
+
+ JMenu menu = new JMenu("Document");
+ menu.setMnemonic(KeyEvent.VK_D);
+ JMenuItem menuItem = new JMenuItem("New");
+ menuItem.setMnemonic(KeyEvent.VK_N);
+ menuItem.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ createIFFrame();
+ }
+ });
+ menu.add(menuItem);
+ menuBar.add(menu);
+
+ return menuBar;
+ }
+
+ protected void createIFFrame() {
+ if(activeIF==null)
+ return;
+ InternalGLFrame frame = new InternalGLFrame("CrossColorJPanel");
+ frame.setVisible(true); //necessary as of kestrel
+ activeIF.canvas.add(frame);
+ try {
+ activeIF.setSelected(true);
+ } catch (java.beans.PropertyVetoException e) {}
+ }
+
+ public void itemStateChanged(ItemEvent e)
+ {
+ Object source = e.getItemSelectable();
+ Object item = e.getItem();
+ System.out.println("item changed: "+source);
+
+ if(glChoice!=null &&
+ glChoice.equals(e.getItemSelectable()) &&
+ e.getStateChange()==ItemEvent.SELECTED &&
+ (item instanceof String)==true
+ )
+ {
+ switchGLJPanel((String)item);
+ } else
+ if(glOffScrnSize!=null && canvas!=null &&
+ glOffScrnSize.equals(e.getItemSelectable()) &&
+ e.getStateChange()==ItemEvent.SELECTED &&
+ (item instanceof String)==true
+ )
+ {
+ int idx = glOffScrnSize.getSelectedIndex();
+ canvas.setOffScreenSize(dimSize[idx]);
+ }
+ }
+
+ public void internalFrameClosing(InternalFrameEvent e) {
+ }
+
+ public void internalFrameClosed(InternalFrameEvent e) {
+ }
+
+ public void internalFrameOpened(InternalFrameEvent e) {
+ }
+
+ public void internalFrameIconified(InternalFrameEvent e) {
+ }
+
+ public void internalFrameDeiconified(InternalFrameEvent e) {
+ }
+
+ public void internalFrameActivated(InternalFrameEvent e) {
+ activeIF = (InternalGLFrame)e.getSource();
+ }
+
+ public void internalFrameDeactivated(InternalFrameEvent e) {
+ }
+ }
+}
diff --git a/demos/SwingDemos/MatrixFuncs.java b/demos/SwingDemos/MatrixFuncs.java
new file mode 100644
index 0000000..75493a2
--- /dev/null
+++ b/demos/SwingDemos/MatrixFuncs.java
@@ -0,0 +1,200 @@
+/**
+ * @(#) MatrixFuncs.java
+ * @(#) author: Ronald B. Cemer
+ * @(#) version: 1.0
+ */
+
+import java.io.*;
+
+public class MatrixFuncs
+{
+ public static final float M_PI = 3.14159265359f;
+
+ // Given the angle in degs, create a 4x4 matrix
+ // in mtx which rotates around the X axis.
+ public void rotateAroundX(float degs, float mtx[])
+ {
+ float rads, rsin, rcos;
+
+ rads = degs*(M_PI/180.0f);
+ rsin = (float)Math.sin(rads);
+ rcos = (float)Math.cos(rads);
+ mtx[0] = 1.0f;
+ mtx[1] = 0.0f;
+ mtx[2] = 0.0f;
+ mtx[3] = 0.0f;
+ mtx[4] = 0.0f;
+ mtx[5] = rcos;
+ mtx[6] = rsin;
+ mtx[7] = 0.0f;
+ mtx[8] = 0.0f;
+ mtx[9] = -rsin;
+ mtx[10] = rcos;
+ mtx[11] = 0.0f;
+ mtx[12] = 0.0f;
+ mtx[13] = 0.0f;
+ mtx[14] = 0.0f;
+ mtx[15] = 1.0f;
+ }
+
+ // Given the angle in degs, create a 4x4 matrix
+ // in mtx which rotates around the Y axis.
+ public void rotateAroundY(float degs, float mtx[])
+ {
+ float rads, rsin, rcos;
+
+ rads = degs*(M_PI/180.0f);
+ rsin = (float)Math.sin(rads);
+ rcos = (float)Math.cos(rads);
+ mtx[0] = rcos;
+ mtx[1] = 0.0f;
+ mtx[2] = -rsin;
+ mtx[3] = 0.0f;
+ mtx[4] = 0.0f;
+ mtx[5] = 1.0f;
+ mtx[6] = 0.0f;
+ mtx[7] = 0.0f;
+ mtx[8] = rsin;
+ mtx[9] = 0.0f;
+ mtx[10] = rcos;
+ mtx[11] = 0.0f;
+ mtx[12] = 0.0f;
+ mtx[13] = 0.0f;
+ mtx[14] = 0.0f;
+ mtx[15] = 1.0f;
+ }
+
+ // Given the angle in degs, create a 4x4 matrix
+ // in mtx which rotates around the Z axis.
+ public void rotateAroundZ(float degs, float mtx[])
+ {
+ float rads, rsin, rcos;
+
+ rads = degs*(M_PI/180.0f);
+ rsin = (float)Math.sin(rads);
+ rcos = (float)Math.cos(rads);
+ mtx[0] = rcos;
+ mtx[1] = rsin;
+ mtx[2] = 0.0f;
+ mtx[3] = 0.0f;
+ mtx[4] = -rsin;
+ mtx[5] = rcos;
+ mtx[6] = 0.0f;
+ mtx[7] = 0.0f;
+ mtx[8] = 0.0f;
+ mtx[9] = 0.0f;
+ mtx[10] = 1.0f;
+ mtx[11] = 0.0f;
+ mtx[12] = 0.0f;
+ mtx[13] = 0.0f;
+ mtx[14] = 0.0f;
+ mtx[15] = 1.0f;
+ }
+
+ // Given two 4x4 matrices in mtx1 and mtx2, multiply
+ // them and put the result in dest.
+ // This routine uses a temporary buffer for the result,
+ // so if dest is the same as mtx1 or mtx2, it will still
+ // work properly.
+ public void multiplyMatrices(float mtx1[], float mtx2[], float dest[])
+ {
+ float nmtx[] = new float[16];
+
+ nmtx[0] =
+ (mtx1[0]*mtx2[0]) +
+ (mtx1[1]*mtx2[4]) +
+ (mtx1[2]*mtx2[8]) +
+ (mtx1[3]*mtx2[12]);
+ nmtx[1] =
+ (mtx1[0]*mtx2[1]) +
+ (mtx1[1]*mtx2[5]) +
+ (mtx1[2]*mtx2[9]) +
+ (mtx1[3]*mtx2[13]);
+ nmtx[2] =
+ (mtx1[0]*mtx2[2]) +
+ (mtx1[1]*mtx2[6]) +
+ (mtx1[2]*mtx2[10]) +
+ (mtx1[3]*mtx2[14]);
+ nmtx[3] =
+ (mtx1[0]*mtx2[3]) +
+ (mtx1[1]*mtx2[7]) +
+ (mtx1[2]*mtx2[11]) +
+ (mtx1[3]*mtx2[15]);
+ nmtx[4] =
+ (mtx1[4]*mtx2[0]) +
+ (mtx1[5]*mtx2[4]) +
+ (mtx1[6]*mtx2[8]) +
+ (mtx1[7]*mtx2[12]);
+ nmtx[5] =
+ (mtx1[4]*mtx2[1]) +
+ (mtx1[5]*mtx2[5]) +
+ (mtx1[6]*mtx2[9]) +
+ (mtx1[7]*mtx2[13]);
+ nmtx[6] =
+ (mtx1[4]*mtx2[2]) +
+ (mtx1[5]*mtx2[6]) +
+ (mtx1[6]*mtx2[10]) +
+ (mtx1[7]*mtx2[14]);
+ nmtx[7] =
+ (mtx1[4]*mtx2[3]) +
+ (mtx1[5]*mtx2[7]) +
+ (mtx1[6]*mtx2[11]) +
+ (mtx1[7]*mtx2[15]);
+ nmtx[8] =
+ (mtx1[8]*mtx2[0]) +
+ (mtx1[9]*mtx2[4]) +
+ (mtx1[10]*mtx2[8]) +
+ (mtx1[11]*mtx2[12]);
+ nmtx[9] =
+ (mtx1[8]*mtx2[1]) +
+ (mtx1[9]*mtx2[5]) +
+ (mtx1[10]*mtx2[9]) +
+ (mtx1[11]*mtx2[13]);
+ nmtx[10] =
+ (mtx1[8]*mtx2[2]) +
+ (mtx1[9]*mtx2[6]) +
+ (mtx1[10]*mtx2[10]) +
+ (mtx1[11]*mtx2[14]);
+ nmtx[11] =
+ (mtx1[8]*mtx2[3]) +
+ (mtx1[9]*mtx2[7]) +
+ (mtx1[10]*mtx2[11]) +
+ (mtx1[11]*mtx2[15]);
+ nmtx[12] =
+ (mtx1[12]*mtx2[0]) +
+ (mtx1[13]*mtx2[4]) +
+ (mtx1[14]*mtx2[8]) +
+ (mtx1[15]*mtx2[12]);
+ nmtx[13] =
+ (mtx1[12]*mtx2[1]) +
+ (mtx1[13]*mtx2[5]) +
+ (mtx1[14]*mtx2[9]) +
+ (mtx1[15]*mtx2[13]);
+ nmtx[14] =
+ (mtx1[12]*mtx2[2]) +
+ (mtx1[13]*mtx2[6]) +
+ (mtx1[14]*mtx2[10]) +
+ (mtx1[15]*mtx2[14]);
+ nmtx[15] =
+ (mtx1[12]*mtx2[3]) +
+ (mtx1[13]*mtx2[7]) +
+ (mtx1[14]*mtx2[11]) +
+ (mtx1[15]*mtx2[15]);
+ dest[0] = nmtx[0];
+ dest[1] = nmtx[1];
+ dest[2] = nmtx[2];
+ dest[3] = nmtx[3];
+ dest[4] = nmtx[4];
+ dest[5] = nmtx[5];
+ dest[6] = nmtx[6];
+ dest[7] = nmtx[7];
+ dest[8] = nmtx[8];
+ dest[9] = nmtx[9];
+ dest[10] = nmtx[10];
+ dest[11] = nmtx[11];
+ dest[12] = nmtx[12];
+ dest[13] = nmtx[13];
+ dest[14] = nmtx[14];
+ dest[15] = nmtx[15];
+ }
+}
diff --git a/demos/SwingDemos/TessJPanel.java b/demos/SwingDemos/TessJPanel.java
new file mode 100644
index 0000000..f070823
--- /dev/null
+++ b/demos/SwingDemos/TessJPanel.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright (c) 1993-1997, 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 adverti(float)Math.sing
+ * 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.227f.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227f-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(R) is a registered trademark of Silicon Graphics, Inc.
+ */
+
+/*
+ * tess.c
+ * This program demonstrates polygon tessellation.
+ * Two tesselated objects are drawn. The first is a
+ * rectangle with a triangular hole. The second is a
+ * smooth shaded, self-intersecting star.
+ *
+ * Note the exterior rectangle is drawn with its vertices
+ * in counter-clockwise order, but its interior clockwise.
+ * Note the combineCallback is needed for the self-intersecting
+ * star. Also note that removing the TessProperty for the
+ * star will make the interior unshaded (WINDING_ODD).
+ */
+
+import gl4java.utils.glut.*;
+import gl4java.utils.glut.fonts.*;
+
+import gl4java.*;
+import gl4java.awt.*;
+import gl4java.swing.*;
+import java.applet.*;
+import java.awt.*;
+import java.awt.Dimension;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+
+public class TessJPanel extends GLJPanel
+{
+ public static double rect[/*4*/][/*3*/] =
+ {{50.0, 50.0, 0.0},
+ {200.0, 50.0, 0.0},
+ {200.0, 200.0f, 0.0},
+ {50.0, 200.0, 0.0}};
+ public static double tri[/*3*/][/*3*/] =
+ {{75.0, 75.0, 0.0},
+ {125.0, 175.0, 0.0},
+ {175.0, 75.0, 0.0}};
+ public static double star[/*5*/][/*6*/] =
+ {{250.0, 50.0, 0.0, 1.0, 0.0, 1.0},
+ {325.0, 200.0, 0.0, 1.0, 1.0, 0.0},
+ {400.0, 50.0, 0.0, 0.0, 1.0, 1.0},
+ {250.0, 150.0, 0.0, 1.0, 0.0, 0.0},
+ {400.0, 150.0, 0.0, 0.0, 1.0, 0.0}};
+
+ protected GLUTFunc glut = null;
+
+ int startList=-1;
+ boolean exit = false;
+
+ public TessJPanel() {
+ super();
+ }
+
+ public void init() {
+ int i;
+ glut = new GLUTFuncLightImplWithFonts(gl, glu);
+
+ int tobj;
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ startList = gl.glGenLists(2);
+
+ tobj = glu.gluNewTess();
+ glu.gluTessCallback ( tobj, GLU_TESS_VERTEX, gl,
+ "glVertex3dv", "([D)V",
+ 3, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_BEGIN, this,
+ "beginCallback", "(I)V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_END, this,
+ "endCallback", "()V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_ERROR, this,
+ "errorCallback", "(I)V",
+ 0, 0, 0, 0, 0);
+
+ /* rectangle with triangular hole inside */
+ gl.glNewList(startList, GL_COMPILE);
+ gl.glShadeModel(GL_FLAT);
+ glu.gluTessBeginPolygon(tobj, (double[])null);
+ glu.gluTessBeginContour(tobj);
+ glu.gluTessVertex(tobj, rect[0], rect[0]);
+ glu.gluTessVertex(tobj, rect[1], rect[1]);
+ glu.gluTessVertex(tobj, rect[2], rect[2]);
+ glu.gluTessVertex(tobj, rect[3], rect[3]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessBeginContour(tobj);
+ glu.gluTessVertex(tobj, tri[0], tri[0]);
+ glu.gluTessVertex(tobj, tri[1], tri[1]);
+ glu.gluTessVertex(tobj, tri[2], tri[2]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessEndPolygon(tobj);
+ gl.glEndList();
+
+ glu.gluTessCallback ( tobj, GLU_TESS_VERTEX, this,
+ "vertexCallback", "([D)V",
+ 6, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_BEGIN, this,
+ "beginCallback", "(I)V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_END, this,
+ "endCallback", "()V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_ERROR, this,
+ "errorCallback", "(I)V",
+ 0, 0, 0, 0, 0);
+ glu.gluTessCallback ( tobj, GLU_TESS_COMBINE, this,
+ "combineCallback", "([D[D[F[D)V",
+ 3, 4*6, 4, 6, 0);
+
+ /* smooth shaded, self-intersecting star */
+ gl.glNewList(startList + 1, GL_COMPILE);
+ gl.glShadeModel(GL_SMOOTH);
+ glu.gluTessProperty(tobj, GLU_TESS_WINDING_RULE,
+ GLU_TESS_WINDING_POSITIVE);
+ glu.gluTessBeginPolygon(tobj, (double[])null);
+ glu.gluTessBeginContour(tobj);
+ glu.gluTessVertex(tobj, star[0], star[0]);
+ glu.gluTessVertex(tobj, star[1], star[1]);
+ glu.gluTessVertex(tobj, star[2], star[2]);
+ glu.gluTessVertex(tobj, star[3], star[3]);
+ glu.gluTessVertex(tobj, star[4], star[4]);
+ glu.gluTessEndContour(tobj);
+ glu.gluTessEndPolygon(tobj);
+ gl.glEndList();
+
+ glu.gluDeleteTess(tobj);
+
+ reshape(getSize().width, getSize().height);
+
+ glj.gljCheckGL();
+ }
+
+ public void display()
+ {
+ if(exit) return;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+ gl.glColor3f(1.0f, 1.0f, 1.0f);
+ gl.glCallList(startList);
+ gl.glCallList(startList + 1);
+ }
+
+ public void beginCallback(int which)
+ {
+ gl.glBegin(which);
+ }
+
+ public void errorCallback(int errorCode)
+ {
+ String str;
+
+ gl.glColor3f( 0.9f, 0.9f, 0.9f );
+ gl.glRasterPos2i( 5, 5 );
+
+ str = glu.gluErrorString( errorCode );
+
+ glut.glutBitmapString(glut.GLUT_BITMAP_9_BY_15, str);
+ exit = true;
+ }
+
+ public void endCallback()
+ {
+ gl.glEnd();
+ }
+
+ public void vertexCallback(double[/*6*/] vertex)
+ {
+ double[] col = new double[3];
+ System.arraycopy(vertex, 3, col, 0, 3);
+
+ gl.glColor3dv(col);
+ gl.glVertex3dv(vertex);
+ }
+
+ /* combineCallback is used to create a new vertex when edges
+ * intersect. coordinate location is trivial to calculate,
+ * but weight[4] may be used to average color, normal, or texture
+ * coordinate data. In this program, color is weighted.
+ */
+ public void combineCallback(double coords[/*3*/],
+ double vertex_data[/*4x6*/],
+ float weight[/*4*/], double[/*6*/] dataOut )
+ {
+ int i;
+
+ dataOut[0] = coords[0];
+ dataOut[1] = coords[1];
+ dataOut[2] = coords[2];
+ for (i = 3; i < 6; i++)
+ dataOut[i] = weight[0] * vertex_data[0*6+i]
+ + weight[1] * vertex_data[1*6+i]
+ + weight[2] * vertex_data[2*6+i]
+ + weight[3] * vertex_data[3*6+i];
+ }
+
+ public void reshape(int w, int h)
+ {
+ gl.glViewport( 0, 0, w, h );
+
+ gl.glMatrixMode( GL_PROJECTION );
+ gl.glLoadIdentity();
+ glu.gluOrtho2D(0.0f, (double) w, 0.0f, (double) h);
+ }
+}
diff --git a/demos/SwingDemos/gears.java b/demos/SwingDemos/gears.java
new file mode 100755
index 0000000..db7e97a
--- /dev/null
+++ b/demos/SwingDemos/gears.java
@@ -0,0 +1,370 @@
+/**
+ * @(#) gears.java
+ * @(#) author: Brian Paul (converted to Java by Ron Cemer and Sven Goethel)
+ *
+ * This version is equal to Brian Paul's version 1.2 1999/10/21
+ */
+
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import java.util.*;
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import gl4java.applet.SimpleGLAnimApplet1;
+
+public class gears extends SimpleGLAnimApplet1
+{
+
+ /* Initialize the applet */
+
+
+ public void init()
+ {
+ super.init();
+ Dimension d = getSize();
+ canvas = new gearsCanvas(d.width, d.height);
+ add("Center", canvas);
+ }
+
+
+ public static void main( String args[] )
+ {
+ Frame mainFrame = new Frame("gears");
+
+ gears applet = new gears();
+
+ applet.setSize(300, 300);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+
+ /* Local GLAnimCanvas extension class */
+
+
+ private class gearsCanvas extends GLAnimCanvas implements MouseListener, MouseMotionListener
+ {
+ private static final float M_PI = 3.14159265f;
+
+ private long T0 = 0;
+ private long Frames = 0;
+
+ private float view_rotx = 20.0f, view_roty = 30.0f, view_rotz = 0.0f;
+ private int gear1, gear2, gear3;
+ private float angle = 0.0f;
+
+ private int prevMouseX, prevMouseY;
+ private boolean mouseRButtonDown = false;
+
+ public gearsCanvas(int w, int h)
+ {
+ super(w, h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ setAnimateFps(30.0);
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = false;
+ }
+
+ public void init()
+ {
+ System.out.println("init(): " + this);
+ reshape(getSize().width, getSize().height);
+
+ float pos[] = { 5.0f, 5.0f, 10.0f, 0.0f };
+ float red[] = { 0.8f, 0.1f, 0.0f, 1.0f };
+ float green[] = { 0.0f, 0.8f, 0.2f, 1.0f };
+ float blue[] = { 0.2f, 0.2f, 1.0f, 1.0f };
+
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ gl.glEnable(GL_CULL_FACE);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ /* make the gears */
+ gear1 = gl.glGenLists(1);
+ gl.glNewList(gear1, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
+ gear(1.0f, 4.0f, 1.0f, 20, 0.7f);
+ gl.glEndList();
+
+ gear2 = gl.glGenLists(1);
+ gl.glNewList(gear2, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
+ gear(0.5f, 2.0f, 2.0f, 10, 0.7f);
+ gl.glEndList();
+
+ gear3 = gl.glGenLists(1);
+ gl.glNewList(gear3, GL_COMPILE);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+ gear(1.3f, 2.0f, 0.5f, 10, 0.7f);
+ gl.glEndList();
+
+ gl.glEnable(GL_NORMALIZE);
+
+ glj.gljCheckGL();
+
+ addMouseListener(this);
+ addMouseMotionListener(this);
+
+ T0=System.currentTimeMillis();
+ }
+
+ public void doCleanup()
+ {
+ System.out.println("destroy(): " + this);
+ removeMouseListener(this);
+ removeMouseMotionListener(this);
+ }
+
+ public void reshape(int width, int height)
+ {
+ float h = (float)height / (float)width;
+
+ gl.glViewport(0,0,width,height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glFrustum(-1.0f, 1.0f, -h, h, 5.0f, 60.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glTranslatef(0.0f, 0.0f, -40.0f);
+ }
+
+ public void display()
+ {
+ if (glj.gljMakeCurrent() == false) return;
+
+ angle += 2.0f;
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ gl.glPushMatrix();
+ gl.glRotatef(view_rotx, 1.0f, 0.0f, 0.0f);
+ gl.glRotatef(view_roty, 0.0f, 1.0f, 0.0f);
+ gl.glRotatef(view_rotz, 0.0f, 0.0f, 1.0f);
+
+ gl.glPushMatrix();
+ gl.glTranslatef(-3.0f, -2.0f, 0.0f);
+ gl.glRotatef(angle, 0.0f, 0.0f, 1.0f);
+ gl.glCallList(gear1);
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(3.1f, -2.0f, 0.0f);
+ gl.glRotatef(-2.0f * angle - 9.0f, 0.0f, 0.0f, 1.0f);
+ gl.glCallList(gear2);
+ gl.glPopMatrix();
+
+ gl.glPushMatrix();
+ gl.glTranslatef(-3.1f, 4.2f, 0.0f);
+ gl.glRotatef(-2.0f * angle - 25.0f, 0.0f, 0.0f, 1.0f);
+ gl.glCallList(gear3);
+ gl.glPopMatrix();
+
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+
+ Frames++;
+
+ long t=System.currentTimeMillis();
+ if(t - T0 >= 5000)
+ {
+ double seconds = (double)(t - T0) / 1000.0;
+ double fps = (double)Frames / seconds;
+ System.out.println(Frames+" frames in "+seconds+" seconds = "+
+ fps+" FPS");
+ T0 = t;
+ Frames = 0;
+ }
+ }
+
+ private void gear
+ (float inner_radius,
+ float outer_radius,
+ float width,
+ int teeth,
+ float tooth_depth)
+ {
+ int i;
+ float r0, r1, r2;
+ float angle, da;
+ float u, v, len;
+
+ r0 = inner_radius;
+ r1 = outer_radius - tooth_depth / 2.0f;
+ r2 = outer_radius + tooth_depth / 2.0f;
+
+ da = 2.0f * M_PI / teeth / 4.0f;
+
+ gl.glShadeModel(GL_FLAT);
+
+ gl.glNormal3f(0.0f, 0.0f, 1.0f);
+
+ /* draw front face */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
+ if(i < teeth)
+ {
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3.0f * da), r1 * (float)Math.sin(angle + 3.0f * da), width * 0.5f);
+ }
+ }
+ gl.glEnd();
+
+ /* draw front sides of teeth */
+ gl.glBegin(GL_QUADS);
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2.0f * da), r2 * (float)Math.sin(angle + 2.0f * da), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3.0f * da), r1 * (float)Math.sin(angle + 3.0f * da), width * 0.5f);
+ }
+ gl.glEnd();
+
+ /* draw back face */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
+ }
+ gl.glEnd();
+
+ /* draw back sides of teeth */
+ gl.glBegin(GL_QUADS);
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), -width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), -width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
+ }
+ gl.glEnd();
+
+ /* draw outward faces of teeth */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -width * 0.5f);
+ u = r2 * (float)Math.cos(angle + da) - r1 * (float)Math.cos(angle);
+ v = r2 * (float)Math.sin(angle + da) - r1 * (float)Math.sin(angle);
+ len = (float)Math.sqrt(u * u + v * v);
+ u /= len;
+ v /= len;
+ gl.glNormal3f(v, -u, 0.0f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), -width * 0.5f);
+ gl.glNormal3f((float)Math.cos(angle), (float)Math.sin(angle), 0.0f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), width * 0.5f);
+ gl.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), -width * 0.5f);
+ u = r1 * (float)Math.cos(angle + 3 * da) - r2 * (float)Math.cos(angle + 2 * da);
+ v = r1 * (float)Math.sin(angle + 3 * da) - r2 * (float)Math.sin(angle + 2 * da);
+ gl.glNormal3f(v, -u, 0.0f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -width * 0.5f);
+ gl.glNormal3f((float)Math.cos(angle), (float)Math.sin(angle), 0.0f);
+ }
+ gl.glVertex3f(r1 * (float)Math.cos(0), r1 * (float)Math.sin(0), width * 0.5f);
+ gl.glVertex3f(r1 * (float)Math.cos(0), r1 * (float)Math.sin(0), -width * 0.5f);
+ gl.glEnd();
+
+ gl.glShadeModel(GL_SMOOTH);
+
+ /* draw inside radius cylinder */
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++)
+ {
+ angle = i * 2.0f * M_PI / teeth;
+ gl.glNormal3f(-(float)Math.cos(angle), -(float)Math.sin(angle), 0.0f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -width * 0.5f);
+ gl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), width * 0.5f);
+ }
+ gl.glEnd();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ prevMouseX = evt.getX();
+ prevMouseY = evt.getY();
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ mouseRButtonDown = true;
+ evt.consume();
+ }
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ if ((evt.getModifiers() & evt.BUTTON3_MASK) != 0)
+ {
+ mouseRButtonDown = false;
+ evt.consume();
+ }
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ }
+
+ // Methods required for the implementation of MouseMotionListener
+ public void mouseDragged( MouseEvent evt )
+ {
+ int x = evt.getX();
+ int y = evt.getY();
+ Dimension size = getSize();
+
+ float thetaY = 360.0f * ( (float)(x-prevMouseX)/(float)size.width);
+ float thetaX = 360.0f * ( (float)(prevMouseY-y)/(float)size.height);
+
+ prevMouseX = x;
+ prevMouseY = y;
+
+ view_rotx += thetaX;
+ view_roty += thetaY;
+
+ evt.consume();
+ }
+
+ public void mouseMoved( MouseEvent evt )
+ {
+ }
+ }
+}
diff --git a/demos/SwingDemos/test/GLJPanel/GLJPanel.java b/demos/SwingDemos/test/GLJPanel/GLJPanel.java
new file mode 100644
index 0000000..166437b
--- /dev/null
+++ b/demos/SwingDemos/test/GLJPanel/GLJPanel.java
@@ -0,0 +1,694 @@
+//package gl4java.swing;
+
+import gl4java.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+
+public class GLJPanel extends JPanel
+ implements GLEnum, GLUEnum,
+ ComponentListener, WindowListener, MouseListener
+{
+ protected GLContext glj = null;
+ public GLFunc gl = null;
+ public GLUFunc glu = null;
+
+ protected boolean mustResize = false;
+
+ protected boolean cvsInitialized=false;
+
+ protected boolean needCvsDispose = false;
+
+ /**
+ * Visual pre-set for doubleBuffer, default: true
+ * This value is updated after a GLContext is created with the
+ * original updated value of GLContext !
+ *
+ * @see GLJPanel#preInit
+ * @see GLJPanel#paint
+ */
+ protected boolean doubleBuffer = true;
+
+ /**
+ * Visual pre-set for stencil-bit number, default: 0
+ * This value is updated after a GLContext is created with the
+ * original updated value of GLContext !
+ *
+ * @see GLJPanel#preInit
+ * @see GLJPanel#paint
+ */
+ protected int stencilBits = 0;
+
+ /**
+ * Visual pre-set for stereoView, default: false
+ * This value is updated after a GLContext is created with the
+ * original updated value of GLContext !
+ *
+ * @see GLJPanel#preInit
+ * @see GLJPanel#paint
+ */
+ protected boolean stereoView = false;
+
+ /**
+ * Visual pre-set for RGBA usage, default: true - of course ;-)
+ * This value is updated after a GLContext is created with the
+ * original updated value of GLContext !
+ *
+ * @see GLJPanel#preInit
+ * @see GLJPanel#paint
+ */
+ protected boolean rgba = true;
+
+ /**
+ * Visual pre-set for RGBA usage, default: true - of course ;-)
+ * This value is updated after a GLContext is created with the
+ * original updated value of GLContext !
+ *
+ * @see GLJPanel#preInit
+ * @see GLJPanel#paint
+ */
+ protected boolean createOwnWindow = false;
+
+ /**
+ * The context with witch display lists and textures will be shared.
+ *
+ * @see GLJPanel#preInit
+ * @see GLJPanel#paint
+ */
+ protected GLContext sharedGLContext;
+
+ static {
+ if(GLContext.loadNativeLibraries(null, null, null)==false)
+ System.out.println("GLJPanel could not load def. native libs.");
+ }
+
+ /**
+ *
+ * Constructor
+ *
+ * @param gl_Name The name of the GLFunc implementation
+ * If gl_Name==null, the default class will be used !
+ *
+ * @param glu_Name The name of the GLUFunc implementation
+ * If gl_LibName==null, the default class will be used !
+ *
+ * @param layout the layout manager
+ * @param isDoubleBuffered the flag indicates,
+ * if double buffer should be used
+ *
+ */
+ public GLJPanel( String gl_Name,
+ String glu_Name,
+ LayoutManager layout, boolean isDoubleBuffered
+ )
+ {
+ super( layout, isDoubleBuffered );
+
+ if( (gl=GLContext.createGLFunc(gl_Name)) ==null)
+ {
+ System.out.println("GLFunc implementation "+gl_Name+" not created");
+ }
+ if( (glu=GLContext.createGLUFunc(glu_Name)) ==null)
+ {
+ System.out.println("GLUFunc implementation "+glu_Name+" not created");
+ }
+
+ /* to be able for RESIZE event's */
+ addComponentListener(this);
+
+ setOpaque(false);
+ }
+
+ /**
+ *
+ * Constructor
+ *
+ * @param layout the layout manager
+ * @param isDoubleBuffered the flag indicates,
+ * if double buffer should be used
+ *
+ */
+ public GLJPanel( LayoutManager layout, boolean isDoubleBuffered )
+ {
+ this(null, null, layout, isDoubleBuffered);
+ }
+
+ /**
+ *
+ * Constructor
+ *
+ * Uses the default GLFunc and GLUFunc implementation !
+ *
+ * @param isDoubleBuffered the flag indicates,
+ * if double buffer should be used
+ */
+ public GLJPanel( boolean isDoubleBuffered )
+ {
+ this(null, null, new FlowLayout(), isDoubleBuffered);
+ }
+
+ /**
+ *
+ * Constructor
+ *
+ * Uses the default GLFunc and GLUFunc implementation !
+ *
+ * @param layout the layout manager
+ */
+ public GLJPanel(LayoutManager layout)
+ {
+ this(null, null, layout, true);
+ }
+
+ /**
+ *
+ * Constructor
+ *
+ * Uses the default GLFunc and GLUFunc implementation !
+ *
+ */
+ public GLJPanel( )
+ {
+ this(null, null, new FlowLayout(), true);
+ }
+
+ /**
+ * Used to return the created GLContext
+ */
+ public final GLContext getGLContext() { return glj; }
+
+ /**
+ * Safe the toplevel window
+ */
+ protected Window topLevelWindow = null;
+
+ /**
+ *
+ * This function returns the found TopLevelWindow,
+ * which contains this Canvas ..
+ *
+ * @return void
+ *
+ * @see GLJPanel#paint
+ */
+ public final Window getTopLevelWindow()
+ { return topLevelWindow; }
+
+ /**
+ * this function overrides the Canvas paint method !
+ *
+ * For the first paint,
+ * the user function preInit is called, a GLContext is created
+ * and the user function init is called !
+ *
+ * Also, if a GL Context exist, GLJPanel's sDisplay-method will be called
+ * to do OpenGL-rendering.
+ *
+ * The sDisplay method itself calls the display-method !
+ * sDisplay is needed to be thread-safe, to manage
+ * the resize functionality and to safe the time per frame.
+ *
+ * To define your rendering, you should overwrite the display-method
+ * in your derivation.
+ *
+ * @see gl4java.GLContext#GLContext
+ * @see GLJPanel#cvsIsInit
+ * @see GLJPanel#sDisplay
+ * @see GLJPanel#display
+ * @see GLJPanel#preInit
+ * @see GLJPanel#init
+ */
+ public synchronized final void paintComponent(Graphics g)
+ {
+ //JAU
+ if(GLContext.gljClassDebug)
+ System.out.println("GPanel::paintComponent()");
+ //super.paintComponent(g);
+ setOpaque(false);
+ if(glj == null )
+ {
+ preInit();
+ glj = new GLContext ( this, gl, glu,
+ createOwnWindow,
+ doubleBuffer, stereoView,
+ rgba, stencilBits,
+ sharedGLContext );
+
+ if(glj!=null)
+ {
+ createOwnWindow = glj.isOwnWindowCreated();
+ doubleBuffer = glj.isDoubleBuffer();
+ stencilBits = glj.getStencilBitNumber();
+ stereoView = glj.isStereoView();
+ rgba = glj.isRGBA();
+ }
+
+ init();
+
+ // fetch the top-level window ,
+ // to add us as the windowListener
+ //
+ Container _c = getParent();
+ Container c = null;
+
+ while(_c!=null)
+ {
+ c = _c;
+ _c = _c.getParent();
+ }
+
+ if(c instanceof Window) {
+ topLevelWindow = (Window)c;
+ topLevelWindow.addComponentListener(this);
+ topLevelWindow.addMouseListener(this);
+ } else {
+ topLevelWindow = null;
+ System.out.println("toplevel is not a Window: "+c);
+ }
+
+ if(topLevelWindow!=null)
+ {
+ topLevelWindow.addWindowListener(this);
+ } else {
+ System.out.println("no parent found for "+getName());
+ System.out.flush();
+ }
+ if(glj!=null && glj.gljIsInit())
+ cvsInitialized=true;
+ }
+ /*
+ if( mustResize ) size = getSize();
+ g.setClip(0, 0, size.width, size.height );
+ */
+ sPaint(g);
+ }
+
+ /**
+ *
+ * This is the thread save rendering-method called by paint.
+ * The actual thread will be set to highes priority befor calling
+ * 'display'. After 'display' the priority will be reset !
+ *
+ * 'gljFree' will be NOT called after 'display'.
+ *
+ * We tested the above to use multi-threading and
+ * for the demonstration 'glDemos' it works ;-)) !
+ *
+ * BE SURE, if you want to call 'display' by yourself
+ * (e.g. in the run method for animation)
+ * YOU HAVE TO CALL sDisplay -- OR YOU MUST KNOW WHAT YOU ARE DOING THEN !
+ *
+ * @return void
+ *
+ * @see GLJPanel#paint
+ * @see GLJPanel#display
+ */
+ public synchronized final void sPaint( Graphics g )
+ {
+ boolean ok = true;
+
+ long _s = System.currentTimeMillis();
+
+ if(!cvsIsInit())
+ return;
+
+ /*
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("GLJPanel: problem in use() method");
+ return;
+ }
+ */
+
+ if( mustResize )
+ {
+ if( (ok = glj.gljMakeCurrent()) == true )
+ {
+ Dimension size = getSize();
+ glj.gljResize( size.width, size.height ) ;
+ reshape(size.width, size.height);
+ mustResize = false;
+ }
+ }
+ if(ok)
+ {
+ display();
+ g.setClip(getBounds());
+ if(GLContext.gljClassDebug)
+ glj.gljCheckGL();
+ _f_dur_self = System.currentTimeMillis()-_s;
+
+ /*
+ GLGraphics glg1 = (GLGraphics)glg.create();
+ try {
+ super.paint(glg1);
+ } finally {
+ glg1.dispose();
+ }
+ */
+ //super.paint(g);
+ if(GLContext.gljClassDebug)
+ glj.gljCheckGL();
+ _f_dur_total = System.currentTimeMillis()-_s;
+ }
+
+ }
+
+ /**
+ *
+ * This is the rendering-method called by sDisplay
+ * (and sDisplay is called by paint !).
+ * The derived-class (Your Subclass) will redefine this, to draw it's own...
+ *
+ * BE SURE, if you want to call 'display' by yourself
+ * (e.g. in the run method for animation)
+ * YOU HAVE TO CALL sDisplay !
+ *
+ * 'sDisplay' manages a semaphore to avoid reentrance of
+ * the display function !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ *
+ * @return void
+ *
+ * @see GLJPanel#sDisplay
+ * @see GLJPanel#paint
+ */
+ public void display()
+ {
+ }
+
+ /**
+ *
+ * This is your pre-init method.
+ * preInit is called just BEFORE the GL-Context is created.
+ * You should override preInit, to initialize your visual-stuff,
+ * like the protected vars: doubleBuffer and stereoView
+ *
+ * @return void
+ *
+ * @see GLJPanel#paint
+ * @see GLJPanel#doubleBuffer
+ * @see GLJPanel#stereoView
+ * @see GLJPanel#rgba
+ * @see GLJPanel#stencilBits
+ */
+ public void preInit()
+ {
+ }
+
+ /**
+ *
+ * This is your init method.
+ * init is called right after the GL-Context is initialized.
+ * You should override init, to initialize your stuff needed
+ * by OpenGL an Java !
+ *
+ * @return void
+ *
+ * @see GLJPanel#paint
+ */
+ public void init()
+ {
+ }
+
+ /**
+ * This method is used to clean up any OpenGL stuff (delete textures
+ * or whatever) prior to actually deleting the OpenGL context.
+ * You should override this with your own version, if you need to do
+ * any cleanup work at this phase.
+ * This functions is called within cvsDispose
+ *
+ * @return void
+ *
+ * @see GLJPanel#cvsDispose
+ */
+ public void doCleanup()
+ {
+ }
+
+ /**
+ * This function returns, if everything is init: the GLContext,
+ * the and the users init function
+ * This value is set in the paint method!
+ *
+ * @return boolean
+ *
+ * @see GLJPanel#paint
+ * @see GLJPanel#init
+ */
+ public boolean cvsIsInit()
+ {
+ return cvsInitialized;
+ }
+
+ protected long _f_dur_self = 0;
+ protected long _f_dur_total = 0;
+
+ /**
+ *
+ * This is the reshape-method called by paint.
+ * The derived-class (Your Subclass) will redefine this,
+ * to manage your individual reshape ...
+ *
+ * This �reshape� method will be invoked after the first paint command
+ * after GLJPanel.componentResize is called AND only if �gljUse� was
+ * succesfull (so a call of gljUse is redundant).
+ * �reshape� is not an overloading of java.awt.Component.reshape,
+ * �reshape� is more like �glut�-reshape.
+ *
+ * GLJPanel.reshape allready has a simple default implementation,
+ * which calls �gljResize� and �glViewport� - so you may be can
+ * left this one as it is (no need to overload).
+ * The needed call to �gljResize� is done by hte invoker paint !
+ *
+ * @param width the new width
+ * @param height the new height
+ * @return void
+ *
+ * @see GLJPanel#paint
+ * @see GLJPanel#sDisplay
+ */
+ public void reshape( int width, int height )
+ {
+ if(GLContext.gljClassDebug)
+ System.out.println("GLJPanel::reshape bounds("+getBounds()+")");
+ gl.glViewport(0,0, width, height);
+ }
+
+ /* JAU */
+ /*
+ public final void setBounds(int x, int y, int width, int height) {
+ reshape(x, y, width, height);
+ }
+ public final void setBounds(Rectangle r) {
+ reshape(r.x, r.y, r.width, r.height);
+ }
+
+ public void reshape(int x, int y, int width, int height) {
+ super.reshape(x, y, width, height);
+ if(glj==null || !glj.gljIsInit() || !glj.gljMakeCurrent())
+ {
+ System.out.println("GLJPanel::setBounds(): problem in use() method");
+ return;
+ }
+ reshape(width-x, height-y);
+ glj.gljCheckGL();
+ glj.gljFree();
+ size = new Dimension(width-x, height-y);
+ }
+ */
+
+
+ /**
+ *
+ * �componentResized� is the componentListeners event handler.
+ *
+ * This method sets the variable �mustResize� to true,
+ * so the upcoming �paint� method-call will invoke �reshape� !
+ *
+ * This little look-alike complicating thing is done,
+ * to avoid an Exception by using the glContext from more than
+ * one concurrent thread�s !
+ *
+ * You cannot override this implementation, it is final
+ * - override �reshape' instead !
+ *
+ * @param e the element, which is resized
+ * @return void
+ *
+ * @see GLJPanel#paint
+ * @see GLJPanel#reshape
+ */
+ public void componentResized(ComponentEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.println("GLJPanel::componentResized("+e.getComponent()+")");
+ if(glj!=null && glj.gljIsInit() && e.getComponent()==this )
+ {
+ mustResize = true;
+ //repaint();
+ }
+ }
+
+ public void componentMoved(ComponentEvent e)
+ {
+ /*
+ if(GLContext.gljClassDebug)
+ System.out.print("GLJPanel::componentMoved("+e.getComponent()+")");
+ if(e.getComponent().equals(topLevelWindow))
+ {
+ repaint();
+ }
+ */
+ }
+
+ public void componentShown(ComponentEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print("GLJPanel::componentShown("+e.getComponent()+")");
+ }
+
+ public void componentHidden(ComponentEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print("GLJPanel::componentHidden("+e.getComponent()+")");
+ }
+
+ public void mouseClicked(MouseEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print(".");
+ }
+ public void mouseEntered(MouseEvent e)
+ {
+ /*
+ if(GLContext.gljClassDebug)
+ System.out.print("GLJPanel::mouseEntered("+e.getComponent()+")");
+ if(e.getComponent().equals(topLevelWindow))
+ {
+ repaint();
+ }
+ */
+ }
+ public void mouseExited(MouseEvent e)
+ {}
+ public void mousePressed(MouseEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print("<");
+ }
+ public void mouseReleased(MouseEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print(">");
+ }
+
+ public void windowOpened(WindowEvent e)
+ {
+ }
+
+ /**
+ *
+ * �windowClosing� is the windowListeners event handler
+ * for the topLevelWindow of this Canvas !
+ *
+ * This methods free�s AND destroy�s
+ * the GL Context with �glj.gljDestroy� !
+ *
+ * @return void
+ *
+ */
+ public void windowClosing(WindowEvent e)
+ {
+ if(e.getComponent().equals(topLevelWindow))
+ {
+ cvsDispose();
+ }
+ }
+
+ /**
+ *
+ * �windowClosed� is the windowListeners event handler.
+ *
+ * @return void
+ *
+ */
+ public void windowClosed(WindowEvent e)
+ {
+ if (needCvsDispose) cvsDispose();
+ }
+
+ public void windowIconified(WindowEvent e)
+ {
+ }
+
+ public void windowDeiconified(WindowEvent e)
+ {
+ }
+
+ public void windowActivated(WindowEvent e)
+ {
+ }
+
+ public void windowDeactivated(WindowEvent e)
+ {
+ }
+
+ /**
+ * You should call this before releasing/dispose this Window !
+ * Also you can overwrite this class,
+ * to dispose your own elements, e.g. a Frame etc. -
+ * but be shure that you call
+ * cvsDispose implementation call this one !
+ *
+ * This function calls gljDestroy of GLContext !
+ *
+ * @see gl4java.GLContext#gljDestroy
+ * @see GLJPanel#doCleanup
+ */
+ public void cvsDispose()
+ {
+ cvsInitialized = false;
+ if (glj != null)
+ {
+ if (glj.gljIsInit())
+ {
+ /* Sometimes the Microsoft VM calls the
+ Applet.stop() method but doesn't have
+ permissions to do J/Direct calls, so
+ this whole block of code will throw a
+ security exception. If this happens,
+ however, windowClosing() will still
+ call us again later and we will have
+ another opportunity to shut down the
+ context, so it all works out fine. */
+ try
+ {
+ glj.gljFree();
+ doCleanup();
+ //locks and free's GLContext
+ glj.setEnabled(false);
+ glj.gljDestroy();
+ needCvsDispose = false;
+ }
+ catch (Exception ex)
+ {
+ needCvsDispose = true;
+ }
+ }
+ }
+
+ // Setting glj to null will simply cause paint() to re-initialize.
+ // We don't want that to happen, so we will leave glj non-null.
+ }
+
+ /**
+ * get methods
+ */
+ public final int cvsGetWidth() {
+ return getSize().width;
+ }
+ public final int cvsGetHeight() {
+ return getSize().height;
+ }
+}
+
diff --git a/demos/SwingDemos/test/GLJPanel/test1.java b/demos/SwingDemos/test/GLJPanel/test1.java
new file mode 100644
index 0000000..3dcb96a
--- /dev/null
+++ b/demos/SwingDemos/test/GLJPanel/test1.java
@@ -0,0 +1,158 @@
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.Dimension;
+import javax.swing.*;
+import gl4java.*;
+import gl4java.awt.*;
+import gl4java.utils.glut.*;
+import gl4java.utils.glut.fonts.*;
+
+public class test1 extends JApplet
+ implements GLEnum, GLUEnum, ActionListener, ItemListener
+{
+ static {
+ if(GLContext.loadNativeLibraries(null, null, null)==false)
+ System.out.println("GLCanvas could not load def. native libs.");
+ }
+
+ protected class test1Panel extends GLJPanel
+ implements ActionListener, ItemListener
+ {
+ public test1Panel( LayoutManager layout, boolean isDoubleBuffered)
+ {
+ super(layout, isDoubleBuffered);
+ GLContext.gljNativeDebug = true;
+ GLContext.gljClassDebug = true;
+ doubleBuffer = false;
+ }
+
+
+ public void init() {
+ System.out.println("<i>");
+ //glg = new GLGraphics(gl, glu);
+ reshape(getSize().width, getSize().height);
+ }
+
+ public void display()
+ {
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ System.out.println("<p>");
+
+ int i;
+
+ gl.glPushMatrix();
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+
+ gl.glColor4f(0f, 0f, 1f, 1f);
+
+ int width=getSize().width;
+ int height=getSize().height;
+
+ gl.glBegin(GLEnum.GL_LINES);
+ gl.glVertex3i( 0, 0, 0);
+ gl.glVertex3i( 10, 10, 0);
+ gl.glVertex3i( 0, 10, 0);
+ gl.glVertex3i( 10, 0, 0);
+ gl.glEnd();
+
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void reshape( int width, int height )
+ {
+ Rectangle bounds = getBounds();
+ System.out.println("reshape("+width+", "+height+")");
+ System.out.println("reshape bounds("+bounds+")");
+ //gl.glViewport(0,0, width, height);
+ gl.glViewport(bounds.x, bounds.y,
+ bounds.width, bounds.height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glOrtho(0, 10, 0, 10, -50.0,50.0);
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ if (e.getActionCommand().equals("east")) {
+ System.out.println("East pressed");
+ } else if (e.getActionCommand().equals("west")) {
+ System.out.println("West pressed");
+ }
+ }
+
+ public void itemStateChanged(ItemEvent e) {
+ Object source = e.getItemSelectable();
+ System.out.println("item changed: "+source);
+ }
+
+ }
+
+ test1Panel tst1cvs1;
+
+ public void init()
+ {
+ JPanel jp1 = new JPanel (new BorderLayout(), false);
+ setContentPane(jp1);
+ tst1cvs1 = new test1Panel(new BorderLayout(), false);
+ jp1.add("Center", tst1cvs1);
+
+ String[] data = {"one", "two", "three", "four"};
+ JList dataList = new JList(data);
+ jp1.add("North", dataList);
+
+ JButton b1, b2;
+ jp1.add("East", (b1 = new JButton("E")));
+ b1.setActionCommand("east");
+ b1.addActionListener(this);
+ jp1.add("West", (b2 = new JButton("W")));
+ b2.setActionCommand("west");
+ b2.addActionListener(this);
+
+ JCheckBox c1;
+ jp1.add("South", (c1 = new JCheckBox("SouthButton", true)));
+ c1.addItemListener(this);
+ }
+
+ public static void main(java.lang.String[] args) {
+ try {
+ Frame mainFrame = new Frame("test1");
+
+ test1 applet=new test1();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ } catch (Throwable exception) {
+ System.err.println("Exception occurred in main()");
+ exception.printStackTrace(System.out);
+ }
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ if (e.getActionCommand().equals("east")) {
+ System.out.println("East pressed");
+ } else if (e.getActionCommand().equals("west")) {
+ System.out.println("West pressed");
+ }
+ }
+
+ public void itemStateChanged(ItemEvent e) {
+ Object source = e.getItemSelectable();
+ System.out.println("item changed: "+source);
+ }
+
+}
diff --git a/demos/SwingDemos/test/GLJPanel/test2.java b/demos/SwingDemos/test/GLJPanel/test2.java
new file mode 100644
index 0000000..c479133
--- /dev/null
+++ b/demos/SwingDemos/test/GLJPanel/test2.java
@@ -0,0 +1,115 @@
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.Dimension;
+import javax.swing.*;
+
+public class test2 extends JApplet
+ implements ActionListener, ItemListener
+{
+ protected class test2Panel extends JPanel
+ implements ActionListener, ItemListener
+ {
+ public test2Panel( LayoutManager layout, boolean isDoubleBuffered)
+ {
+ super(layout, isDoubleBuffered);
+ }
+
+
+ public void paintComponent(Graphics g)
+ {
+ System.out.println("<p>");
+
+ super.paintComponent(g);
+
+ g.setColor(Color.blue);
+
+ int width=getSize().width;
+ int height=getSize().height;
+
+ g.drawLine ( 0, height/2, width, height/2 );
+ g.drawLine ( width/2, 0, width/2, height );
+
+ g.setColor(Color.yellow);
+
+ g.drawLine ( 0, 0, width, height);
+ g.drawString("Left-top", 0, 10);
+ g.drawString("GLGraphics - CENTER", width/2, height/2);
+ g.drawString("Right - Bottom (nearly)", width*2/3, height*2/3);
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ if (e.getActionCommand().equals("east")) {
+ System.out.println("East pressed");
+ } else if (e.getActionCommand().equals("west")) {
+ System.out.println("West pressed");
+ }
+ }
+
+ public void itemStateChanged(ItemEvent e) {
+ Object source = e.getItemSelectable();
+ System.out.println("item changed: "+source);
+ }
+
+ }
+
+ test2Panel tst1cvs1;
+
+ public void init()
+ {
+ JPanel jp1 = new JPanel (new BorderLayout(), false);
+ setContentPane(jp1);
+ tst1cvs1 = new test2Panel(new BorderLayout(), false);
+ jp1.add("Center", tst1cvs1);
+
+ String[] data = {"one", "two", "three", "four"};
+ JList dataList = new JList(data);
+ jp1.add("North", dataList);
+
+ JButton b1, b2;
+ jp1.add("East", (b1 = new JButton("E")));
+ b1.setActionCommand("east");
+ b1.addActionListener(this);
+ jp1.add("West", (b2 = new JButton("W")));
+ b2.setActionCommand("west");
+ b2.addActionListener(this);
+
+ JCheckBox c1;
+ jp1.add("South", (c1 = new JCheckBox("SouthButton", true)));
+ c1.addItemListener(this);
+ }
+
+ public static void main(java.lang.String[] args) {
+ try {
+ Frame mainFrame = new Frame("test2");
+
+ test2 applet=new test2();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ } catch (Throwable exception) {
+ System.err.println("Exception occurred in main()");
+ exception.printStackTrace(System.out);
+ }
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ if (e.getActionCommand().equals("east")) {
+ System.out.println("East pressed");
+ } else if (e.getActionCommand().equals("west")) {
+ System.out.println("West pressed");
+ }
+ }
+
+ public void itemStateChanged(ItemEvent e) {
+ Object source = e.getItemSelectable();
+ System.out.println("item changed: "+source);
+ }
+
+}
diff --git a/demos/SwingDemos/test/GLPanel-AWTGraphics/GLPanel.java b/demos/SwingDemos/test/GLPanel-AWTGraphics/GLPanel.java
new file mode 100644
index 0000000..4c7989d
--- /dev/null
+++ b/demos/SwingDemos/test/GLPanel-AWTGraphics/GLPanel.java
@@ -0,0 +1,676 @@
+//package gl4java.awt;
+
+import gl4java.*;
+
+import java.awt.*;
+import java.awt.event.*;
+
+public class GLPanel extends Panel
+ implements GLEnum, GLUEnum,
+ ComponentListener, WindowListener, MouseListener
+{
+ protected GLContext glj = null;
+ public GLFunc gl = null;
+ public GLUFunc glu = null;
+
+ protected boolean mustResize = false;
+
+ protected boolean cvsInitialized=false;
+
+ protected boolean needCvsDispose = false;
+
+ /**
+ * Visual pre-set for doubleBuffer, default: true
+ * This value is updated after a GLContext is created with the
+ * original updated value of GLContext !
+ *
+ * @see GLPanel#preInit
+ * @see GLPanel#paint
+ */
+ protected boolean doubleBuffer = true;
+
+ /**
+ * Visual pre-set for stencil-bit number, default: 0
+ * This value is updated after a GLContext is created with the
+ * original updated value of GLContext !
+ *
+ * @see GLPanel#preInit
+ * @see GLPanel#paint
+ */
+ protected int stencilBits = 0;
+
+ /**
+ * Visual pre-set for stereoView, default: false
+ * This value is updated after a GLContext is created with the
+ * original updated value of GLContext !
+ *
+ * @see GLPanel#preInit
+ * @see GLPanel#paint
+ */
+ protected boolean stereoView = false;
+
+ /**
+ * Visual pre-set for RGBA usage, default: true - of course ;-)
+ * This value is updated after a GLContext is created with the
+ * original updated value of GLContext !
+ *
+ * @see GLPanel#preInit
+ * @see GLPanel#paint
+ */
+ protected boolean rgba = true;
+
+ /**
+ * Visual pre-set for RGBA usage, default: true - of course ;-)
+ * This value is updated after a GLContext is created with the
+ * original updated value of GLContext !
+ *
+ * @see GLPanel#preInit
+ * @see GLPanel#paint
+ */
+ protected boolean createOwnWindow = false;
+
+ /**
+ * The context with witch display lists and textures will be shared.
+ *
+ * @see GLPanel#preInit
+ * @see GLPanel#paint
+ */
+ protected GLContext sharedGLContext;
+
+ static {
+ if(GLContext.loadNativeLibraries(null, null, null)==false)
+ System.out.println("GLPanel could not load def. native libs.");
+ }
+
+ /**
+ *
+ * Constructor
+ *
+ * @param width the canvas initial-prefered width
+ * @param height the canvas initial-prefered height
+ *
+ * @param gl_Name The name of the GLFunc implementation
+ * If gl_Name==null, the default class will be used !
+ *
+ * @param glu_Name The name of the GLUFunc implementation
+ * If gl_LibName==null, the default class will be used !
+ *
+ */
+ public GLPanel( String gl_Name,
+ String glu_Name
+ )
+ {
+ super( new BorderLayout() );
+
+ if( (gl=GLContext.createGLFunc(gl_Name)) ==null)
+ {
+ System.out.println("GLFunc implementation "+gl_Name+" not created");
+ }
+ if( (glu=GLContext.createGLUFunc(glu_Name)) ==null)
+ {
+ System.out.println("GLUFunc implementation "+glu_Name+" not created");
+ }
+
+ /* to be able for RESIZE event's */
+ addComponentListener(this);
+ }
+
+ /**
+ *
+ * Constructor
+ *
+ * Uses the default GLFunc and GLUFunc implementation !
+ *
+ * @param width the canvas initial-prefered width
+ * @param height the canvas initial-prefered height
+ *
+ */
+ public GLPanel( )
+ {
+ this(null, null);
+ }
+
+ /**
+ * Used to return the created GLContext
+ */
+ public final GLContext getGLContext() { return glj; }
+
+ /**
+ *
+ * Overridden update
+ * This one only call's the paint method, without clearing
+ * the background - thats hopefully done by OpenGL ;-)
+ *
+ * @param g the Graphics Context
+ * @return void
+ *
+ * @see GLPanel#paint
+ */
+ public void update(Graphics g)
+ {
+ //JAU
+ if(GLContext.gljClassDebug)
+ System.out.println("GPanel::update(): isShowing()="+isShowing());
+ if(isShowing())
+ {
+ /* let's let OpenGL clear the background ... */
+ paint(g);
+ }
+ }
+
+
+ /**
+ * Safe the toplevel window
+ */
+ protected Window topLevelWindow = null;
+
+ /**
+ *
+ * This function returns the found TopLevelWindow,
+ * which contains this Canvas ..
+ *
+ * @return void
+ *
+ * @see GLPanel#paint
+ */
+ public final Window getTopLevelWindow()
+ { return topLevelWindow; }
+
+ /**
+ * this function overrides the Canvas paint method !
+ *
+ * For the first paint,
+ * the user function preInit is called, a GLContext is created
+ * and the user function init is called !
+ *
+ * Also, if a GL Context exist, GLPanel's sDisplay-method will be called
+ * to do OpenGL-rendering.
+ *
+ * The sDisplay method itself calls the display-method !
+ * sDisplay is needed to be thread-safe, to manage
+ * the resize functionality and to safe the time per frame.
+ *
+ * To define your rendering, you should overwrite the display-method
+ * in your derivation.
+ *
+ * @see gl4java.GLContext#GLContext
+ * @see GLPanel#cvsIsInit
+ * @see GLPanel#sDisplay
+ * @see GLPanel#display
+ * @see GLPanel#preInit
+ * @see GLPanel#init
+ */
+ public synchronized final void paint( Graphics g )
+ {
+ //JAU
+ if(GLContext.gljClassDebug)
+ System.out.println("GPanel::paint()");
+ if(glj == null )
+ {
+ preInit();
+ glj = new GLContext ( this, gl, glu,
+ createOwnWindow,
+ doubleBuffer, stereoView,
+ rgba, stencilBits,
+ sharedGLContext );
+
+ if(glj!=null)
+ {
+ createOwnWindow = glj.isOwnWindowCreated();
+ doubleBuffer = glj.isDoubleBuffer();
+ stencilBits = glj.getStencilBitNumber();
+ stereoView = glj.isStereoView();
+ rgba = glj.isRGBA();
+ }
+
+ init();
+
+ // fetch the top-level window ,
+ // to add us as the windowListener
+ //
+ Container _c = getParent();
+ Container c = null;
+
+ while(_c!=null)
+ {
+ c = _c;
+ _c = _c.getParent();
+ }
+
+ if(c instanceof Window) {
+ topLevelWindow = (Window)c;
+ topLevelWindow.addComponentListener(this);
+ topLevelWindow.addMouseListener(this);
+ } else {
+ topLevelWindow = null;
+ System.out.println("toplevel is not a Window: "+c);
+ }
+
+ if(topLevelWindow!=null)
+ {
+ topLevelWindow.addWindowListener(this);
+ } else {
+ System.out.println("no parent found for "+getName());
+ System.out.flush();
+ }
+ if(glj!=null && glj.gljIsInit())
+ cvsInitialized=true;
+ }
+ /*
+ if( mustResize ) size = getSize();
+ g.setClip(0, 0, size.width, size.height );
+ */
+ sPaint(g);
+ }
+
+ /**
+ *
+ * This is the thread save rendering-method called by paint.
+ * The actual thread will be set to highes priority befor calling
+ * 'display'. After 'display' the priority will be reset !
+ *
+ * 'gljFree' will be NOT called after 'display'.
+ *
+ * We tested the above to use multi-threading and
+ * for the demonstration 'glDemos' it works ;-)) !
+ *
+ * BE SURE, if you want to call 'display' by yourself
+ * (e.g. in the run method for animation)
+ * YOU HAVE TO CALL sDisplay -- OR YOU MUST KNOW WHAT YOU ARE DOING THEN !
+ *
+ * @return void
+ *
+ * @see GLPanel#paint
+ * @see GLPanel#display
+ */
+ public synchronized final void sPaint( Graphics g )
+ {
+ boolean ok = true;
+
+ long _s = System.currentTimeMillis();
+
+ if(!cvsIsInit())
+ return;
+
+ /*
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("GLPanel: problem in use() method");
+ return;
+ }
+ */
+
+ if( mustResize )
+ {
+ Dimension size = getSize();
+ glj.gljResize( size.width, size.height ) ;
+ reshape(size.width, size.height);
+ mustResize = false;
+ }
+ if(ok)
+ {
+ display();
+ if(GLContext.gljClassDebug)
+ glj.gljCheckGL();
+ _f_dur_self = System.currentTimeMillis()-_s;
+
+ /*
+ GLGraphics glg1 = (GLGraphics)glg.create();
+ try {
+ super.paint(glg1);
+ } finally {
+ glg1.dispose();
+ }
+ */
+ super.paint(g);
+ if(GLContext.gljClassDebug)
+ glj.gljCheckGL();
+ _f_dur_total = System.currentTimeMillis()-_s;
+
+ glj.gljSwap();
+ glj.gljFree();
+ }
+
+ }
+
+ /**
+ *
+ * This is the rendering-method called by sDisplay
+ * (and sDisplay is called by paint !).
+ * The derived-class (Your Subclass) will redefine this, to draw it's own...
+ *
+ * BE SURE, if you want to call 'display' by yourself
+ * (e.g. in the run method for animation)
+ * YOU HAVE TO CALL sDisplay !
+ *
+ * 'sDisplay' manages a semaphore to avoid reentrance of
+ * the display function !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ *
+ * @return void
+ *
+ * @see GLPanel#sDisplay
+ * @see GLPanel#paint
+ */
+ public void display()
+ {
+ }
+
+ /**
+ *
+ * This is your pre-init method.
+ * preInit is called just BEFORE the GL-Context is created.
+ * You should override preInit, to initialize your visual-stuff,
+ * like the protected vars: doubleBuffer and stereoView
+ *
+ * @return void
+ *
+ * @see GLPanel#paint
+ * @see GLPanel#doubleBuffer
+ * @see GLPanel#stereoView
+ * @see GLPanel#rgba
+ * @see GLPanel#stencilBits
+ */
+ public void preInit()
+ {
+ }
+
+ /**
+ *
+ * This is your init method.
+ * init is called right after the GL-Context is initialized.
+ * You should override init, to initialize your stuff needed
+ * by OpenGL an Java !
+ *
+ * @return void
+ *
+ * @see GLPanel#paint
+ */
+ public void init()
+ {
+ }
+
+ /**
+ * This method is used to clean up any OpenGL stuff (delete textures
+ * or whatever) prior to actually deleting the OpenGL context.
+ * You should override this with your own version, if you need to do
+ * any cleanup work at this phase.
+ * This functions is called within cvsDispose
+ *
+ * @return void
+ *
+ * @see GLPanel#cvsDispose
+ */
+ public void doCleanup()
+ {
+ }
+
+ /**
+ * This function returns, if everything is init: the GLContext,
+ * the and the users init function
+ * This value is set in the paint method!
+ *
+ * @return boolean
+ *
+ * @see GLPanel#paint
+ * @see GLPanel#init
+ */
+ public boolean cvsIsInit()
+ {
+ return cvsInitialized;
+ }
+
+ protected long _f_dur_self = 0;
+ protected long _f_dur_total = 0;
+
+ /**
+ *
+ * This is the reshape-method called by paint.
+ * The derived-class (Your Subclass) will redefine this,
+ * to manage your individual reshape ...
+ *
+ * This �reshape� method will be invoked after the first paint command
+ * after GLPanel.componentResize is called AND only if �gljUse� was
+ * succesfull (so a call of gljUse is redundant).
+ * �reshape� is not an overloading of java.awt.Component.reshape,
+ * �reshape� is more like �glut�-reshape.
+ *
+ * GLPanel.reshape allready has a simple default implementation,
+ * which calls �gljResize� and �glViewport� - so you may be can
+ * left this one as it is (no need to overload).
+ * The needed call to �gljResize� is done by hte invoker paint !
+ *
+ * @param width the new width
+ * @param height the new height
+ * @return void
+ *
+ * @see GLPanel#paint
+ * @see GLPanel#sDisplay
+ */
+ public void reshape( int width, int height )
+ {
+ if(GLContext.gljClassDebug)
+ System.out.println("GLPanel::reshape bounds("+getBounds()+")");
+ gl.glViewport(0,0, width, height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glOrtho(0, width, height, 0, -50.0,50.0);
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+ /* JAU */
+ /*
+ public final void setBounds(int x, int y, int width, int height) {
+ reshape(x, y, width, height);
+ }
+ public final void setBounds(Rectangle r) {
+ reshape(r.x, r.y, r.width, r.height);
+ }
+
+ public void reshape(int x, int y, int width, int height) {
+ super.reshape(x, y, width, height);
+ if(glj==null || !glj.gljIsInit() || !glj.gljMakeCurrent())
+ {
+ System.out.println("GLPanel::setBounds(): problem in use() method");
+ return;
+ }
+ reshape(width-x, height-y);
+ glj.gljCheckGL();
+ glj.gljFree();
+ size = new Dimension(width-x, height-y);
+ }
+ */
+
+
+ /**
+ *
+ * �componentResized� is the componentListeners event handler.
+ *
+ * This method sets the variable �mustResize� to true,
+ * so the upcoming �paint� method-call will invoke �reshape� !
+ *
+ * This little look-alike complicating thing is done,
+ * to avoid an Exception by using the glContext from more than
+ * one concurrent thread�s !
+ *
+ * You cannot override this implementation, it is final
+ * - override �reshape' instead !
+ *
+ * @param e the element, which is resized
+ * @return void
+ *
+ * @see GLPanel#paint
+ * @see GLPanel#reshape
+ */
+ public void componentResized(ComponentEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.println("GLPanel::componentResized("+e.getComponent()+")");
+ if(glj!=null && glj.gljIsInit() && e.getComponent()==this )
+ {
+ mustResize = true;
+ //repaint();
+ }
+ }
+
+ public void componentMoved(ComponentEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print("GLPanel::componentMoved("+e.getComponent()+")");
+ /*
+ if(e.getComponent().equals(topLevelWindow))
+ {
+ repaint();
+ }
+ */
+ }
+
+ public void componentShown(ComponentEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print("GLPanel::componentShown("+e.getComponent()+")");
+ }
+
+ public void componentHidden(ComponentEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print("GLPanel::componentHidden("+e.getComponent()+")");
+ }
+
+ public void mouseClicked(MouseEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print(".");
+ }
+ public void mouseEntered(MouseEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print("GLPanel::mouseEntered("+e.getComponent()+")");
+ /*
+ if(e.getComponent().equals(topLevelWindow))
+ {
+ repaint();
+ }
+ */
+ }
+ public void mouseExited(MouseEvent e)
+ {}
+ public void mousePressed(MouseEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print("<");
+ }
+ public void mouseReleased(MouseEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print(">");
+ }
+
+ public void windowOpened(WindowEvent e)
+ {
+ }
+
+ /**
+ *
+ * �windowClosing� is the windowListeners event handler
+ * for the topLevelWindow of this Canvas !
+ *
+ * This methods free�s AND destroy�s
+ * the GL Context with �glj.gljDestroy� !
+ *
+ * @return void
+ *
+ */
+ public void windowClosing(WindowEvent e)
+ {
+ if(e.getComponent().equals(topLevelWindow))
+ {
+ cvsDispose();
+ }
+ }
+
+ /**
+ *
+ * �windowClosed� is the windowListeners event handler.
+ *
+ * @return void
+ *
+ */
+ public void windowClosed(WindowEvent e)
+ {
+ if (needCvsDispose) cvsDispose();
+ }
+
+ public void windowIconified(WindowEvent e)
+ {
+ }
+
+ public void windowDeiconified(WindowEvent e)
+ {
+ }
+
+ public void windowActivated(WindowEvent e)
+ {
+ }
+
+ public void windowDeactivated(WindowEvent e)
+ {
+ }
+
+ /**
+ * You should call this before releasing/dispose this Window !
+ * Also you can overwrite this class,
+ * to dispose your own elements, e.g. a Frame etc. -
+ * but be shure that you call
+ * cvsDispose implementation call this one !
+ *
+ * This function calls gljDestroy of GLContext !
+ *
+ * @see gl4java.GLContext#gljDestroy
+ * @see GLPanel#doCleanup
+ */
+ public void cvsDispose()
+ {
+ cvsInitialized = false;
+ if (glj != null)
+ {
+ if (glj.gljIsInit())
+ {
+ /* Sometimes the Microsoft VM calls the
+ Applet.stop() method but doesn't have
+ permissions to do J/Direct calls, so
+ this whole block of code will throw a
+ security exception. If this happens,
+ however, windowClosing() will still
+ call us again later and we will have
+ another opportunity to shut down the
+ context, so it all works out fine. */
+ try
+ {
+ glj.gljFree();
+ doCleanup();
+ //locks and free's GLContext
+ glj.setEnabled(false);
+ glj.gljDestroy();
+ needCvsDispose = false;
+ }
+ catch (Exception ex)
+ {
+ needCvsDispose = true;
+ }
+ }
+ }
+
+ // Setting glj to null will simply cause paint() to re-initialize.
+ // We don't want that to happen, so we will leave glj non-null.
+ }
+
+ /**
+ * get methods
+ */
+ public final int cvsGetWidth() {
+ return getSize().width;
+ }
+ public final int cvsGetHeight() {
+ return getSize().height;
+ }
+}
+
diff --git a/demos/SwingDemos/test/GLPanel-AWTGraphics/test1.java b/demos/SwingDemos/test/GLPanel-AWTGraphics/test1.java
new file mode 100644
index 0000000..b9786a0
--- /dev/null
+++ b/demos/SwingDemos/test/GLPanel-AWTGraphics/test1.java
@@ -0,0 +1,137 @@
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.Dimension;
+import javax.swing.*;
+import gl4java.*;
+import gl4java.awt.*;
+import gl4java.swing.*;
+import gl4java.utils.glut.*;
+import gl4java.utils.glut.fonts.*;
+
+public class test1 extends JApplet
+ implements GLEnum, GLUEnum
+{
+ static {
+ if(GLContext.loadNativeLibraries(null, null, null)==false)
+ System.out.println("GLCanvas could not load def. native libs.");
+ }
+
+ protected class test1Panel extends GLPanel
+ implements ActionListener, ItemListener
+ {
+ public test1Panel() {
+ super();
+ GLContext.gljNativeDebug = true;
+ GLContext.gljClassDebug = true;
+ //String[] data = {"one", "two", "three", "four"};
+ //JList dataList = new JList(data);
+ //add("North", dataList);
+ JButton b1, b2;
+ add("East", (b1 = new JButton("E")));
+ b1.setActionCommand("east");
+ b1.addActionListener(this);
+ add("West", (b2 = new JButton("W")));
+ b2.setActionCommand("west");
+ b2.addActionListener(this);
+
+ JCheckBox c1;
+ add("South", (c1 = new JCheckBox("SouthButton", true)));
+ c1.addItemListener(this);
+ }
+
+
+ public void init() {
+ System.out.println("<i>");
+ //glg = new GLGraphics(gl, glu);
+ reshape(getSize().width, getSize().height);
+ }
+
+ public void display()
+ {
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ System.out.println("<p>");
+
+ int i;
+
+ gl.glPushMatrix();
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+
+ gl.glColor4f(0f, 0f, 1f, 1f);
+
+ int width=getSize().width;
+ int height=getSize().height;
+
+ gl.glBegin(GLEnum.GL_LINES);
+ gl.glVertex3i( 0, 0, 0);
+ gl.glVertex3i( 10, 10, 0);
+ gl.glVertex3i( 0, 10, 0);
+ gl.glVertex3i( 10, 0, 0);
+ gl.glEnd();
+
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void reshape( int width, int height )
+ {
+ System.out.println("reshape("+width+", "+height+")");
+ System.out.println("reshape bounds("+getBounds()+")");
+ gl.glViewport(0,0, width, height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glOrtho(0, 10, 0, 10, -50.0,50.0);
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ if (e.getActionCommand().equals("east")) {
+ System.out.println("East pressed");
+ } else if (e.getActionCommand().equals("west")) {
+ System.out.println("West pressed");
+ }
+ }
+
+ public void itemStateChanged(ItemEvent e) {
+ Object source = e.getItemSelectable();
+ System.out.println("item changed: "+source);
+ }
+
+ }
+
+ test1Panel tst1cvs1;
+
+ public void init()
+ {
+ tst1cvs1 = new test1Panel();
+ tst1cvs1.setSize(400,400);
+ setContentPane(tst1cvs1);
+ }
+
+ public static void main(java.lang.String[] args) {
+ try {
+ Frame mainFrame = new Frame("test1");
+
+ test1 applet=new test1();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ } catch (Throwable exception) {
+ System.err.println("Exception occurred in main()");
+ exception.printStackTrace(System.out);
+ }
+ }
+}
diff --git a/demos/SwingDemos/test/GLPanel-GLGraphics/GLGraphics.java b/demos/SwingDemos/test/GLPanel-GLGraphics/GLGraphics.java
new file mode 100644
index 0000000..835febf
--- /dev/null
+++ b/demos/SwingDemos/test/GLPanel-GLGraphics/GLGraphics.java
@@ -0,0 +1,513 @@
+/**
+ * @(#) GLGraphics.java
+ */
+
+//package gl4java.awt;
+
+import gl4java.*;
+import gl4java.utils.glut.*;
+import gl4java.utils.glut.fonts.*;
+
+import java.awt.*;
+import java.awt.image.*;
+import java.awt.event.*;
+import java.awt.image.ImageObserver;
+import java.text.*;
+
+public class GLGraphics
+ extends java.awt.Graphics
+ implements Cloneable
+{
+
+protected final boolean debug = false;
+
+/**
+ * this is the original Graphics context
+ */
+protected Graphics g = null;
+
+protected GLContext glj = null;
+protected GLFunc gl = null;
+protected GLUFunc glu = null;
+protected GLUTFunc glut = null;
+protected int currentGlutFont = GLUTEnum.GLUT_BITMAP_TIMES_ROMAN_10;
+protected int x_orig = 0;
+protected int y_orig = 0;
+protected int z_orig = 0;
+
+//protected Color clr = Color.black;
+//protected Shape clip = null;
+//protected Font fnt = null;
+
+public GLGraphics (Graphics g, GLContext glj, GLFunc gl, GLUFunc glu) {
+ this.g=g;
+ this.glj=glj;
+ this.gl=gl;
+ this.glu=glu;
+ glut = new GLUTFuncLightImplWithFonts(gl, glu);
+}
+
+public GLGraphics (Graphics g, GLContext glj, GLFunc gl, GLUFunc glu, GLUTFunc glut) {
+ this.g=g;
+ this.glj=glj;
+ this.gl=gl;
+ this.glu=glu;
+ this.glut=glut;
+}
+
+protected GLGraphics (GLContext glj, GLFunc gl, GLUFunc glu, GLUTFunc glut) {
+ this.glj=glj;
+ this.gl=gl;
+ this.glu=glu;
+ this.glut=glut;
+}
+
+protected Object clone()
+ throws CloneNotSupportedException
+{
+ GLGraphics glg = new GLGraphics(g, glj, gl, glu, glut);
+ //glg.g=g.create();
+ glg.x_orig=x_orig;
+ glg.y_orig=y_orig;
+ glg.z_orig=z_orig;
+ glg.currentGlutFont=currentGlutFont;
+
+ //glg.clr = clr;
+ //glg.clip=clip;
+ //glg.fnt = fnt;
+
+ return glg;
+}
+
+public Graphics create () {
+ try {
+ return ((Graphics)clone());
+ }
+ catch (CloneNotSupportedException _) {
+ return (null);
+ }
+}
+
+public Graphics create ( int x, int y, int width, int height ) {
+ if(debug)
+ System.out.println("Graphics::create("+x+","+y+","+width+","+height+")");
+ // slow, generic version
+ Graphics g = create();
+
+ // modify cloned state acording to request
+ g.translate( x, y);
+ g.clipRect( 0, 0, width, height); // spec says this should be the intersection
+
+ return g;
+}
+
+public void clearRect ( int x, int y, int width, int height )
+{
+ if(debug)
+ System.out.println("Graphics::clearRect("+x+","+y+","+width+","+height+")");
+}
+
+public void clipRect ( int x, int y, int width, int height )
+{ g.clipRect(x, y, width, height);
+}
+
+public void copyArea ( int x, int y, int width, int height, int dx, int dy )
+{
+ if(debug)
+ System.out.println("Graphics::copyArea("+x+","+y+","+width+","+height+","+dx+","+dy+")");
+}
+
+public void dispose ()
+{
+ //g.dispose();
+}
+
+public void drawArc ( int x, int y, int width, int height,
+ int startAngle, int arcAngle )
+{
+ if(debug)
+ System.out.println("Graphics::drawArc("+x+","+y+","+width+","+height+","+startAngle+","+arcAngle+")");
+}
+
+public boolean drawImage (Image img, int x, int y, Color bgcolor,
+ ImageObserver observer)
+{
+ if(debug)
+ System.out.println("Graphics::drawImage("+x+","+y+","+bgcolor+")");
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("GLGraphics: problem in use() method");
+ return false;
+ }
+ return false;
+}
+
+public boolean drawImage ( Image img, int x, int y, ImageObserver observer)
+{
+ if(debug)
+ System.out.println("Graphics::drawImage("+x+","+y+")");
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("GLGraphics: problem in use() method");
+ return false;
+ }
+
+ glDrawImage(observer, img, x_orig+x, y_orig+y, z_orig);
+ return false;
+}
+
+public boolean drawImage ( Image img, int x, int y, int width, int height,
+ Color background, ImageObserver observer )
+{
+ if(debug)
+ System.out.println("Graphics::drawImage("+x+","+y+","+width+","+height+","+background+")");
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("GLGraphics: problem in use() method");
+ return false;
+ }
+ return false;
+}
+
+public boolean drawImage ( Image img, int x, int y, int width, int height,
+ ImageObserver observer)
+{
+ if(debug)
+ System.out.println("Graphics::drawImage("+x+","+y+","+width+","+height+")");
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("GLGraphics: problem in use() method");
+ return false;
+ }
+ return false;
+}
+
+public boolean drawImage ( Image img,
+ int dx0, int dy0, int dx1, int dy1,
+ int sx0, int sy0, int sx1, int sy1,
+ Color bgColor, ImageObserver observer)
+{
+ if(debug)
+ System.out.println("Graphics::drawImage(..)");
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("GLGraphics: problem in use() method");
+ return false;
+ }
+ return false;
+}
+
+public boolean drawImage ( Image img,
+ int dx1, int dy1, int dx2, int dy2,
+ int sx1, int sy1, int sx2, int sy2,
+ ImageObserver observer)
+{
+ if(debug)
+ System.out.println("Graphics::drawImage(..)");
+ return false;
+}
+
+public void drawLine ( int x1, int y1, int x2, int y2 )
+{
+ if(debug)
+ System.out.println("Graphics("+x_orig+","+y_orig+")::drawLine("+x1+","+y1+","+x2+","+y2+")");
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("GLGraphics: problem in use() method");
+ return;
+ }
+ gl.glBegin(GLEnum.GL_LINES);
+ gl.glVertex3i( x_orig+x1, y_orig+y1, z_orig);
+ gl.glVertex3i( x_orig+x2, y_orig+y2, z_orig);
+ gl.glEnd();
+}
+
+public void drawOval ( int x, int y, int width, int height )
+{
+ if(debug)
+ System.out.println("Graphics::drawOval("+x+","+y+","+width+","+height+")");
+}
+
+public void drawPolygon ( int xPoints[], int yPoints[], int nPoints )
+{
+ if(debug)
+ System.out.println("Graphics("+x_orig+","+y_orig+")::drawPolygon(...)");
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("GLGraphics: problem in use() method");
+ return;
+ }
+ gl.glPolygonMode(GLEnum.GL_FRONT_AND_BACK, GLEnum.GL_LINE);
+ gl.glBegin(GLEnum.GL_POLYGON);
+ for(int i=0; i<nPoints; i++)
+ gl.glVertex3i( x_orig+xPoints[i], y_orig+yPoints[i], z_orig);
+ gl.glEnd();
+}
+
+public void drawPolyline ( int xPoints[], int yPoints[], int nPoints )
+{
+ if(debug)
+ System.out.println("Graphics("+x_orig+","+y_orig+")::drawPolyline(...)");
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("GLGraphics: problem in use() method");
+ return;
+ }
+ gl.glPolygonMode(GLEnum.GL_FRONT_AND_BACK, GLEnum.GL_LINE);
+ gl.glBegin(GLEnum.GL_POLYGON);
+ for(int i=0; i<nPoints; i++)
+ gl.glVertex3i( x_orig+xPoints[i], y_orig+yPoints[i], z_orig);
+ gl.glEnd();
+}
+
+public void drawRoundRect ( int x, int y, int width, int height,
+ int arcWidth, int arcHeight)
+{
+ if(debug)
+ System.out.println("Graphics::drawRoundRect("+x+","+y+","+width+","+height+","+arcWidth+","+arcHeight+")");
+}
+
+public void drawString ( String str, int x, int y )
+{
+ if(debug)
+ System.out.println("Graphics("+x_orig+","+y_orig+")::drawString("+x+","+y+","+str+")");
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("GLGraphics: problem in use() method");
+ return;
+ }
+ gl.glRasterPos3d(x_orig+x, y_orig+y, z_orig);
+ glut.glutBitmapString(currentGlutFont,str);
+}
+
+public void drawString(java.text.AttributedCharacterIterator aci, int x, int y)
+{
+ if(debug)
+ System.out.println("Graphics("+x_orig+","+y_orig+")::drawStringACI("+x+","+y+")");
+ StringBuffer sb = new StringBuffer();
+ for(char c = aci.first(); c != CharacterIterator.DONE; c = aci.next())
+ sb.append(c);
+ drawString(sb.toString(), x, y);
+}
+
+public void fillArc ( int x, int y, int width, int height,
+ int startAngle, int arcAngle )
+{
+ if(debug)
+ System.out.println("Graphics::fillArc("+x+","+y+","+width+","+height+","+startAngle+","+arcAngle+")");
+}
+
+public void fillOval ( int x, int y, int width, int height )
+{
+ if(debug)
+ System.out.println("Graphics::fillOval("+x+","+y+","+width+","+height+")");
+}
+
+public void fillPolygon ( int xPoints[], int yPoints[], int nPoints )
+{
+ if(debug)
+ System.out.println("Graphics::fillPolygon(..)");
+}
+
+public void fillRect ( int x, int y, int width, int height )
+{
+ if(debug)
+ System.out.println("Graphics::fillRect("+x+","+y+","+width+","+height+")");
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("GLGraphics: problem in use() method");
+ return;
+ }
+ gl.glPolygonMode(GLEnum.GL_FRONT_AND_BACK, GLEnum.GL_FILL);
+ gl.glBegin(GLEnum.GL_POLYGON);
+ gl.glVertex3i( x_orig+x, y_orig+y, z_orig);
+ gl.glVertex3i( x_orig+x+width, y_orig+y, z_orig);
+ gl.glVertex3i( x_orig+x+width, y_orig+y+height, z_orig);
+ gl.glVertex3i( x_orig+x, y_orig+y+height, z_orig);
+ gl.glVertex3i( x_orig+x, y_orig+y, z_orig);
+ gl.glEnd();
+}
+
+public void fillRoundRect ( int x, int y, int width, int height,
+ int arcWidth, int arcHeight )
+{
+ if(debug)
+ System.out.println("Graphics::fillRoundRect("+x+","+y+","+width+","+height+","+arcWidth+","+arcHeight+")");
+}
+
+public Shape getClip ()
+{ return g.getClip(); }
+
+public Rectangle getClipBounds()
+{ return null; }
+
+public Color getColor()
+{ return g.getColor(); }
+
+public Font getFont()
+{ return g.getFont(); }
+
+public FontMetrics getFontMetrics ( Font fnt )
+{ return g.getFontMetrics(fnt); }
+
+public void setClip ( Shape clip )
+{ g.setClip(clip); }
+
+public void setClip ( int x, int y, int width, int height )
+{ g.setClip(x, y, width, height); }
+
+public void setColor ( Color clr )
+{
+ if(debug)
+ System.out.println("Graphics("+x_orig+","+y_orig+")::setColor("+clr+")");
+ g.setColor(clr);
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("GLGraphics: problem in use() method");
+ return;
+ }
+ gl.glColor4d(clr.getRed()/255.0, clr.getGreen()/255.0,
+ clr.getBlue()/255.0, clr.getAlpha()/255.0);
+}
+
+public void setFont ( Font newFnt )
+{ g.setFont(newFnt);
+ if(debug)
+ System.out.println("Graphics("+(x_orig)+","+(y_orig)+")::setFont("+newFnt.getName()+" / "+ newFnt.getFamily()+" / "+ newFnt.getSize()+")");
+ switch(newFnt.getSize())
+ {
+ case 8:
+ currentGlutFont = GLUTEnum.GLUT_BITMAP_8_BY_13;
+ break;
+ case 9:
+ currentGlutFont = GLUTEnum.GLUT_BITMAP_9_BY_15;
+ break;
+ case 10:
+ currentGlutFont = GLUTEnum.GLUT_BITMAP_TIMES_ROMAN_10;
+ break;
+ case 24:
+ currentGlutFont = GLUTEnum.GLUT_BITMAP_TIMES_ROMAN_24;
+ break;
+ /*
+ case 10:
+ currentGlutFont = GLUTEnum.GLUT_BITMAP_HELVETICA_10;
+ break;
+ */
+ case 12:
+ currentGlutFont = GLUTEnum.GLUT_BITMAP_HELVETICA_12;
+ break;
+ case 18:
+ currentGlutFont = GLUTEnum.GLUT_BITMAP_HELVETICA_18;
+ break;
+ default:
+ currentGlutFont = GLUTEnum.GLUT_BITMAP_TIMES_ROMAN_10;
+ }
+}
+
+public void setPaintMode()
+{}
+
+public void setXORMode ( Color newXorClr )
+{}
+
+public void translate ( int x, int y )
+{
+ x_orig+=x;
+ y_orig+=y;
+ if(debug)
+ System.out.println("Graphics("+(x_orig-x)+","+(y_orig-y)+")::translate("+x+","+y+") -> ("+x_orig+","+y_orig+")");
+ g.translate(x, y);
+}
+
+protected void glDrawImage(ImageObserver observer, Image image,
+ int xpos, int ypos, int zpos)
+{
+ int imageWidth = image.getWidth(observer);
+ int imageHeight = image.getHeight(observer);
+ int glFormat=GLEnum.GL_RGB; //def. RGB type
+ int comps=3; //def. RGB type
+
+ if(debug)
+ System.out.println("Graphics("+(x_orig)+","+(y_orig)+")::glDrawImage("+xpos+","+ypos+") ("+imageWidth+","+imageHeight+")");
+
+ /* This is Java2 only code :-(
+ BufferedImage image =
+ new BufferedImage(imageWidth, imageHeight,
+ BufferedImage.TYPE_INT_RGB);
+
+ Graphics g = image.createGraphics();
+ g.drawImage(img,0,0,comp);
+
+ imageWidth = image.getWidth();
+ imageHeight = image.getHeight();
+ */
+
+ // Read entire PNG image (doesn't throw exceptions)
+ int[] iPixels = new int[imageWidth * imageHeight];
+
+ PixelGrabber pp=new PixelGrabber(image,
+ 0,0,
+ imageWidth, imageHeight,
+ iPixels,
+ 0,
+ imageWidth);
+ try
+ {
+ pp.grabPixels();
+ }
+ catch (InterruptedException e)
+ {
+ System.err.println("interrupted waiting for pixel!");
+ return;
+ }
+ if ((pp.getStatus() & ImageObserver.ABORT) != 0)
+ {
+ System.err.println("image fetch aborted or errored");
+ return;
+ }
+
+ /* This is Java2 only code :-(
+ int imagetype = image.getType();
+ switch(imagetype)
+ {
+ case BufferedImage.TYPE_INT_RGB:
+ glFormat=GLEnum.GL_RGB;
+ comps=3;
+ break;
+ case BufferedImage.TYPE_INT_ARGB:
+ case BufferedImage.TYPE_INT_ARGB_PRE:
+ glFormat=GLEnum.GL_RGBA;
+ comps=4;
+ break;
+ default:
+ System.err.println("unsupported format: "+imagetype);
+ return;
+ };
+ */
+
+ byte[] pixel=new byte[imageWidth * imageHeight * comps];
+
+ byte alpha=0;
+ byte red=0;
+ byte green=0;
+ byte blue=0;
+ int offset=0;
+ int aPixel;
+ int y_desc, y_asc;
+ for(y_desc=imageHeight-1, y_asc=0; y_desc>=0; y_desc--, y_asc++)
+ {
+ for(int x=0;x<imageWidth;x++)
+ {
+ aPixel = iPixels[y_desc*imageWidth + x];
+
+ if(glFormat==GLEnum.GL_RGBA)
+ alpha =new Integer( (aPixel >> 24) & 0xff ).byteValue();
+ red =new Integer( (aPixel >> 16) & 0xff ).byteValue();
+ green =new Integer( (aPixel >> 8) & 0xff ).byteValue();
+ blue =new Integer( (aPixel ) & 0xff ).byteValue();
+
+ pixel[offset++]=red;
+ pixel[offset++]=green;
+ pixel[offset++]=blue;
+ if(glFormat==GLEnum.GL_RGBA)
+ pixel[offset++]=alpha;
+ }
+ }
+ gl.glPixelStorei(GLEnum.GL_UNPACK_ALIGNMENT, 1);
+ gl.glDrawBuffer(GLEnum.GL_FRONT);
+ gl.glRasterPos3i(xpos, ypos+imageHeight, zpos);
+ gl.glDrawPixels(imageWidth, imageHeight,
+ glFormat, GLEnum.GL_UNSIGNED_BYTE,
+ pixel);
+ gl.glDrawBuffer(GLEnum.GL_BACK);
+}
+}
diff --git a/demos/SwingDemos/test/GLPanel-GLGraphics/GLPanel.java b/demos/SwingDemos/test/GLPanel-GLGraphics/GLPanel.java
new file mode 100644
index 0000000..266595e
--- /dev/null
+++ b/demos/SwingDemos/test/GLPanel-GLGraphics/GLPanel.java
@@ -0,0 +1,692 @@
+//package gl4java.awt;
+
+import gl4java.*;
+
+import java.awt.*;
+import java.awt.event.*;
+
+public class GLPanel extends Panel
+ implements GLEnum, GLUEnum,
+ ComponentListener, WindowListener, MouseListener
+{
+ protected GLContext glj = null;
+ public GLFunc gl = null;
+ public GLUFunc glu = null;
+ public GLGraphics glg = null;
+
+ protected boolean mustResize = false;
+
+ protected boolean cvsInitialized=false;
+
+ protected boolean needCvsDispose = false;
+
+ /**
+ * Visual pre-set for doubleBuffer, default: true
+ * This value is updated after a GLContext is created with the
+ * original updated value of GLContext !
+ *
+ * @see GLPanel#preInit
+ * @see GLPanel#paint
+ */
+ protected boolean doubleBuffer = true;
+
+ /**
+ * Visual pre-set for stencil-bit number, default: 0
+ * This value is updated after a GLContext is created with the
+ * original updated value of GLContext !
+ *
+ * @see GLPanel#preInit
+ * @see GLPanel#paint
+ */
+ protected int stencilBits = 0;
+
+ /**
+ * Visual pre-set for stereoView, default: false
+ * This value is updated after a GLContext is created with the
+ * original updated value of GLContext !
+ *
+ * @see GLPanel#preInit
+ * @see GLPanel#paint
+ */
+ protected boolean stereoView = false;
+
+ /**
+ * Visual pre-set for RGBA usage, default: true - of course ;-)
+ * This value is updated after a GLContext is created with the
+ * original updated value of GLContext !
+ *
+ * @see GLPanel#preInit
+ * @see GLPanel#paint
+ */
+ protected boolean rgba = true;
+
+ /**
+ * Visual pre-set for RGBA usage, default: true - of course ;-)
+ * This value is updated after a GLContext is created with the
+ * original updated value of GLContext !
+ *
+ * @see GLPanel#preInit
+ * @see GLPanel#paint
+ */
+ protected boolean createOwnWindow = false;
+
+ /**
+ * The context with witch display lists and textures will be shared.
+ *
+ * @see GLPanel#preInit
+ * @see GLPanel#paint
+ */
+ protected GLContext sharedGLContext;
+
+ static {
+ if(GLContext.loadNativeLibraries(null, null, null)==false)
+ System.out.println("GLPanel could not load def. native libs.");
+ }
+
+ /**
+ *
+ * Constructor
+ *
+ * @param width the canvas initial-prefered width
+ * @param height the canvas initial-prefered height
+ *
+ * @param gl_Name The name of the GLFunc implementation
+ * If gl_Name==null, the default class will be used !
+ *
+ * @param glu_Name The name of the GLUFunc implementation
+ * If gl_LibName==null, the default class will be used !
+ *
+ */
+ public GLPanel( String gl_Name,
+ String glu_Name
+ )
+ {
+ super( new BorderLayout() );
+
+ if( (gl=GLContext.createGLFunc(gl_Name)) ==null)
+ {
+ System.out.println("GLFunc implementation "+gl_Name+" not created");
+ }
+ if( (glu=GLContext.createGLUFunc(glu_Name)) ==null)
+ {
+ System.out.println("GLUFunc implementation "+glu_Name+" not created");
+ }
+
+ /* to be able for RESIZE event's */
+ addComponentListener(this);
+ }
+
+ /**
+ *
+ * Constructor
+ *
+ * Uses the default GLFunc and GLUFunc implementation !
+ *
+ * @param width the canvas initial-prefered width
+ * @param height the canvas initial-prefered height
+ *
+ */
+ public GLPanel( )
+ {
+ this(null, null);
+ }
+
+ /**
+ * Used to return the created GLContext
+ */
+ public final GLContext getGLContext() { return glj; }
+
+ /**
+ *
+ * Overridden update
+ * This one only call's the paint method, without clearing
+ * the background - thats hopefully done by OpenGL ;-)
+ *
+ * @param g the Graphics Context
+ * @return void
+ *
+ * @see GLPanel#paint
+ */
+ public void update(Graphics g)
+ {
+ //JAU
+ if(GLContext.gljClassDebug)
+ System.out.println("GPanel::update(): isShowing()="+isShowing());
+ if(isShowing())
+ {
+ /* let's let OpenGL clear the background ... */
+ paint(g);
+ }
+ }
+
+
+ /**
+ * Safe the toplevel window
+ */
+ protected Window topLevelWindow = null;
+
+ /**
+ *
+ * This function returns the found TopLevelWindow,
+ * which contains this Canvas ..
+ *
+ * @return void
+ *
+ * @see GLPanel#paint
+ */
+ public final Window getTopLevelWindow()
+ { return topLevelWindow; }
+
+ /**
+ * this function overrides the Canvas paint method !
+ *
+ * For the first paint,
+ * the user function preInit is called, a GLContext is created
+ * and the user function init is called !
+ *
+ * Also, if a GL Context exist, GLPanel's sDisplay-method will be called
+ * to do OpenGL-rendering.
+ *
+ * The sDisplay method itself calls the display-method !
+ * sDisplay is needed to be thread-safe, to manage
+ * the resize functionality and to safe the time per frame.
+ *
+ * To define your rendering, you should overwrite the display-method
+ * in your derivation.
+ *
+ * @see gl4java.GLContext#GLContext
+ * @see GLPanel#cvsIsInit
+ * @see GLPanel#sDisplay
+ * @see GLPanel#display
+ * @see GLPanel#preInit
+ * @see GLPanel#init
+ */
+ public synchronized final void paint( Graphics g )
+ {
+ //JAU
+ if(GLContext.gljClassDebug)
+ System.out.println("GPanel::paint()");
+ if(glj == null )
+ {
+ preInit();
+ glj = new GLContext ( this, gl, glu,
+ createOwnWindow,
+ doubleBuffer, stereoView,
+ rgba, stencilBits,
+ sharedGLContext );
+
+ if(glj!=null)
+ {
+ createOwnWindow = glj.isOwnWindowCreated();
+ doubleBuffer = glj.isDoubleBuffer();
+ stencilBits = glj.getStencilBitNumber();
+ stereoView = glj.isStereoView();
+ rgba = glj.isRGBA();
+ }
+
+ init();
+
+ // fetch the top-level window ,
+ // to add us as the windowListener
+ //
+ Container _c = getParent();
+ Container c = null;
+
+ while(_c!=null)
+ {
+ c = _c;
+ _c = _c.getParent();
+ }
+
+ if(c instanceof Window) {
+ topLevelWindow = (Window)c;
+ topLevelWindow.addComponentListener(this);
+ topLevelWindow.addMouseListener(this);
+ } else {
+ topLevelWindow = null;
+ System.out.println("toplevel is not a Window: "+c);
+ }
+
+ if(topLevelWindow!=null)
+ {
+ topLevelWindow.addWindowListener(this);
+ } else {
+ System.out.println("no parent found for "+getName());
+ System.out.flush();
+ }
+ if(glj!=null && glj.gljIsInit())
+ cvsInitialized=true;
+ }
+ if(glg!=null)
+ glg.dispose();
+ glg = new GLGraphics(g, glj, gl, glu);
+ /*
+ if( mustResize ) size = getSize();
+ g.setClip(0, 0, size.width, size.height );
+ */
+ sPaint(g);
+ }
+
+ /**
+ *
+ * This is the thread save rendering-method called by paint.
+ * The actual thread will be set to highes priority befor calling
+ * 'display'. After 'display' the priority will be reset !
+ *
+ * 'gljFree' will be NOT called after 'display'.
+ *
+ * We tested the above to use multi-threading and
+ * for the demonstration 'glDemos' it works ;-)) !
+ *
+ * BE SURE, if you want to call 'display' by yourself
+ * (e.g. in the run method for animation)
+ * YOU HAVE TO CALL sDisplay -- OR YOU MUST KNOW WHAT YOU ARE DOING THEN !
+ *
+ * @return void
+ *
+ * @see GLPanel#paint
+ * @see GLPanel#display
+ */
+ public synchronized final void sPaint( Graphics g )
+ {
+ boolean ok = true;
+
+ long _s = System.currentTimeMillis();
+
+ if(!cvsIsInit())
+ return;
+
+ /*
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("GLPanel: problem in use() method");
+ return;
+ }
+ */
+
+ if( mustResize )
+ {
+ Dimension size = getSize();
+ glj.gljResize( size.width, size.height ) ;
+ reshape(size.width, size.height);
+ mustResize = false;
+ }
+ if(ok)
+ {
+ display();
+ if(GLContext.gljClassDebug)
+ glj.gljCheckGL();
+ _f_dur_self = System.currentTimeMillis()-_s;
+
+ /*
+ GLGraphics glg1 = (GLGraphics)glg.create();
+ try {
+ super.paint(glg1);
+ } finally {
+ glg1.dispose();
+ }
+ */
+ super.paint(glg);
+ if(GLContext.gljClassDebug)
+ glj.gljCheckGL();
+ _f_dur_total = System.currentTimeMillis()-_s;
+
+ glj.gljSwap();
+ glj.gljFree();
+ }
+
+ }
+
+ public Graphics getGraphics()
+ {
+ if(glg==null)
+ return super.getGraphics();
+ return glg.create();
+ }
+
+ public Graphics getNativeGraphics()
+ {
+ return super.getGraphics();
+ }
+
+ /**
+ *
+ * This is the rendering-method called by sDisplay
+ * (and sDisplay is called by paint !).
+ * The derived-class (Your Subclass) will redefine this, to draw it's own...
+ *
+ * BE SURE, if you want to call 'display' by yourself
+ * (e.g. in the run method for animation)
+ * YOU HAVE TO CALL sDisplay !
+ *
+ * 'sDisplay' manages a semaphore to avoid reentrance of
+ * the display function !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ *
+ * @return void
+ *
+ * @see GLPanel#sDisplay
+ * @see GLPanel#paint
+ */
+ public void display()
+ {
+ }
+
+ /**
+ *
+ * This is your pre-init method.
+ * preInit is called just BEFORE the GL-Context is created.
+ * You should override preInit, to initialize your visual-stuff,
+ * like the protected vars: doubleBuffer and stereoView
+ *
+ * @return void
+ *
+ * @see GLPanel#paint
+ * @see GLPanel#doubleBuffer
+ * @see GLPanel#stereoView
+ * @see GLPanel#rgba
+ * @see GLPanel#stencilBits
+ */
+ public void preInit()
+ {
+ }
+
+ /**
+ *
+ * This is your init method.
+ * init is called right after the GL-Context is initialized.
+ * You should override init, to initialize your stuff needed
+ * by OpenGL an Java !
+ *
+ * @return void
+ *
+ * @see GLPanel#paint
+ */
+ public void init()
+ {
+ }
+
+ /**
+ * This method is used to clean up any OpenGL stuff (delete textures
+ * or whatever) prior to actually deleting the OpenGL context.
+ * You should override this with your own version, if you need to do
+ * any cleanup work at this phase.
+ * This functions is called within cvsDispose
+ *
+ * @return void
+ *
+ * @see GLPanel#cvsDispose
+ */
+ public void doCleanup()
+ {
+ }
+
+ /**
+ * This function returns, if everything is init: the GLContext,
+ * the and the users init function
+ * This value is set in the paint method!
+ *
+ * @return boolean
+ *
+ * @see GLPanel#paint
+ * @see GLPanel#init
+ */
+ public boolean cvsIsInit()
+ {
+ return cvsInitialized;
+ }
+
+ protected long _f_dur_self = 0;
+ protected long _f_dur_total = 0;
+
+ /**
+ *
+ * This is the reshape-method called by paint.
+ * The derived-class (Your Subclass) will redefine this,
+ * to manage your individual reshape ...
+ *
+ * This �reshape� method will be invoked after the first paint command
+ * after GLPanel.componentResize is called AND only if �gljUse� was
+ * succesfull (so a call of gljUse is redundant).
+ * �reshape� is not an overloading of java.awt.Component.reshape,
+ * �reshape� is more like �glut�-reshape.
+ *
+ * GLPanel.reshape allready has a simple default implementation,
+ * which calls �gljResize� and �glViewport� - so you may be can
+ * left this one as it is (no need to overload).
+ * The needed call to �gljResize� is done by hte invoker paint !
+ *
+ * @param width the new width
+ * @param height the new height
+ * @return void
+ *
+ * @see GLPanel#paint
+ * @see GLPanel#sDisplay
+ */
+ public void reshape( int width, int height )
+ {
+ if(GLContext.gljClassDebug)
+ System.out.println("GLPanel::reshape bounds("+getBounds()+")");
+ gl.glViewport(0,0, width, height);
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ gl.glOrtho(0, width, height, 0, -50.0,50.0);
+ gl.glMatrixMode(GL_MODELVIEW);
+ }
+
+ /* JAU */
+ /*
+ public final void setBounds(int x, int y, int width, int height) {
+ reshape(x, y, width, height);
+ }
+ public final void setBounds(Rectangle r) {
+ reshape(r.x, r.y, r.width, r.height);
+ }
+
+ public void reshape(int x, int y, int width, int height) {
+ super.reshape(x, y, width, height);
+ if(glj==null || !glj.gljIsInit() || !glj.gljMakeCurrent())
+ {
+ System.out.println("GLPanel::setBounds(): problem in use() method");
+ return;
+ }
+ reshape(width-x, height-y);
+ glj.gljCheckGL();
+ glj.gljFree();
+ size = new Dimension(width-x, height-y);
+ }
+ */
+
+
+ /**
+ *
+ * �componentResized� is the componentListeners event handler.
+ *
+ * This method sets the variable �mustResize� to true,
+ * so the upcoming �paint� method-call will invoke �reshape� !
+ *
+ * This little look-alike complicating thing is done,
+ * to avoid an Exception by using the glContext from more than
+ * one concurrent thread�s !
+ *
+ * You cannot override this implementation, it is final
+ * - override �reshape' instead !
+ *
+ * @param e the element, which is resized
+ * @return void
+ *
+ * @see GLPanel#paint
+ * @see GLPanel#reshape
+ */
+ public void componentResized(ComponentEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.println("GLPanel::componentResized("+e.getComponent()+")");
+ if(glj!=null && glj.gljIsInit() && e.getComponent()==this )
+ {
+ mustResize = true;
+ //repaint();
+ }
+ }
+
+ public void componentMoved(ComponentEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print("GLPanel::componentMoved("+e.getComponent()+")");
+ /*
+ if(e.getComponent().equals(topLevelWindow))
+ {
+ repaint();
+ }
+ */
+ }
+
+ public void componentShown(ComponentEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print("GLPanel::componentShown("+e.getComponent()+")");
+ }
+
+ public void componentHidden(ComponentEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print("GLPanel::componentHidden("+e.getComponent()+")");
+ }
+
+ public void mouseClicked(MouseEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print(".");
+ }
+ public void mouseEntered(MouseEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print("GLPanel::mouseEntered("+e.getComponent()+")");
+ /*
+ if(e.getComponent().equals(topLevelWindow))
+ {
+ repaint();
+ }
+ */
+ }
+ public void mouseExited(MouseEvent e)
+ {}
+ public void mousePressed(MouseEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print("<");
+ }
+ public void mouseReleased(MouseEvent e)
+ {
+ if(GLContext.gljClassDebug)
+ System.out.print(">");
+ }
+
+ public void windowOpened(WindowEvent e)
+ {
+ }
+
+ /**
+ *
+ * �windowClosing� is the windowListeners event handler
+ * for the topLevelWindow of this Canvas !
+ *
+ * This methods free�s AND destroy�s
+ * the GL Context with �glj.gljDestroy� !
+ *
+ * @return void
+ *
+ */
+ public void windowClosing(WindowEvent e)
+ {
+ if(e.getComponent().equals(topLevelWindow))
+ {
+ cvsDispose();
+ }
+ }
+
+ /**
+ *
+ * �windowClosed� is the windowListeners event handler.
+ *
+ * @return void
+ *
+ */
+ public void windowClosed(WindowEvent e)
+ {
+ if (needCvsDispose) cvsDispose();
+ }
+
+ public void windowIconified(WindowEvent e)
+ {
+ }
+
+ public void windowDeiconified(WindowEvent e)
+ {
+ }
+
+ public void windowActivated(WindowEvent e)
+ {
+ }
+
+ public void windowDeactivated(WindowEvent e)
+ {
+ }
+
+ /**
+ * You should call this before releasing/dispose this Window !
+ * Also you can overwrite this class,
+ * to dispose your own elements, e.g. a Frame etc. -
+ * but be shure that you call
+ * cvsDispose implementation call this one !
+ *
+ * This function calls gljDestroy of GLContext !
+ *
+ * @see gl4java.GLContext#gljDestroy
+ * @see GLPanel#doCleanup
+ */
+ public void cvsDispose()
+ {
+ cvsInitialized = false;
+ if (glj != null)
+ {
+ if (glj.gljIsInit())
+ {
+ /* Sometimes the Microsoft VM calls the
+ Applet.stop() method but doesn't have
+ permissions to do J/Direct calls, so
+ this whole block of code will throw a
+ security exception. If this happens,
+ however, windowClosing() will still
+ call us again later and we will have
+ another opportunity to shut down the
+ context, so it all works out fine. */
+ try
+ {
+ glj.gljFree();
+ doCleanup();
+ //locks and free's GLContext
+ glj.setEnabled(false);
+ glj.gljDestroy();
+ needCvsDispose = false;
+ }
+ catch (Exception ex)
+ {
+ needCvsDispose = true;
+ }
+ }
+ }
+
+ // Setting glj to null will simply cause paint() to re-initialize.
+ // We don't want that to happen, so we will leave glj non-null.
+ }
+
+ /**
+ * get methods
+ */
+ public final int cvsGetWidth() {
+ return getSize().width;
+ }
+ public final int cvsGetHeight() {
+ return getSize().height;
+ }
+}
+
diff --git a/demos/SwingDemos/test/GLPanel-GLGraphics/test1.java b/demos/SwingDemos/test/GLPanel-GLGraphics/test1.java
new file mode 100644
index 0000000..1b8bf4b
--- /dev/null
+++ b/demos/SwingDemos/test/GLPanel-GLGraphics/test1.java
@@ -0,0 +1,129 @@
+import java.applet.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.awt.Dimension;
+import javax.swing.*;
+import gl4java.*;
+import gl4java.swing.*;
+import gl4java.utils.glut.*;
+import gl4java.utils.glut.fonts.*;
+
+public class test1 extends JApplet
+ implements GLEnum, GLUEnum
+{
+ static {
+ if(GLContext.loadNativeLibraries(null, null, null)==false)
+ System.out.println("GLCanvas could not load def. native libs.");
+ }
+
+ protected class test1Panel extends GLPanel
+ implements ActionListener, ItemListener
+ {
+ public test1Panel() {
+ super();
+ GLContext.gljNativeDebug = true;
+ GLContext.gljClassDebug = true;
+ //String[] data = {"one", "two", "three", "four"};
+ //JList dataList = new JList(data);
+ //add("North", dataList);
+ JButton b1, b2;
+ add("East", (b1 = new JButton("E")));
+ b1.setActionCommand("east");
+ b1.addActionListener(this);
+ add("West", (b2 = new JButton("W")));
+ b2.setActionCommand("west");
+ b2.addActionListener(this);
+
+ JCheckBox c1;
+ add("South", (c1 = new JCheckBox("SouthButton", true)));
+ c1.addItemListener(this);
+ }
+
+ GLGraphics glg = null;
+
+ public void init() {
+ System.out.println("<i>");
+ //glg = new GLGraphics(gl, glu);
+ reshape(getSize().width, getSize().height);
+ }
+
+ public void display()
+ {
+ System.out.println("<p>");
+
+ int i;
+
+ glg = (GLGraphics)getGraphics();
+
+ gl.glPushMatrix();
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+
+ glg.setColor(Color.blue);
+
+ int width=getSize().width;
+ int height=getSize().height;
+
+ glg.drawLine ( 0, height/2, width, height/2 );
+ glg.drawLine ( width/2, 0, width/2, height );
+
+ glg.setColor(Color.yellow);
+
+ glg.drawLine ( 0, 0, width, height);
+ glg.drawString("Left-top", 0, 10);
+ glg.drawString("GLGraphics - CENTER", width/2, height/2);
+ glg.drawString("Right - Bottom (nearly)", width*2/3, height*2/3);
+ gl.glPopMatrix();
+
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int width, int height)
+ {
+ System.out.println("reshape("+width+", "+height+")");
+ super.reshape(width, height);
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ if (e.getActionCommand().equals("east")) {
+ System.out.println("East pressed");
+ } else if (e.getActionCommand().equals("west")) {
+ System.out.println("West pressed");
+ }
+ }
+
+ public void itemStateChanged(ItemEvent e) {
+ Object source = e.getItemSelectable();
+ System.out.println("item changed: "+source);
+ }
+
+ }
+
+ test1Panel tst1cvs1;
+
+ public void init()
+ {
+ tst1cvs1 = new test1Panel();
+ tst1cvs1.setSize(400,400);
+ setContentPane(tst1cvs1);
+ }
+
+ public static void main(java.lang.String[] args) {
+ try {
+ Frame mainFrame = new Frame("test1");
+
+ test1 applet=new test1();
+
+ applet.setSize(400, 400);
+ applet.init();
+ applet.start();
+
+ mainFrame.add(applet);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ } catch (Throwable exception) {
+ System.err.println("Exception occurred in main()");
+ exception.printStackTrace(System.out);
+ }
+ }
+}
diff --git a/demos/change2GL4JavaV2.sh b/demos/change2GL4JavaV2.sh
new file mode 100755
index 0000000..7998edb
--- /dev/null
+++ b/demos/change2GL4JavaV2.sh
@@ -0,0 +1,23 @@
+#! /bin/sh
+
+if [ -z $1 -a -z $2 ] ; then
+ echo usage: $0 input-file output-file
+ exit 0
+fi
+sed -e 's/gljGetFpsCounter/cvsGetFpsCounter/g' \
+ -e 's/gljResetFpsCounter/cvsResetFpsCounter/g' \
+ -e 's/gljGetWidth/cvsGetWidth/g' \
+ -e 's/gljGetHeight/cvsGetHeight/g' \
+ -e 's/gljDispose/cvsDispose/g' \
+ -e 's/gljUse()/gljMakeCurrent(true)/g' \
+ -e 's/glj/glj.glj/g' \
+ -e 's/gl[^a-z]/gl.&\1/g' \
+ -e 's/glut/glut.&\1/g' \
+ -e 's/glu/glu.&\1/g' \
+ -e 's/GLCanvasV2.gl.glClassDebug/GLContext.gljClassDebug/g' \
+ -e 's/GLCanvasV2.gl.glNativeDebug/GLContext.gljNativeDebug/g' \
+ -e 's/gl.glClassDebug/GLContext.gljClassDebug/g' \
+ -e 's/gl.glNativeDebug/GLContext.gljNativeDebug/g' \
+ -e 's/import GL4Java/import gl4java.awt/g' \
+ -e 's/GL4Java/gl4java/g' \
+ $1 > $2
diff --git a/demos/demoCvs.java b/demos/demoCvs.java
new file mode 100644
index 0000000..79b5c73
--- /dev/null
+++ b/demos/demoCvs.java
@@ -0,0 +1,57 @@
+/**
+ * @(#) demoCvs.java
+ */
+
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.Math;
+
+
+class demoCvs extends GLCanvas
+{
+/**
+ * Instead of using suspend (JAVA2)
+ *
+ * @see run
+ */
+ protected boolean threadSuspended = true;
+
+ public demoCvs (int w, int h,
+ String glClass, String gluClass )
+ {
+ super(w, h, glClass, gluClass );
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = true;
+ }
+
+ public void init()
+ {
+ }
+
+
+ public void display()
+ {
+ /* Standard GL4Java Init */
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void ReInit()
+ {
+ }
+
+}
+
diff --git a/demos/demoCvsAnim.java b/demos/demoCvsAnim.java
new file mode 100644
index 0000000..3dcc689
--- /dev/null
+++ b/demos/demoCvsAnim.java
@@ -0,0 +1,57 @@
+/**
+ * @(#) demoCvsAnim.java
+ */
+
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.Math;
+
+
+class demoCvsAnim extends GLAnimCanvas
+{
+/**
+ * Instead of using suspend (JAVA2)
+ *
+ * @see run
+ */
+ protected boolean threadSuspended = true;
+
+ public demoCvsAnim (int w, int h,
+ String glClass, String gluClass )
+ {
+ super(w, h, glClass, gluClass );
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = true;
+ }
+
+ public void init()
+ {
+ }
+
+
+ public void display()
+ {
+ /* Standard GL4Java Init */
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void ReInit()
+ {
+ }
+
+}
+
diff --git a/demos/gl4java.policy b/demos/gl4java.policy
new file mode 100644
index 0000000..0db24dc
--- /dev/null
+++ b/demos/gl4java.policy
@@ -0,0 +1,60 @@
+//
+// GL4Java extensions get all permissions !
+//
+// This peace should be added on top of the file:
+//
+// If a Java2 SDK is used:
+// <java2-installation>/jre/lib/security/java.policy
+//
+// If a Java2 JRE is used:
+// <jre-installation>/lib/security/java.policy
+//
+// GL4Java Homepage:
+//
+// http://www.jausoft.com/gl4java/
+//
+
+grant codeBase "http://www.jausoft.com/Files/Java/1.1.X/GL4Java/Installer/*"
+{
+ permission java.security.AllPermission;
+};
+
+grant codeBase "http://www.jausoft.com/Files/Java/1.1.X/GL4Java/demos/*"
+{
+ permission java.security.AllPermission;
+};
+
+grant codeBase "http://www.jausoft.com/Files/Java/1.1.X/GL4Java/demos/MiscDemos/*
+{
+ permission java.security.AllPermission;
+};
+
+grant codeBase "http://www.jausoft.com/Files/Java/1.1.X/GL4Java/demos/RonsDemos/*
+{
+ permission java.security.AllPermission;
+};
+
+grant codeBase "http://www.jausoft.com/Files/Java/1.1.X/GL4Java/demos/SwingDemos/*
+{
+ permission java.security.AllPermission;
+};
+
+grant codeBase "http://www.jausoft.com/Files/Java/1.1.X/GL4Java/demos/GLLandScape/*
+{
+ permission java.security.AllPermission;
+};
+
+grant codeBase "http://www.jausoft.com/Files/Java/1.1.X/GL4Java/demos/HodglimsNeHe/*
+{
+ permission java.security.AllPermission;
+};
+
+
+grant codeBase "file:/home/sven/projects/java/GL4Java/demos/- {
+ permission java.security.AllPermission;
+};
+
+grant codeBase "file:/home/sven/projects/java/GL4Java/demos/RonsDemos/- {
+ permission java.security.AllPermission;
+};
+
diff --git a/demos/glDemosCvs.html b/demos/glDemosCvs.html
new file mode 100644
index 0000000..535e9da
--- /dev/null
+++ b/demos/glDemosCvs.html
@@ -0,0 +1,14 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<applet code="glDemosCvs.class" width=500 height=550>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/glDemosCvs.java b/demos/glDemosCvs.java
new file mode 100644
index 0000000..6902b95
--- /dev/null
+++ b/demos/glDemosCvs.java
@@ -0,0 +1,620 @@
+
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import java.awt.*;
+import java.awt.event.*;
+import java.applet.*;
+
+public class glDemosCvs extends Applet
+ implements MouseListener, WindowListener, ActionListener, ItemListener
+{
+ /*
+ * show how independent the
+ * canvas and the frame are :-)
+ *
+ * the canvas size is toggled from: (150,150)->(250,250)
+ * the frame size is toggled from: (350,350)->(450,450)
+ *
+ */
+
+ Button ButtonFps;
+ TextField TextFpsOlymp;
+ TextField TextFpsLogo;
+ TextField TextFpsWave;
+ TextField TextFpsStar;
+
+ Button buttonInfo = null;
+
+ Checkbox bUseRepaintW = null;
+ Checkbox bUseFpsSleepW = null;
+ Button bReStartW = null;
+ Checkbox bUseRepaintO = null;
+ Checkbox bUseFpsSleepO = null;
+ Button bReStartO = null;
+ Checkbox bUseRepaintL = null;
+ Checkbox bUseFpsSleepL = null;
+ Button bReStartL = null;
+ Checkbox bUseRepaintS = null;
+ Checkbox bUseFpsSleepS = null;
+ Button bReStartS = null;
+
+ String glClass=null;
+ String gluClass=null;
+
+ olympicCvs cvsOlympic = null;
+ waveCvs cvsWave = null;
+ glLogoCvs cvsLogo = null;
+ starCvs cvsStar = null;
+
+ Frame frame = null;
+
+ public void applicationInit(Frame holder)
+ {
+ frame = holder;
+
+ init();
+ start();
+ }
+
+ public void init()
+ {
+ System.out.println("Applet init ...");
+
+ Panel pTmp = null;
+
+ setLayout(new BorderLayout());
+
+ // 1. GetFps
+ ButtonFps=new Button("Get Fps");
+ ButtonFps.addMouseListener(this);
+ add("North", ButtonFps);
+
+ // 4. Info
+ buttonInfo=new Button("Info");
+ buttonInfo.addMouseListener(this);
+ add("South", buttonInfo);
+
+ // Master-Grid-Panel pAllCvs
+ //
+ // 2 rows
+ // 1. Wave
+ // 2. Olympic
+ // 3. Logo
+ // 4. Star
+ //
+ Panel pAllCvs = new Panel();
+ pAllCvs.setLayout(new GridLayout(4,1));
+ add("Center", pAllCvs);
+
+ // 1. Wave
+ Panel pWave = new Panel();
+ pWave.setLayout(new GridLayout(1,2));
+ pAllCvs.add(pWave);
+
+ // 2. Olympic
+ Panel pOlympic = new Panel();
+ pOlympic.setLayout(new GridLayout(1,2));
+ pAllCvs.add(pOlympic);
+
+ // 3. Logo
+ Panel pLogo = new Panel();
+ pLogo.setLayout(new GridLayout(1,2));
+ pAllCvs.add(pLogo);
+
+ // 3. Star
+ Panel pStar = new Panel();
+ pStar.setLayout(new GridLayout(1,2));
+ pAllCvs.add(pStar);
+
+ // Wave-Grid-Panel pWave
+ //
+ // 3 coloumns
+ //
+ // 1. waveCvs
+ // 2. options
+ //
+
+ // 1. waveCvs
+ cvsWave = new waveCvs(150, 150, glClass, gluClass);
+ pWave.add(cvsWave);
+ cvsWave.addMouseListener(this);
+
+ // 2. options
+ Panel pWaveOpt = new Panel();
+ pWaveOpt.setLayout(new GridLayout(4,1));
+ pWave.add(pWaveOpt);
+ bUseRepaintW = new Checkbox("repaint", true);
+ bUseRepaintW.addItemListener(this);
+ pWaveOpt.add(bUseRepaintW);
+ bUseFpsSleepW = new Checkbox("fps-sleep", true);
+ bUseFpsSleepW.addItemListener(this);
+ pWaveOpt.add(bUseFpsSleepW);
+ pTmp = new Panel();
+ pTmp.setLayout(new GridLayout(1,2));
+ pTmp.add(new Label("fps: "));
+ TextFpsWave=new TextField();
+ TextFpsWave.addActionListener(this);
+ pTmp.add(TextFpsWave);
+ pWaveOpt.add(pTmp);
+ bReStartW = new Button("restart");
+ bReStartW.addMouseListener(this);
+ pWaveOpt.add(bReStartW);
+
+ // Olympic-Grid-Panel pOlympic
+ //
+ // 3 coloumns
+ //
+ // 1. olympicCvs
+ // 2. options
+ //
+
+ // 1. olympicCvs
+ cvsOlympic = new olympicCvs(150, 150, glClass, gluClass);
+ pOlympic.add(cvsOlympic);
+ cvsOlympic.addMouseListener(this);
+
+ // 2. options
+ Panel pOlympOpt = new Panel();
+ pOlympOpt.setLayout(new GridLayout(4,1));
+ pOlympic.add(pOlympOpt);
+ bUseRepaintO = new Checkbox("repaint", true);
+ bUseRepaintO.addItemListener(this);
+ pOlympOpt.add(bUseRepaintO);
+ bUseFpsSleepO = new Checkbox("fps-sleep", true);
+ bUseFpsSleepO.addItemListener(this);
+ pOlympOpt.add(bUseFpsSleepO);
+ pTmp = new Panel();
+ pTmp.setLayout(new GridLayout(1,2));
+ pTmp.add(new Label("fps: "));
+ TextFpsOlymp=new TextField();
+ TextFpsOlymp.addActionListener(this);
+ pTmp.add(TextFpsOlymp);
+ pOlympOpt.add(pTmp);
+ bReStartO = new Button("restart");
+ bReStartO.addMouseListener(this);
+ pOlympOpt.add(bReStartO);
+
+
+ // Logo-Grid-Panel pLogo
+ //
+ // 3 coloumns
+ //
+ // 1. logoCvs
+ // 2. options
+ //
+
+ // 1. logoCvs
+ cvsLogo = new glLogoCvs(150, 150, glClass, gluClass);
+ pLogo.add(cvsLogo);
+ cvsLogo.addMouseListener(this);
+
+ // 2. options
+ Panel pLogoOpt = new Panel();
+ pLogoOpt.setLayout(new GridLayout(4,1));
+ pLogo.add(pLogoOpt);
+ bUseRepaintL = new Checkbox("repaint", true);
+ bUseRepaintL.addItemListener(this);
+ pLogoOpt.add(bUseRepaintL);
+ bUseFpsSleepL = new Checkbox("fps-sleep", true);
+ bUseFpsSleepL.addItemListener(this);
+ pLogoOpt.add(bUseFpsSleepL);
+ pTmp = new Panel();
+ pTmp.setLayout(new GridLayout(1,2));
+ pTmp.add(new Label("fps: "));
+ TextFpsLogo=new TextField();
+ TextFpsLogo.addActionListener(this);
+ pTmp.add(TextFpsLogo);
+ pLogoOpt.add(pTmp);
+ bReStartL = new Button("ReStart");
+ bReStartL.addMouseListener(this);
+ pLogoOpt.add(bReStartL);
+
+ // Star-Grid-Panel pWave
+ //
+ // 3 coloumns
+ //
+ // 1. starCvs
+ // 2. options
+ //
+
+ // 1. starCvs
+ cvsStar = new starCvs(150, 150, glClass, gluClass);
+ pStar.add(cvsStar);
+ cvsStar.addMouseListener(this);
+
+ // 2. options
+ Panel pStarOpt = new Panel();
+ pStarOpt.setLayout(new GridLayout(4,1));
+ pStar.add(pStarOpt);
+ bUseRepaintS = new Checkbox("repaint", true);
+ bUseRepaintS.addItemListener(this);
+ pStarOpt.add(bUseRepaintS);
+ bUseFpsSleepS = new Checkbox("fps-sleep", true);
+ bUseFpsSleepS.addItemListener(this);
+ pStarOpt.add(bUseFpsSleepS);
+ pTmp = new Panel();
+ pTmp.setLayout(new GridLayout(1,2));
+ pTmp.add(new Label("fps: "));
+ TextFpsStar=new TextField();
+ TextFpsStar.addActionListener(this);
+ pTmp.add(TextFpsStar);
+ pStarOpt.add(pTmp);
+ bReStartS = new Button("restart");
+ bReStartS.addMouseListener(this);
+ pStarOpt.add(bReStartS);
+
+ System.out.println("Applet init DONE ! ");
+ }
+
+ public void start() {
+ cvsOlympic.start();
+ cvsWave.start();
+ cvsLogo.start();
+ cvsStar.start();
+ }
+
+ public void stop() {
+ cvsOlympic.stop();
+ cvsWave.stop();
+ cvsLogo.stop();
+ cvsStar.stop();
+ }
+
+ public void destroy() {
+ cvsOlympic.stop();
+ cvsOlympic.cvsDispose();
+ cvsWave.stop();
+ cvsWave.cvsDispose();
+ cvsLogo.stop();
+ cvsLogo.cvsDispose();
+ cvsStar.stop();
+ cvsStar.cvsDispose();
+ }
+
+ public static void main( String args[] ) {
+ String gljLib=null;
+ String glLib=null;
+ String gluLib=null;
+
+ if(args.length>0)
+ gljLib = args[0];
+ if(args.length>1)
+ glLib = args[1];
+ if(args.length>2)
+ gluLib = args[2];
+
+ GLContext.gljNativeDebug = true;
+ GLContext.gljClassDebug = true;
+
+ if(GLContext.loadNativeLibraries(gljLib, glLib, gluLib)==false)
+ System.out.println("could not load native libs:"+
+ gljLib + ", " + glLib + ", " + gluLib);
+ else
+ System.out.println("load native libs:"+
+ gljLib + ", " + glLib + ", " + gluLib);
+
+ Frame mainFrame = new Frame("glDemosCvs");
+
+ glDemosCvs applet = new glDemosCvs();
+ applet.applicationInit(mainFrame);
+
+ mainFrame.add(applet);
+
+ if(args.length>3)
+ applet.glClass = args[3];
+ if(args.length>4)
+ applet.gluClass = args[4];
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+
+ mainFrame.addWindowListener(applet);
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+
+ if( comp.equals(ButtonFps) )
+ {
+ double fps = 0;
+ int a1;
+
+ if(cvsWave!=null && TextFpsWave!=null)
+ {
+ cvsWave.stopFpsCounter();
+ fps=cvsWave.getFps();
+ a1=(int)(fps*100.0);
+ fps=(double)a1/100.0;
+ TextFpsWave.setText(String.valueOf(fps));
+ }
+ if(cvsOlympic!=null && TextFpsOlymp!=null)
+ {
+ cvsOlympic.stopFpsCounter();
+ fps=cvsOlympic.getFps();
+ a1=(int)(fps*100.0);
+ fps=(double)a1/100.0;
+ TextFpsOlymp.setText(String.valueOf(fps));
+ }
+ if(cvsLogo!=null && TextFpsLogo!=null)
+ {
+ cvsLogo.stopFpsCounter();
+ fps=cvsLogo.getFps();
+ a1=(int)(fps*100.0);
+ fps=(double)a1/100.0;
+ TextFpsLogo.setText(String.valueOf(fps));
+ }
+ if(cvsStar!=null && TextFpsStar!=null)
+ {
+ cvsStar.stopFpsCounter();
+ fps=cvsStar.getFps();
+ a1=(int)(fps*100.0);
+ fps=(double)a1/100.0;
+ TextFpsStar.setText(String.valueOf(fps));
+ }
+ }
+ else if( comp.equals(buttonInfo) )
+ {
+ Frame fInfo = null;
+ if(cvsWave!=null && cvsWave.getGLContext()!=null)
+ fInfo = cvsWave.getGLContext().gljShowVersions();
+ else if(cvsOlympic!=null && cvsOlympic.getGLContext()!=null)
+ fInfo = cvsOlympic.getGLContext().gljShowVersions();
+ else if(cvsLogo!=null && cvsLogo.getGLContext()!=null)
+ fInfo = cvsLogo.getGLContext().gljShowVersions();
+ else if(cvsStar!=null && cvsStar.getGLContext()!=null)
+ fInfo = cvsStar.getGLContext().gljShowVersions();
+ }
+ else if( comp.equals(cvsWave) )
+ {
+ cvsWave.setSuspended(!cvsWave.isSuspended(),
+ evt.getClickCount()>1 // -> ReInit
+ );
+ }
+ else if( comp.equals(cvsOlympic) )
+ {
+ cvsOlympic.setSuspended(!cvsOlympic.isSuspended(),
+ evt.getClickCount()>1 // -> ReInit
+ );
+ }
+ else if( comp.equals(cvsLogo) )
+ {
+ cvsLogo.setSuspended(!cvsLogo.isSuspended(),
+ evt.getClickCount()>1 // -> ReInit
+ );
+ }
+ else if( comp.equals(cvsStar) )
+ {
+ cvsStar.setSuspended(!cvsStar.isSuspended(),
+ evt.getClickCount()>1 // -> ReInit
+ );
+ }
+ if( comp.equals(bReStartL) )
+ {
+ if(cvsLogo!=null)
+ {
+ cvsLogo.setSuspended(false, true);
+ }
+ }
+ if( comp.equals(bReStartO) )
+ {
+ if(cvsOlympic!=null)
+ {
+ cvsOlympic.setSuspended(false, true);
+ }
+ }
+ if( comp.equals(bReStartW) )
+ {
+ if(cvsWave!=null)
+ {
+ cvsWave.setSuspended(false, true);
+ }
+ }
+ if( comp.equals(bReStartS) )
+ {
+ if(cvsStar!=null)
+ {
+ cvsStar.setSuspended(false, true);
+ }
+ }
+ }
+
+ public void itemStateChanged( ItemEvent evt )
+ {
+ ItemSelectable comp = evt.getItemSelectable();
+
+ if( comp.equals(bUseRepaintW ) )
+ {
+ if(cvsWave!=null)
+ {
+ cvsWave.setUseRepaint(bUseRepaintW.getState());
+ System.out.println("Wave uses repaint: "+
+ bUseRepaintW.getState());
+ }
+ }
+ if( comp.equals(bUseFpsSleepW ) )
+ {
+ if(cvsWave!=null)
+ {
+ cvsWave.setUseFpsSleep(bUseFpsSleepW.getState());
+ System.out.println("Wave uses fps-sleep: "+
+ bUseFpsSleepW.getState());
+ }
+ }
+ if( comp.equals(bUseRepaintO ) )
+ {
+ if(cvsOlympic!=null)
+ {
+ cvsOlympic.setUseRepaint(bUseRepaintO.getState());
+ System.out.println("Olympic uses repaint: "+
+ bUseRepaintO.getState());
+ }
+ }
+ if( comp.equals(bUseFpsSleepO ) )
+ {
+ if(cvsOlympic!=null)
+ {
+ cvsOlympic.setUseFpsSleep(bUseFpsSleepO.getState());
+ System.out.println("Olympic uses fps-sleep: "+
+ bUseFpsSleepO.getState());
+ }
+ }
+ else if( comp.equals(bUseRepaintL ) )
+ {
+ if(cvsLogo!=null)
+ {
+ cvsLogo.setUseRepaint(bUseRepaintL.getState());
+ System.out.println("Logo uses repaint: "+
+ bUseRepaintL.getState());
+ }
+ }
+ else if( comp.equals(bUseFpsSleepL ) )
+ {
+ if(cvsLogo!=null)
+ {
+ cvsLogo.setUseFpsSleep(bUseFpsSleepL.getState());
+ System.out.println("Logo uses fps-sleep: "+
+ bUseFpsSleepL.getState());
+ }
+ }
+ else if( comp.equals(bUseRepaintS ) )
+ {
+ if(cvsStar!=null)
+ {
+ cvsStar.setUseRepaint(bUseRepaintS.getState());
+ System.out.println("Star uses repaint: "+
+ bUseRepaintS.getState());
+ }
+ }
+ else if( comp.equals(bUseFpsSleepS ) )
+ {
+ if(cvsStar!=null)
+ {
+ cvsStar.setUseFpsSleep(bUseFpsSleepS.getState());
+ System.out.println("Star uses fps-sleep: "+
+ bUseFpsSleepS.getState());
+ }
+ }
+ }
+
+ public void windowOpened(WindowEvent e)
+ {
+ }
+
+ public void windowClosing(WindowEvent e)
+ {
+ if(frame!=null && e.getComponent().equals(frame))
+ {
+ if(frame!=null) frame.dispose();
+ cvsLogo.cvsDispose();
+ cvsOlympic.cvsDispose();
+ cvsWave.cvsDispose();
+ cvsStar.cvsDispose();
+ System.exit(0);
+ }
+ }
+
+ public void windowClosed(WindowEvent e)
+ {
+ }
+
+ public void windowIconified(WindowEvent e)
+ {
+ }
+
+ public void windowDeiconified(WindowEvent e)
+ {
+ }
+
+ public void windowActivated(WindowEvent e)
+ {
+ }
+
+ public void windowDeactivated(WindowEvent e)
+ {
+ }
+
+ public void actionPerformed(ActionEvent event)
+ {
+ Object source = event.getSource();
+
+ if ( source == TextFpsWave )
+ {
+ try {
+ double FramesPerSec=
+ Double.valueOf(TextFpsWave.getText()).doubleValue();
+ if(cvsWave!=null)
+ {
+ cvsWave.setAnimateFps(FramesPerSec);
+ cvsWave.setSuspended(false, true);
+ }
+ } catch (NumberFormatException s) {
+ System.out.println("wrong fps format, use float ..");
+ }
+
+ }
+ if ( source == TextFpsOlymp )
+ {
+ try {
+ double FramesPerSec=
+ Double.valueOf(TextFpsOlymp.getText()).doubleValue();
+ if(cvsOlympic!=null)
+ {
+ cvsOlympic.setAnimateFps(FramesPerSec);
+ cvsOlympic.setSuspended(false, true);
+ }
+ } catch (NumberFormatException s) {
+ System.out.println("wrong fps format, use float ..");
+ }
+
+ }
+ if ( source == TextFpsLogo )
+ {
+ try {
+ double FramesPerSec=
+ Double.valueOf(TextFpsLogo.getText()).doubleValue();
+ if(cvsLogo!=null)
+ {
+ cvsLogo.setAnimateFps(FramesPerSec);
+ cvsLogo.setSuspended(false, true);
+ }
+ } catch (NumberFormatException s) {
+ System.out.println("wrong fps format, use float ..");
+ }
+
+ }
+ if ( source == TextFpsStar )
+ {
+ try {
+ double FramesPerSec=
+ Double.valueOf(TextFpsStar.getText()).doubleValue();
+ if(cvsLogo!=null)
+ {
+ cvsStar.setAnimateFps(FramesPerSec);
+ cvsStar.setSuspended(false, true);
+ }
+ } catch (NumberFormatException s) {
+ System.out.println("wrong fps format, use float ..");
+ }
+
+ }
+ }
+
+}
diff --git a/demos/glLogoCvs.java b/demos/glLogoCvs.java
new file mode 100644
index 0000000..e287406
--- /dev/null
+++ b/demos/glLogoCvs.java
@@ -0,0 +1,765 @@
+/**
+ * @(#) dummyGLCvs.java
+ */
+
+import gl4java.awt.GLAnimCanvas;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.Math;
+
+class glLogoCvs extends GLAnimCanvas
+{
+
+ static final int RAND_MAX = 100;
+
+ /* some math.h's don't define M_PI */
+ static final float M_PI = 3.14159265359f;
+
+ static final int ACC = 8;
+ static final int ACC2 = 16;
+ static final int ACC3 = 48;
+ static final int ACC4 = 24;
+ static final float THLD = 0.6f;
+ static final float THLD2 = 0.8f;
+
+ int angle, rotating;
+
+ float TRANS[][];
+ float ROTAXIS[][];
+ float ROT[];
+
+ float char_El[][][];
+ float normal_El[][][];
+
+ float char_O[][][];
+ float normal_O[][][];
+
+ float char_P[][][];
+ float normal_P[][][];
+
+ float char_G[][][];
+ float normal_G[][][];
+
+ float accSIN[], accCOS[];
+
+ float difmat4[] = { 0.425f, 0.570f, 0.664f, 1.0f };
+ float difamb4[] = { 0.425f, 0.570f, 0.664f, 1.0f };
+ float matspec4[] = { 0.174f, 0.174f, 0.174f, 1.0f };
+
+ float lightpos[] = { 1.0f, 1.0f, 1.0f, 0.0f };
+ float lightamb[] = { 0.3f, 0.3f, 0.3f, 1.0f };
+ float lightdif[] = { 0.8f, 0.8f, 0.8f, 1.0f };
+ float speed=0f, progress = 1f;
+
+ public glLogoCvs (int w, int h,
+ String glClass, String gluClass )
+ {
+ super(w, h, glClass, gluClass );
+ }
+
+ public void init()
+ {
+ /* here we should add and initialize our JAVA components */
+ TRANS = new float[7][3];
+ ROTAXIS = new float[7][3];
+ ROT = new float[7];
+
+ char_El=new float[ACC3+1][ACC+1][3];
+ normal_El=new float[ACC3+1][ACC+1][3];
+
+ char_O=new float[ACC4][ACC+1][3];
+ normal_O=new float[ACC4][ACC+1][3];
+
+ char_P=new float[ACC2][ACC+1][3];
+ normal_P=new float[ACC2][ACC+1][3];
+
+ char_G=new float[ACC4][ACC+1][3];
+ normal_G=new float[ACC4][ACC+1][3];
+
+ accSIN=new float[ACC+1];
+ accCOS=new float[ACC+1];
+
+ randomize();
+
+ gl.glShadeModel (GL_SMOOTH);
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, lightamb);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, lightdif);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glColor3f(1.0f, 1.0f, 1.0f);
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+ gl.glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ gl.glEnable(GL_NORMALIZE);
+ def_logo();
+ gl.glCullFace(GL_BACK);
+ gl.glEnable(GL_CULL_FACE);
+ /* . and furthet OpenGL init's - like you want to */
+ glj.gljCheckGL();
+ }
+
+ public void display()
+ {
+ int i;
+
+ /* Standard GL4Java Init */
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ // just render it
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ SetCamera();
+ draw_logo();
+
+ /* For your animation dutys ;-) */
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ animationCalc();
+ }
+
+ public void reshape(int width, int height)
+ {
+ gl.glMatrixMode (GL_MODELVIEW);
+ gl.glViewport (0, 0, width, height);
+ gl.glLoadIdentity();
+ SetCamera();
+ }
+
+
+ void SetCamera()
+ {
+ gl.glMatrixMode (GL_PROJECTION);
+ gl.glLoadIdentity ();
+ gl.glFrustum (-0.1333f, 0.1333f, -0.1f, 0.1f, 0.2f, 150.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ glu.gluLookAt(0,1.5f,2, 0,1.5f,0, 0,1,0);
+ gl.glTranslatef(0.0f, -8.0f, -45.0f);
+ gl.glRotatef(-progress*720f, 0.0f, 1.0f, 0.0f);
+ }
+
+ public void animationCalc()
+ {
+ //
+ // computation for an animation sequence ...
+ //
+ speed = -0.95f*speed + progress*0.05f;
+ if (progress > 0.0f && speed < 0.0003f)
+ speed = 0.0003f;
+ if (speed > 0.01f)
+ speed = 0.01f;
+ progress = progress - speed;
+
+ // may be we just render a sequence,
+ // so we can set �shallWeRender� to false ...
+ if (progress <= 0.0005)
+ {
+ progress = 0.0f;
+ speed = 0;
+ shallWeRender=false;
+ }
+ }
+
+ public void ReInit()
+ {
+ progress=1f;
+ randomize();
+ }
+
+ int rnd(int i)
+ {
+ return ( (int)((float)Math.random()*RAND_MAX) )%i;
+ }
+
+ void groen_texture()
+ {
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, difmat4);
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, difamb4);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, matspec4);
+ gl.glMaterialf(GL_FRONT, GL_SHININESS, 35.0f);
+ }
+
+ void def_O()
+ {
+ float a, s, c, ln;
+ int i,j,k,l,m,n;
+ float dx, dy;
+ float dx1, dx2, dy1, dy2, dz1, dz2;
+ float center_O[][];
+ float width_O[];
+
+ center_O=new float[ACC4+4][3];
+ width_O=new float[ACC4+4];
+
+ for (i=0;i<ACC4;i++)
+ {
+ a = 2.0f*((float) i)*M_PI/ACC4;
+ s = 1+(float)Math.sin(a);
+ c = (float)Math.cos(a);
+ center_O[i][0] = c*3.8f;
+ center_O[i][1] = s*3.8f+(s<-1.01f?-0.8f:(s>1.01f?0.8f:0)) + 0.8f;
+ center_O[i][2] = 0.0f;
+ width_O[i] = 0.6f;
+ }
+
+ /* I should be able to generalise this. oh well */
+ for (i=0;i<ACC4;i++)
+ {
+ j = (i+1)%ACC4;
+ k = (i+ACC4-1)%ACC4;
+ for (a=0;a<ACC;a++)
+ {
+ c = (float)Math.cos(a*M_PI*2.0f/ACC);
+ s = (float)Math.sin(a*M_PI*2.0f/ACC);
+ dx = center_O[j][0] - center_O[k][0];
+ dy = center_O[j][1] - center_O[k][1];
+ ln = (float)Math.sqrt(dx*dx+dy*dy);
+ dx = dx/ln;
+ dy = dy/ln;
+ char_O[i][(int) a][0] = center_O[i][0] + width_O[i] * dy * c;
+ char_O[i][(int) a][1] = center_O[i][1] - width_O[i] * dx * c;
+ char_O[i][(int) a][2] = (s<-THLD?-THLD:(s>THLD?THLD:s));
+ }
+ }
+ for (i=0;i<ACC;i++)
+ {
+ j = (i+1)%ACC;
+ k = (i-1+ACC)%ACC;
+ for (l=0;l<ACC4;l++)
+ {
+ m = (l+1)%ACC4;
+ n = (l+ACC4-1)%ACC4;
+ dx1 = char_O[m][i][0] - char_O[n][i][0];
+ dy1 = char_O[m][i][1] - char_O[n][i][1];
+ dz1 = char_O[m][i][2] - char_O[n][i][2];
+ dx2 = char_O[l][k][0] - char_O[l][j][0];
+ dy2 = char_O[l][k][1] - char_O[l][j][1];
+ dz2 = char_O[l][k][2] - char_O[l][j][2];
+ normal_O[l][i][0] = dy2*dz1 - dy1*dz2;
+ normal_O[l][i][1] = dz2*dx1 - dz1*dx2;
+ normal_O[l][i][2] = dx2*dy1 - dx1*dy2;
+ }
+ }
+ }
+
+ void def_P()
+ {
+ float a, s, c, ln;
+ int i,j,k,l,m,n;
+ float dx, dy;
+ float dx1, dx2, dy1, dy2, dz1, dz2;
+ float center_P[][];
+ float width_P[];
+
+ center_P=new float[ACC2][3];
+ width_P=new float[ACC2];
+
+
+ for (i=0;i<ACC2;i++)
+ {
+ a = 2.0f*((float) i)*M_PI/ACC2;
+ s = 1+(float)Math.sin(a);
+ c = (float)Math.cos(a);
+ center_P[i][0] = c*2.15f;
+ center_P[i][1] = s*2.1f + (s<-1.01f?-0.7f:(s>1.01f?0.7f:0)) + 0.7f;
+ center_P[i][2] = 0.0f;
+ width_P[i] = 0.5f;
+ }
+
+ for (i=0;i<ACC2;i++)
+ {
+ j = (i+1)%ACC2;
+ k = (i+ACC2-1)%ACC2;
+ for (a=0;a<ACC;a++)
+ {
+ accCOS[(int) a] = c = (float)Math.cos(a*M_PI*2.0f/ACC);
+ accSIN[(int) a] = s = (float)Math.sin(a*M_PI*2.0f/ACC);
+ dx = center_P[j][0] - center_P[k][0];
+ dy = center_P[j][1] - center_P[k][1];
+ ln = (float)Math.sqrt(dx*dx+dy*dy);
+ dx = dx/ln;
+ dy = dy/ln;
+ char_P[i][(int) a][0] = center_P[i][0] + width_P[i] * dy * c;
+ char_P[i][(int) a][1] = center_P[i][1] - width_P[i] * dx * c;
+ char_P[i][(int) a][2] = (s<-THLD?-THLD:(s>THLD?THLD:s));
+ }
+ }
+ for (i=0;i<ACC;i++)
+ {
+ j = (i+1)%ACC;
+ k = (i-1+ACC)%ACC;
+ for (l=0;l<ACC2;l++)
+ {
+ m = (l+1)%ACC2;
+ n = (l+ACC2-1)%ACC2;
+ dx1 = char_P[m][i][0] - char_P[n][i][0];
+ dy1 = char_P[m][i][1] - char_P[n][i][1];
+ dz1 = char_P[m][i][2] - char_P[n][i][2];
+ dx2 = char_P[l][k][0] - char_P[l][j][0];
+ dy2 = char_P[l][k][1] - char_P[l][j][1];
+ dz2 = char_P[l][k][2] - char_P[l][j][2];
+ normal_P[l][i][0] = dy2*dz1 - dy1*dz2;
+ normal_P[l][i][1] = dz2*dx1 - dz1*dx2;
+ normal_P[l][i][2] = dx2*dy1 - dx1*dy2;
+ }
+ }
+ }
+
+ void def_El()
+ {
+ float a, s, c, ln;
+ int i,j,k,l,m,n;
+ float dx, dy;
+ float dx1, dx2, dy1, dy2, dz1, dz2;
+ float center_El[][];
+ float width_El[];
+
+ center_El=new float[ACC3+3][3];
+ width_El=new float[ACC3+3];
+
+ for (i=0;i<ACC3+1;i++)
+ {
+ /* a = (ACC3/24 + i*11/12)*M_PI*2.0f/ACC3; */
+ a = (ACC3/8 + ((float) i)*3/4)*M_PI*2.0f/ACC3;
+ s = 1+(float)Math.sin(a);
+ c = (float)Math.cos(a);
+ center_El[i][0] = c*18.0f;
+ center_El[i][1] = s*9.3f;
+ center_El[i][2] = 0.0f;
+ width_El[i] = (float)Math.pow(3.5, Math.sin(i*M_PI/ACC3))-0.6f;
+ }
+
+ for (i=0;i<ACC3+1;i++)
+ {
+ j = (i+1)%ACC3;
+ k = (i+ACC3-1)%ACC3;
+ for (a=0;a<ACC;a++)
+ {
+ c = (float)Math.cos(a*M_PI*2.0f/ACC);
+ s = (float)Math.sin(a*M_PI*2.0f/ACC);
+ dx = center_El[j][0] - center_El[k][0];
+ dy = center_El[j][1] - center_El[k][1];
+ ln = (float)Math.sqrt(dx*dx+dy*dy);
+ dx = dx/ln;
+ dy = dy/ln;
+ char_El[i][(int) a][0] = center_El[i][0] + width_El[i] * dy * c;
+ char_El[i][(int) a][1] = center_El[i][1] - width_El[i] * dx * c;
+ char_El[i][(int) a][2] = (s<-THLD2?-THLD2:(s>THLD2?THLD2:s));
+ }
+ }
+ for (i=0;i<ACC+1;i++)
+ {
+ j = (i+1)%ACC;
+ k = (i-1+ACC)%ACC;
+ for (l=0;l<ACC3;l++)
+ {
+ m = (l+1)%ACC3;
+ n = (l+ACC3-1)%ACC3;
+ dx1 = char_El[m][i][0] - char_El[n][i][0];
+ dy1 = char_El[m][i][1] - char_El[n][i][1];
+ dz1 = char_El[m][i][2] - char_El[n][i][2];
+ dx2 = char_El[l][k][0] - char_El[l][j][0];
+ dy2 = char_El[l][k][1] - char_El[l][j][1];
+ dz2 = char_El[l][k][2] - char_El[l][j][2];
+ normal_El[l][i][0] = dy2*dz1 - dy1*dz2;
+ normal_El[l][i][1] = dz2*dx1 - dz1*dx2;
+ normal_El[l][i][2] = dx2*dy1 - dx1*dy2;
+ }
+ }
+ }
+
+ void def_G()
+ {
+ float a, s, c, ln;
+ int i,j,k,l,m,n;
+ float dx, dy;
+ float dx1, dx2, dy1, dy2, dz1, dz2;
+ float center_G[][];
+ float width_G[];
+
+ center_G=new float[ACC4][3];
+ width_G=new float[ACC4];
+
+ for (i=0;i<ACC4;i++)
+ {
+ a = 2.0f*((float) i)*M_PI/ACC4;
+ s = 1+(float)Math.sin(a);
+ c = (float)Math.cos(a);
+ center_G[i][0] = c*3.8f;
+ center_G[i][1] = s*3.8f+(s<-1.01f?-0.8f:(s>1.01f?0.8f:0)) + 0.8f;
+ center_G[i][2] = 0.0f;
+ width_G[i] = 0.9f;
+ if (i>ACC4*3/4)
+ width_G[i] = 0.9f - ((i-ACC4*3/4)*0.9f)/ACC;
+ }
+ for (i=0;i<ACC4;i++)
+ {
+ j = (i+1)%ACC4;
+ k = (i+ACC4-1)%ACC4;
+ for (a=0;a<ACC;a++)
+ {
+ c = (float)Math.cos(a*M_PI*2.0f/ACC);
+ s = (float)Math.sin(a*M_PI*2.0f/ACC);
+ dx = center_G[j][0] - center_G[k][0];
+ dy = center_G[j][1] - center_G[k][1];
+ ln = (float)Math.sqrt(dx*dx+dy*dy);
+ dx = dx/ln;
+ dy = dy/ln;
+ char_G[i][(int) a][0] = center_G[i][0] + width_G[i] * dy * c;
+ char_G[i][(int) a][1] = center_G[i][1] - width_G[i] * dx * c;
+ char_G[i][(int) a][2] = (s<-THLD?-THLD:(s>THLD?THLD:s));
+ }
+ }
+ for (i=0;i<ACC;i++)
+ {
+ j = (i+1)%ACC;
+ k = (i-1+ACC)%ACC;
+ for (l=0;l<ACC4;l++)
+ {
+ m = (l+1)%ACC4;
+ n = (l+ACC4-1)%ACC4;
+ dx1 = char_G[m][i][0] - char_G[n][i][0];
+ dy1 = char_G[m][i][1] - char_G[n][i][1];
+ dz1 = char_G[m][i][2] - char_G[n][i][2];
+ dx2 = char_G[l][k][0] - char_G[l][j][0];
+ dy2 = char_G[l][k][1] - char_G[l][j][1];
+ dz2 = char_G[l][k][2] - char_G[l][j][2];
+ normal_G[l][i][0] = dy2*dz1 - dy1*dz2;
+ normal_G[l][i][1] = dz2*dx1 - dz1*dx2;
+ normal_G[l][i][2] = dx2*dy1 - dx1*dy2;
+ }
+ }
+ }
+
+ void randomize()
+ {
+ int i;
+ for (i=0;i<7;i++)
+ {
+ TRANS[i][0] = rnd(100)-rnd(100);
+ TRANS[i][1] = rnd(100)-rnd(100);
+ TRANS[i][1] = rnd(100)-rnd(100);
+ ROTAXIS[i][0] = rnd(100)-rnd(100);
+ ROTAXIS[i][1] = rnd(100)-rnd(100);
+ ROTAXIS[i][1] = rnd(100)-rnd(100);
+ ROT[i]=rnd(3600)-rnd(3600);
+ }
+ }
+
+ void def_logo()
+ {
+ def_O();
+ def_P();
+ def_El();
+ def_G();
+ }
+
+ void draw_O()
+ {
+ int i,j,k;
+ for (i=0;i<ACC;i++)
+ {
+ k = i+1;
+ if (k>=ACC)
+ k = 0;
+ gl.glBegin(GL_QUAD_STRIP);
+ for (j=0;j<ACC4;j++)
+ {
+ gl.glNormal3f(normal_O[j][k][0], normal_O[j][k][1], normal_O[j][k][2]);
+ gl.glVertex3f(char_O[j][k][0], char_O[j][k][1], char_O[j][k][2]);
+ gl.glNormal3f(normal_O[j][i][0], normal_O[j][i][1], normal_O[j][i][2]);
+ gl.glVertex3f(char_O[j][i][0], char_O[j][i][1], char_O[j][i][2]);
+ }
+ gl.glNormal3f(normal_O[0][k][0], normal_O[0][k][1], normal_O[0][k][2]);
+ gl.glVertex3f(char_O[0][k][0], char_O[0][k][1], char_O[0][k][2]);
+ gl.glNormal3f(normal_O[0][i][0], normal_O[0][i][1], normal_O[0][i][2]);
+ gl.glVertex3f(char_O[0][i][0], char_O[0][i][1], char_O[0][i][2]);
+ gl.glEnd();
+ }
+ }
+
+ void draw_P()
+ {
+ int i,j,k;
+ for (i=0;i<ACC;i++)
+ {
+ k = i+1;
+ if (k>=ACC)
+ k = 0;
+ gl.glBegin(GL_QUAD_STRIP);
+ for (j=0;j<ACC2;j++)
+ {
+ gl.glNormal3f(normal_P[j][k][0], normal_P[j][k][1], normal_P[j][k][2]);
+ gl.glVertex3f(char_P[j][k][0], char_P[j][k][1], char_P[j][k][2]);
+ gl.glNormal3f(normal_P[j][i][0], normal_P[j][i][1], normal_P[j][i][2]);
+ gl.glVertex3f(char_P[j][i][0], char_P[j][i][1], char_P[j][i][2]);
+ }
+ gl.glNormal3f(normal_P[0][k][0], normal_P[0][k][1], normal_P[0][k][2]);
+ gl.glVertex3f(char_P[0][k][0], char_P[0][k][1], char_P[0][k][2]);
+ gl.glNormal3f(normal_P[0][i][0], normal_P[0][i][1], normal_P[0][i][2]);
+ gl.glVertex3f(char_P[0][i][0], char_P[0][i][1], char_P[0][i][2]);
+ gl.glEnd();
+ }
+ j = 0;
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i=0;i<ACC;i++)
+ {
+ gl.glNormal3f(normal_P[0][i][0], normal_P[0][i][1], normal_P[0][i][2]);
+ gl.glVertex3f(char_P[0][i][0]-4.3f, -1.6f, 1.0f*char_P[0][i][2]);
+ gl.glVertex3f(char_P[0][i][0]-4.3f, 6.0f, 1.0f*char_P[0][i][2]);
+ }
+ gl.glNormal3f(normal_P[0][0][0], normal_P[0][0][1], normal_P[0][0][2]);
+ gl.glVertex3f(char_P[0][0][0]-4.3f, -1.6f, 1.0f*char_P[0][0][2]);
+ gl.glVertex3f(char_P[0][0][0]-4.3f, 6.0f, 1.0f*char_P[0][0][2]);
+ gl.glEnd();
+ }
+
+ void draw_E()
+ {
+ int i,j,k;
+ for (i=0;i<ACC;i++)
+ {
+ k = i+1;
+ if (k>=ACC)
+ k = 0;
+ gl.glBegin(GL_QUAD_STRIP);
+ gl.glNormal3f(normal_P[0][k][0], normal_P[0][k][1], normal_P[0][k][2]);
+ gl.glVertex3f(char_P[0][k][0], char_P[0][k][1]+0.0f, char_P[0][k][2]);
+ gl.glNormal3f(normal_P[0][i][0], normal_P[0][i][1], normal_P[0][i][2]);
+ gl.glVertex3f(char_P[0][i][0], char_P[0][i][1]+0.0f, char_P[0][i][2]);
+ for (j=1;j<ACC2;j++)
+ {
+ gl.glNormal3f(normal_P[j][k][0], normal_P[j][k][1], normal_P[j][k][2]);
+ gl.glVertex3f(char_P[j][k][0], char_P[j][k][1], char_P[j][k][2]);
+ gl.glNormal3f(normal_P[j][i][0], normal_P[j][i][1], normal_P[j][i][2]);
+ gl.glVertex3f(char_P[j][i][0], char_P[j][i][1], char_P[j][i][2]);
+ }
+ gl.glNormal3f(normal_P[0][k][0], normal_P[0][k][1], normal_P[0][k][2]);
+ gl.glVertex3f(char_P[0][k][0], char_P[0][k][1]-0.4f, char_P[0][k][2]);
+ gl.glNormal3f(normal_P[0][i][0], normal_P[0][i][1], normal_P[0][i][2]);
+ gl.glVertex3f(char_P[0][i][0], char_P[0][i][1]-0.4f, char_P[0][i][2]);
+ gl.glEnd();
+ }
+
+ gl.glBegin(GL_QUAD_STRIP);
+ j = ACC2*3/4;
+ for (i=0;i<ACC;i++)
+ {
+ gl.glNormal3f(normal_P[j][i][0], normal_P[j][i][1], normal_P[j][i][2]);
+ gl.glVertex3f(-2.0f, char_P[j][i][1]+2.55f, 1.0f*char_P[j][i][2]);
+ gl.glVertex3f(2.0f, char_P[j][i][1]+2.55f, 1.0f*char_P[j][i][2]);
+ }
+ gl.glNormal3f(normal_P[j][0][0], normal_P[j][0][1], normal_P[j][0][2]);
+ gl.glVertex3f(-2.0f, char_P[j][0][1]+2.55f, 1.0f*char_P[j][0][2]);
+ gl.glVertex3f(2.0f, char_P[j][0][1]+2.55f, 1.0f*char_P[j][0][2]);
+ gl.glEnd();
+ }
+
+ void draw_El()
+ {
+ int i,j,k;
+ for (i=0;i<ACC;i++)
+ {
+ k = i+1;
+ if (k>=ACC)
+ k = 0;
+ gl.glBegin(GL_QUAD_STRIP);
+ for (j=0;j<=ACC3;j++)
+ {
+ gl.glNormal3f(normal_El[j][k][0], normal_El[j][k][1], normal_El[j][k][2]);
+ gl.glVertex3f(char_El[j][k][0], char_El[j][k][1], char_El[j][k][2]);
+ gl.glNormal3f(normal_El[j][i][0], normal_El[j][i][1], normal_El[j][i][2]);
+ gl.glVertex3f(char_El[j][i][0], char_El[j][i][1], char_El[j][i][2]);
+ }
+ gl.glEnd();
+ }
+ }
+
+ void draw_N()
+ {
+ int i,j,k;
+ for (i=0;i<ACC;i++)
+ {
+ k = i+1;
+ if (k>=ACC)
+ k = 0;
+ gl.glBegin(GL_QUAD_STRIP);
+ for (j=0;j<=ACC2/2;j++)
+ {
+ gl.glNormal3f(normal_P[j][k][0], normal_P[j][k][1], normal_P[j][k][2]);
+ gl.glVertex3f(char_P[j][k][0], char_P[j][k][1], char_P[j][k][2]);
+ gl.glNormal3f(normal_P[j][i][0], normal_P[j][i][1], normal_P[j][i][2]);
+ gl.glVertex3f(char_P[j][i][0], char_P[j][i][1], char_P[j][i][2]);
+ }
+ gl.glEnd();
+ }
+
+ j = 0;
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i=0;i<ACC;i++)
+ {
+ gl.glNormal3f(normal_P[0][i][0], normal_P[0][i][1], normal_P[0][i][2]);
+ gl.glVertex3f(char_P[0][i][0]-4.3f, 0.2f, 1.0f*char_P[0][i][2]);
+ gl.glVertex3f(char_P[0][i][0]-4.3f, 6.0f, 1.0f*char_P[0][i][2]);
+ }
+ gl.glNormal3f(normal_P[0][0][0], normal_P[0][0][1], normal_P[0][0][2]);
+ gl.glVertex3f(char_P[0][0][0]-4.3f, 0.2f, 1.0f*char_P[0][0][2]);
+ gl.glVertex3f(char_P[0][0][0]-4.3f, 6.0f, 1.0f*char_P[0][0][2]);
+ gl.glEnd();
+ j = 0;
+
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i=0;i<ACC;i++)
+ {
+ gl.glNormal3f(normal_P[0][i][0], normal_P[0][i][1], normal_P[0][i][2]);
+ gl.glVertex3f(char_P[0][i][0], 0.2f, 1.0f*char_P[0][i][2]);
+ gl.glVertex3f(char_P[0][i][0], 3.4f, 1.0f*char_P[0][i][2]);
+ }
+ gl.glNormal3f(normal_P[0][0][0], normal_P[0][0][1], normal_P[0][0][2]);
+ gl.glVertex3f(char_P[0][0][0], 0.2f, 1.0f*char_P[0][0][2]);
+ gl.glVertex3f(char_P[0][0][0], 3.4f, 1.0f*char_P[0][0][2]);
+ gl.glEnd();
+ }
+
+ void draw_G()
+ {
+ int i,j,k;
+ for (i=0;i<ACC;i++)
+ {
+ k = i+1;
+ if (k>=ACC)
+ k = 0;
+ gl.glBegin(GL_QUAD_STRIP);
+ gl.glNormal3f(normal_G[0][k][0], normal_G[0][k][1], normal_G[0][k][2]);
+ gl.glVertex3f(char_G[0][k][0], char_G[0][k][1]+1.2f, char_G[0][k][2]);
+ gl.glNormal3f(normal_G[0][i][0], normal_G[0][i][1], normal_G[0][i][2]);
+ gl.glVertex3f(char_G[0][i][0], char_G[0][i][1]+1.2f, char_G[0][i][2]);
+ for (j=1;j<ACC4;j++)
+ {
+ gl.glNormal3f(normal_G[j][k][0], normal_G[j][k][1], normal_G[j][k][2]);
+ gl.glVertex3f(char_G[j][k][0], char_G[j][k][1], char_G[j][k][2]);
+ gl.glNormal3f(normal_G[j][i][0], normal_G[j][i][1], normal_G[j][i][2]);
+ gl.glVertex3f(char_G[j][i][0], char_G[j][i][1], char_G[j][i][2]);
+ }
+ gl.glEnd();
+ }
+
+ gl.glBegin(GL_QUAD_STRIP);
+ j = ACC4*3/4;
+ for (i=0;i<ACC;i++)
+ {
+ gl.glNormal3f(accSIN[i], 0.0f, accCOS[i] );
+ gl.glVertex3f(4.0f+0.9f*accSIN[i], 4.0f+0.9f*accSIN[i], 0.9f*accCOS[i] );
+ gl.glVertex3f(4.0f+0.9f*accSIN[i], 0.0f, 0.9f*accCOS[i]);
+ }
+ gl.glNormal3f(accSIN[0], 0.0f, accCOS[0] );
+ gl.glVertex3f(4.0f+0.9f*accSIN[0], 4.0f+0.9f*accSIN[0], 0.9f*accCOS[0] );
+ gl.glVertex3f(4.0f+0.9f*accSIN[0], 0.0f, 0.9f*accCOS[0]);
+ gl.glEnd();
+
+ gl.glBegin(GL_QUAD_STRIP);
+ j = ACC4*3/4;
+ for (i=0;i<ACC;i++)
+ {
+ gl.glNormal3f(0.0f, accSIN[i], accCOS[i] );
+ gl.glVertex3f(4.0f-0.9f*accSIN[i], 4.0f-0.9f*accSIN[i], 0.9f*accCOS[i] );
+ gl.glVertex3f(0.0f, 4.0f-0.9f*accSIN[i], 0.9f*accCOS[i]);
+ }
+ gl.glNormal3f(0.0f, accSIN[0], accCOS[0] );
+ gl.glVertex3f(4.0f-0.9f*accSIN[0], 4.0f-0.9f*accSIN[0], 0.9f*accCOS[0] );
+ gl.glVertex3f(0.0f, 4.0f-0.9f*accSIN[0], 0.9f*accCOS[0]);
+ gl.glEnd();
+
+ j = ACC4*3/4;
+ gl.glBegin(GL_TRIANGLE_FAN);
+ gl.glNormal3f(-1.0f, 0.0f, 0.0f);
+ gl.glVertex3f(0.0f, 4.0f, 0.0f);
+ for (i=0;i<ACC;i++)
+ gl.glVertex3f(0.0f, 4.0f+0.9f*accSIN[i], 0.9f*accCOS[i]);
+ gl.glVertex3f(0.0f, 4.0f+0.9f*accSIN[0], 0.9f*accCOS[0]);
+ gl.glEnd();
+ }
+
+ void draw_L()
+ {
+ int i;
+
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i=0;i<ACC;i++)
+ {
+ gl.glNormal3f(accSIN[i], 0.0f, accCOS[i] );
+ gl.glVertex3f(0.9f*accSIN[i], 9.6f, 0.9f*accCOS[i]);
+ gl.glVertex3f(0.9f*accSIN[i], 0.9f+0.9f*accSIN[i], 0.9f*accCOS[i] );
+ }
+ gl.glNormal3f(accSIN[0], 0.0f, accCOS[0] );
+ gl.glVertex3f(0.9f*accSIN[0], 9.6f, 0.9f*accCOS[0]);
+ gl.glVertex3f(0.9f*accSIN[0], 0.9f+0.9f*accSIN[0], 0.9f*accCOS[0] );
+ gl.glEnd();
+
+ gl.glBegin(GL_QUAD_STRIP);
+ for (i=0;i<ACC;i++)
+ {
+ gl.glNormal3f(0.0f, accSIN[i], accCOS[i] );
+ gl.glVertex3f(0.9f*accSIN[i], 0.9f+0.9f*accSIN[i], 0.9f*accCOS[i] );
+ gl.glVertex3f(5.6f, 0.9f+0.9f*accSIN[i], 0.9f*accCOS[i]);
+ }
+ gl.glNormal3f(0.0f, accSIN[0], accCOS[0] );
+ gl.glVertex3f(0.9f*accSIN[0], 0.9f+0.9f*accSIN[0], 0.9f*accCOS[0] );
+ gl.glVertex3f(5.6f, 0.9f+0.9f*accSIN[0], 0.9f*accCOS[0]);
+ gl.glEnd();
+
+ gl.glBegin(GL_TRIANGLE_FAN);
+ gl.glNormal3f(1.0f, 0.0f, 0.0f);
+ gl.glVertex3f(5.6f, 0.9f, 0.0f);
+ for (i=ACC-1;i>=0;i--)
+ gl.glVertex3f(5.6f, 0.9f+0.9f*accSIN[i], 0.9f*accCOS[i]);
+ gl.glVertex3f(5.6f, 0.9f+0.9f*accSIN[ACC-1], 0.9f*accCOS[ACC-1]);
+ gl.glEnd();
+ }
+
+ void draw_part(int i)
+ {
+ gl.glPushMatrix();
+ gl.glTranslatef(TRANS[i][0]*progress, TRANS[i][1]*progress, TRANS[i][2]*progress);
+ gl.glRotatef(ROT[i]*progress, ROTAXIS[i][0], ROTAXIS[i][1], ROTAXIS[i][2]);
+ switch(i)
+ {
+ case 0: draw_El(); break;
+ case 1: draw_O(); break;
+ case 2: draw_P(); break;
+ case 3: draw_E(); break;
+ case 4: draw_N(); break;
+ case 5: draw_G(); break;
+ case 6: draw_L(); break;
+ }
+ gl.glPopMatrix();
+ }
+
+ void draw_logo()
+ {
+ groen_texture();
+ gl.glEnable(GL_CULL_FACE);
+ gl.glTranslatef(-2.8f, 0.0f, 0.0f);
+
+ draw_part(0);
+ gl.glTranslatef(-12.0f, 4.3f, 0.0f);
+ draw_part(1);
+ gl.glTranslatef(7.3f, 0.0f, 0.0f);
+ draw_part(2);
+ gl.glTranslatef(5.4f, 0.0f, 0.0f);
+ draw_part(3);
+ gl.glTranslatef(5.4f, 0.0f, 0.0f);
+ draw_part(4);
+ gl.glTranslatef(7.4f, 0.0f, 0.0f);
+ draw_part(5);
+ gl.glTranslatef(6.8f, 0.0f, 0.0f);
+ draw_part(6);
+ }
+
+}
+
diff --git a/demos/glLogoCvsApplet.html b/demos/glLogoCvsApplet.html
new file mode 100644
index 0000000..69546d9
--- /dev/null
+++ b/demos/glLogoCvsApplet.html
@@ -0,0 +1,14 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<applet code="glLogoCvsApplet.class" width=400 height=220>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/glLogoCvsApplet.java b/demos/glLogoCvsApplet.java
new file mode 100644
index 0000000..bdd5009
--- /dev/null
+++ b/demos/glLogoCvsApplet.java
@@ -0,0 +1,71 @@
+
+import gl4java.GLContext;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.applet.*;
+
+public class glLogoCvsApplet extends Applet
+ implements MouseListener
+{
+ glLogoCvs cvsLogo = null;
+
+ String gljLib=null;
+ String glLib=null;
+ String gluLib=null;
+
+ Button bLoadLib = null;
+ Button bAddGL = null;
+
+ public void init()
+ {
+ setLayout(new BorderLayout());
+ cvsLogo = new glLogoCvs(150, 150, null, null);
+ cvsLogo.setAnimateFps(30.0);
+ add("Center", cvsLogo);
+
+ add("West", new Label("OpenGL"));
+ add("East", new Label("Java-Applet"));
+
+ cvsLogo.addMouseListener(this);
+ setBackground(Color.white);
+ }
+
+ public void start() {
+ cvsLogo.start();
+ }
+
+ public void stop() {
+ cvsLogo.stop();
+ }
+
+ public void destroy() {
+ cvsLogo.stop();
+ cvsLogo.cvsDispose();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+
+ if( comp.equals(cvsLogo) )
+ cvsLogo.setSuspended(!cvsLogo.isSuspended(), true);
+ }
+}
diff --git a/demos/glLogoCvsAppletDbg.java b/demos/glLogoCvsAppletDbg.java
new file mode 100644
index 0000000..8ddfd0a
--- /dev/null
+++ b/demos/glLogoCvsAppletDbg.java
@@ -0,0 +1,125 @@
+
+import gl4java.GLContext;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.applet.*;
+
+public class glLogoCvsAppletDbg extends Applet
+ implements MouseListener
+{
+ glLogoCvs cvsLogo = null;
+
+ String gljLib=null;
+ String glLib=null;
+ String gluLib=null;
+
+ Button bLoadLib = null;
+ Button bAddGL = null;
+
+ static {
+ if(GLContext.loadNativeLibraries(null, null, null)==false)
+ System.out.println("could not load native def. libs");
+ else
+ System.out.println("loaded native def. libs");
+ }
+
+ public void init()
+ {
+ setLayout(new BorderLayout());
+
+ bLoadLib = new Button("load lib");
+ add("North", bLoadLib);
+ bAddGL = new Button("add gl");
+ add("South", bAddGL);
+ bAddGL.addMouseListener(this);
+ /*
+ if(GLContext.loadNativeLibraries(gljLib, glLib, gluLib)==false)
+ System.out.println("could not load native libs:"+
+ gljLib + ", " + glLib + ", " + gluLib);
+ else
+ System.out.println("load native libs:"+
+ gljLib + ", " + glLib + ", " + gluLib);
+
+ setLayout(new BorderLayout());
+ cvsLogo = new glLogoCvs(150, 150, null, null);
+ cvsLogo.setAnimateFps(30.0);
+ add("Center", cvsLogo);
+
+ add("West", new Label("OpenGL"));
+ add("East", new Label("Java-Applet"));
+
+ cvsLogo.addMouseListener(this);
+ setBackground(Color.white);
+ */
+ }
+
+ public void start() {
+ // cvsLogo.start();
+ }
+
+ public void stop() {
+ // cvsLogo.stop();
+ }
+
+ public void destroy() {
+ /*
+ cvsLogo.stop();
+ cvsLogo.cvsDispose();
+ */
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+
+ if( comp.equals(bLoadLib) )
+ loadLib();
+ if( comp.equals(bAddGL) )
+ addGL();
+ else if( comp.equals(cvsLogo) )
+ cvsLogo.setSuspended(!cvsLogo.isSuspended(),
+ evt.getClickCount()>1 // -> ReInit
+ );
+ }
+
+ void loadLib()
+ {
+ if(GLContext.loadNativeLibraries(gljLib, glLib, gluLib)==false)
+ System.out.println("could not load native libs:"+
+ gljLib + ", " + glLib + ", " + gluLib);
+ else
+ System.out.println("load native libs:"+
+ gljLib + ", " + glLib + ", " + gluLib);
+ }
+
+ void addGL()
+ {
+ cvsLogo = new glLogoCvs(150, 150, null, null);
+ cvsLogo.setAnimateFps(30.0);
+ add("Center", cvsLogo);
+
+ add("West", new Label("OpenGL"));
+ add("East", new Label("Java-Applet"));
+
+ cvsLogo.addMouseListener(this);
+ setBackground(Color.white);
+ }
+}
diff --git a/demos/glLogoCvsAppletJ2P.html b/demos/glLogoCvsAppletJ2P.html
new file mode 100644
index 0000000..62c9705
--- /dev/null
+++ b/demos/glLogoCvsAppletJ2P.html
@@ -0,0 +1,45 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.0 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 220 codebase="http://java.sun.com/products/plugin/1.2/jinstall-12-win32.cab#Version=1,2,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.2" java_CODE = "glLogoCvsApplet.class" WIDTH = 400 HEIGHT = 220 frames = "55" pluginspage="http://java.sun.com/products/plugin/1.2/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "glLogoCvsApplet.class" WIDTH = 400 HEIGHT = 220 ></XMP>
+<PARAM NAME = CODE VALUE = "glLogoCvsApplet.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.2">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "glLogoCvsApplet.class" WIDTH = 400 HEIGHT = 220 >
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/glOlympicCvsApplet.html b/demos/glOlympicCvsApplet.html
new file mode 100644
index 0000000..97520e7
--- /dev/null
+++ b/demos/glOlympicCvsApplet.html
@@ -0,0 +1,14 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<applet code="glOlympicCvsApplet.class" width=400 height=220>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/glOlympicCvsApplet.java b/demos/glOlympicCvsApplet.java
new file mode 100644
index 0000000..0bc9102
--- /dev/null
+++ b/demos/glOlympicCvsApplet.java
@@ -0,0 +1,78 @@
+
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+import java.awt.*;
+import java.awt.event.*;
+import java.applet.*;
+
+public class glOlympicCvsApplet extends Applet
+ implements MouseListener
+{
+ olympicCvs cvsOlympic = null;
+
+ String gljLib=null;
+ String glLib=null;
+ String gluLib=null;
+
+ public void init()
+ {
+ if(GLContext.loadNativeLibraries(gljLib, glLib, gluLib)==false)
+ System.out.println("could not load native libs:"+
+ gljLib + ", " + glLib + ", " + gluLib);
+ else
+ System.out.println("load native libs:"+
+ gljLib + ", " + glLib + ", " + gluLib);
+
+
+ setLayout(new BorderLayout());
+ cvsOlympic = new olympicCvs(150, 150, null, null);
+ cvsOlympic.setAnimateFps(30.0);
+ add("Center", cvsOlympic);
+
+ add("West", new Label("OpenGL"));
+ add("East", new Label("Java-Applet"));
+
+ cvsOlympic.addMouseListener(this);
+ addMouseListener(this);
+
+ setBackground(Color.white);
+ }
+
+ public void start() {
+ cvsOlympic.start();
+ }
+
+ public void stop() {
+ cvsOlympic.stop();
+ }
+
+ public void destroy() {
+ cvsOlympic.stop();
+ cvsOlympic.cvsDispose();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+
+ if( comp.equals(cvsOlympic) )
+ cvsOlympic.setSuspended(!cvsOlympic.isSuspended(), true);
+ }
+}
diff --git a/demos/glOlympicCvsAppletJ2P.html b/demos/glOlympicCvsAppletJ2P.html
new file mode 100644
index 0000000..135c58f
--- /dev/null
+++ b/demos/glOlympicCvsAppletJ2P.html
@@ -0,0 +1,45 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.0 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 400 HEIGHT = 220 codebase="http://java.sun.com/products/plugin/1.2/jinstall-12-win32.cab#Version=1,2,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.2" java_CODE = "glOlympicCvsApplet.class" WIDTH = 400 HEIGHT = 220 frames = "55" pluginspage="http://java.sun.com/products/plugin/1.2/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "glOlympicCvsApplet.class" WIDTH = 400 HEIGHT = 220 ></XMP>
+<PARAM NAME = CODE VALUE = "glOlympicCvsApplet.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.2">
+<PARAM NAME = frames VALUE ="55">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "glOlympicCvsApplet.class" WIDTH = 400 HEIGHT = 220 >
+<PARAM NAME = frames VALUE ="55">
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/glOlympicSwingApplet.html b/demos/glOlympicSwingApplet.html
new file mode 100644
index 0000000..32caef3
--- /dev/null
+++ b/demos/glOlympicSwingApplet.html
@@ -0,0 +1,14 @@
+<HTML>
+<HEAD>
+<TITLE>G&ouml;thel Hard- und Software Entwicklungen</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<applet code="glOlympicSwingApplet.class" width=400 height=220>
+<param name=frames value="55">
+</applet>
+<hr>
+</BODY>
+</HTML>
+
+
diff --git a/demos/glOlympicSwingApplet.java b/demos/glOlympicSwingApplet.java
new file mode 100644
index 0000000..9e67af2
--- /dev/null
+++ b/demos/glOlympicSwingApplet.java
@@ -0,0 +1,125 @@
+
+import gl4java.GLContext;
+import java.awt.*;
+import javax.swing.*;
+import java.awt.event.*;
+import java.applet.*;
+
+public class glOlympicSwingApplet extends JApplet
+ implements MouseListener
+{
+ olympicCvs cvsOlympic = null;
+
+ String gljLib=null;
+ String glLib=null;
+ String gluLib=null;
+
+ public void init()
+ {
+ if(GLContext.loadNativeLibraries(gljLib, glLib, gluLib)==false)
+ System.out.println("could not load native libs:"+
+ gljLib + ", " + glLib + ", " + gluLib);
+ else
+ System.out.println("load native libs:"+
+ gljLib + ", " + glLib + ", " + gluLib);
+
+
+ cvsOlympic = new olympicCvs(150, 150, null, null);
+ cvsOlympic.setAnimateFps(30.0);
+
+ JPanel p1 = new JPanel();
+ p1.setLayout(new BorderLayout());
+
+ getContentPane().setLayout(new BorderLayout());
+ getContentPane().add("Center", p1);
+
+ p1.add("North", new JLabel("Overlapping Swings do not work"));
+ p1.add("West", new JLabel("OpenGL"));
+ p1.add("Center", cvsOlympic);
+ p1.add("East", new JLabel("Java-JApplet"));
+ p1.add("South", new JLabel("The Events does not work yet"));
+
+ cvsOlympic.addMouseListener(this);
+
+ setBackground(Color.white);
+
+ JMenuBar jmb1 = new JMenuBar();
+ JMenu jm1 = new JMenu("Menu-1");
+ jm1.add(new JMenuItem("Menue-1-Item-1"));
+ jm1.add(new JMenuItem("Menue-1-Item-2"));
+ jm1.add(new JMenuItem("Menue-1-Item-3"));
+ JMenu jm2 = new JMenu("Menu-2");
+ jm2.add(new JMenuItem("Menue-2-Item-1"));
+ jm2.add(new JMenuItem("Menue-2-Item-2"));
+ jm2.add(new JMenuItem("Menue-2-Item-3"));
+ JMenu jm3 = new JMenu("Menu-3");
+ jm3.add(new JMenuItem("Menue-3-Item-1"));
+ jm3.add(new JMenuItem("Menue-3-Item-2"));
+ jm3.add(new JMenuItem("Menue-3-Item-3"));
+ jmb1.add(jm1);
+ jmb1.add(jm2);
+ jmb1.add(jm3);
+
+ setJMenuBar(jmb1);
+ }
+
+ public void start() {
+ cvsOlympic.start();
+ }
+
+ public void stop() {
+ cvsOlympic.stop();
+ }
+
+ public void destroy() {
+ cvsOlympic.stop();
+ cvsOlympic.cvsDispose();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseEntered( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+ mouseInfo(evt);
+ if( comp.equals(cvsOlympic) )
+ cvsOlympic.setSuspended(!cvsOlympic.isSuspended(), true);
+
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ mouseInfo(evt);
+
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ mouseInfo(evt);
+
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ mouseInfo(evt);
+
+ }
+
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+
+ mouseInfo(evt);
+
+ if( comp.equals(cvsOlympic) )
+ cvsOlympic.setSuspended(!cvsOlympic.isSuspended(), true);
+ }
+
+ public void mouseInfo(MouseEvent evt)
+ {
+ Component comp = evt.getComponent();
+
+ System.out.println("\n\n----------------------------------");
+ System.out.println(comp);
+ System.out.println(evt);
+ }
+}
diff --git a/demos/glStencilTest.java b/demos/glStencilTest.java
new file mode 100755
index 0000000..79a2e4b
--- /dev/null
+++ b/demos/glStencilTest.java
@@ -0,0 +1,95 @@
+import gl4java.awt.*;
+import java.awt.*;
+import java.awt.Dimension;
+import gl4java.GLContext;
+import gl4java.GLFunc;
+
+public class glStencilTest {
+
+ protected class MyCanvas extends GLCanvas {
+
+ public MyCanvas(int w, int h) {
+ super(w,h);
+ GLContext.gljNativeDebug = false;
+ GLContext.gljClassDebug = false;
+ }
+
+ public void preInit() {
+ stencilBits = 8;
+ }
+
+ public void init() {
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glOrtho(-1,1,-1,1,-50.0,50.0);
+ gl.glMatrixMode(GL_MODELVIEW);
+ glj.gljCheckGL();
+ }
+
+ public void reshape(int w, int h) {
+ Dimension d=new Dimension(w,h);
+ if (!cvsIsInit()) return;
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("problem in use() method");
+ return;
+ }
+ setSize(d);
+ gl.glViewport(0,0,w,h);
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void display() {
+ int i;
+
+ if( glj.gljMakeCurrent() == false ) {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ gl.glPushMatrix();
+ gl.glClear(GL_COLOR_BUFFER_BIT);
+ glu.gluLookAt(0, 0, 20, 0, 0, 0, 0, 1, 0);
+
+ gl.glBegin(GL_POLYGON);
+ gl.glVertex2d(0,-0.5);
+ gl.glVertex2d(0.5,0.5);
+ gl.glVertex2d(-0.5,0.5);
+ gl.glEnd();
+
+
+ // Examine some OpenGL properties
+ int [] res=new int[6];
+
+ gl.glGetIntegerv(GL_STENCIL_BITS,res);
+ System.out.println("Stencil bits are "+res[0]);
+
+ gl.glGetIntegerv(GL_RED_BITS,res);
+ System.out.println("Color bits are "+res[0]);
+
+ gl.glPopMatrix();
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+ }
+
+ protected MyCanvas cvs;
+ protected Frame frame;
+
+ public glStencilTest() {
+ frame = new Frame( "OpenGL" );
+ cvs= new MyCanvas(640,480);
+ frame.setSize(640,480);
+ frame.add("Center", cvs);
+ frame.setVisible(true);
+ }
+
+ public static void main(java.lang.String[] args) {
+ try {
+ glStencilTest g=new glStencilTest();
+ } catch (Throwable exception) {
+ System.err.println("Exception occurred in main()");
+ exception.printStackTrace(System.out);
+ }
+ }
+}
diff --git a/demos/glc2glj b/demos/glc2glj
new file mode 100755
index 0000000..2512144
--- /dev/null
+++ b/demos/glc2glj
@@ -0,0 +1,32 @@
+#! /bin/sh
+
+echo "will replace all decimal numbers to java-float constants"
+echo "$1 -> $1.new"
+sed -e '/[0-9][0-9]*\.[0-9][0-9]*/s//&f/g' \
+ -e '/GLbyte/s//byte/g' \
+ -e '/GLshort/s//short/g' \
+ -e '/GLint/s//int/g' \
+ -e '/GLfloat/s//float/g' \
+ -e '/GLclampf/s//float/g' \
+ -e '/GLdouble/s//double/g' \
+ -e '/GLclampd/s//double/g' \
+ -e '/GLubyte/s//byte/g' \
+ -e '/GLboolean/s//boolean/g' \
+ -e '/GLushort/s//short/g' \
+ -e '/GLuint/s//int/g' \
+ -e '/GLenum/s//int/g' \
+ -e '/GLbitfield/s//int/g' \
+ -e '/GLUquadricObj *\*/s//long /g' \
+ -e '/GLUnurbsObj *\*/s//long /g' \
+ -e '/GLUtesselator *\*/s//long /g' \
+ -e '/GLUtriangulatorObj *\*/s//long /g' \
+ -e '/cos/s//(float)Math.cos/g' \
+ -e '/sin/s//(float)Math.sin/g' \
+ -e '/sqrt/s//(float)Math.sqrt/g' \
+ -e '/pow/s//(float)Math.pow/g' \
+ -e '/\#define/s//static final int/g' \
+ -e '/glut[A-Z]/s//glut.&/g' \
+ -e '/glu[A-Z]/s//glu.&/g' \
+ -e '/gl[A-Z]/s//gl.&/g' \
+ $1 > $1.new
+
diff --git a/demos/index.html b/demos/index.html
new file mode 100755
index 0000000..1ac862b
--- /dev/null
+++ b/demos/index.html
@@ -0,0 +1,62 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Ron Cemer & Sven Goethel">
+ <meta name="GENERATOR" content="Mozilla/4.61 [en] (Win98; U) [Netscape]">
+ <title>Misc Demos</title>
+</head>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<p>Here are the demos-I for <B>
+<A HREF="http://www.jausoft.com/gl4java/">GL4Java</A> >= 2.4.0.0: </B> <br>
+<br>
+ <LI><P ALIGN=LEFT><I><A HREF="glDemosCvs.html">glDemosCvs</A>
+ : Many OpenGL Canvas running together</I>
+ </P>
+ <LI><P ALIGN=LEFT><I><A HREF="glOlympicCvsApplet.html">glOlympicCvsApplet</A>
+ : The Olympic Rings alone </I>
+ </P>
+ <LI><P ALIGN=LEFT><I><A HREF="glLogoCvsApplet.html">glLogoCvsApplet</A>
+ : The OpenGL Logo alone</I></P>
+ <LI><P ALIGN=LEFT><I><A HREF="glOlympicSwingApplet.html">glOlympicSwingApplet</A>
+ : The Olympic Rings using Swing (needs Swing 1.1 installed
+ either)</I></P>
+ <LI><P ALIGN=LEFT><I><A HREF="testTextPPM1.html">testTextPPM1</A>
+ : A textured Box using Swing (needs Swing 1.1 installed
+ either)</I></P>
+
+<BR>
+
+ <LI><P ALIGN=LEFT><I><A HREF="GLLandScape/index.html">GLLandScape World</A>
+ : The GLLandScape World
+ </I></P>
+ <LI><P ALIGN=LEFT><I><A HREF="MiscDemos/index.html">Misc Demos</A>
+ : Some new ported demos.
+ </I></P>
+ <LI><P ALIGN=LEFT><I><A HREF="RonsDemos/index.html">Ron's Demos</A>
+ : Demo's ported by Ron Cemer
+ </I></P>
+ <LI><P ALIGN=LEFT><I><A HREF="HodglimsNeHe/index.html">Hodglim's NeHe Demos</A>
+ : Here are the NeHe OpenGL Tutorial Demos originally ported by Hodglim
+ </I></P>
+<BR>
+
+<P ALIGN=CENTER><SPAN STYLE="text-decoration: none"><I>For use with
+the Java2-Plug-In: Tested with Win32,Netscape,Java2 <A HREF="Java2.txt">(see
+Installation-instructions Java2)</A> ! </I></SPAN>
+</P>
+<UL>
+ <LI><P ALIGN=LEFT><I><A HREF="glOlympicCvsAppletJ2P.html">glOlympicCvsAppletJ2P</A>
+ : Out of the demo directory of GL4Java </I>
+ </P>
+ <LI><P ALIGN=LEFT><I><A HREF="glLogoCvsAppletJ2P.html">glLogoCvsAppletJ2P</A>
+ : Out of the demo directory of GL4Java</I></P>
+ <LI><P ALIGN=LEFT><I><A HREF="testTextPPM1J2P.html">testTextPPM1J2P</A>
+ : Out of the demo directory of GL4Java (needs Swing 1.1 installed
+ either)</I></P>
+</UL>
+<P ALIGN=CENTER><SPAN STYLE="text-decoration: none">
+<a href="../../Installer/java.policy">The Java2 (sdk, jre, plugin 1.3) policy file example to give GL4Java the necessary permissions (Click here) !</a>
+</P>
+</BODY>
+</HTML>
diff --git a/demos/java.policy b/demos/java.policy
new file mode 100644
index 0000000..1115932
--- /dev/null
+++ b/demos/java.policy
@@ -0,0 +1,56 @@
+
+// Standard extensions get all permissions by default
+
+grant codeBase "file:${java.home}/lib/ext/-" {
+ permission java.security.AllPermission;
+};
+
+grant codeBase "http://www.jausoft.com/Files/Java/1.1.X/GL4Java/demos/* {
+ permission java.security.AllPermission;
+};
+
+grant codeBase "file://f/java-1.1.X/GL4Java/demos/* {
+ permission java.security.AllPermission;
+};
+
+// default permissions granted to all domains
+
+grant {
+ // Allows any thread to stop itself using the java.lang.Thread.stop()
+ // method that takes no argument.
+ // Note that this permission is granted by default only to remain
+ // backwards compatible.
+ // It is strongly recommended that you either remove this permission
+ // from this policy file or further restrict it to code sources
+ // that you specify, because Thread.stop() is potentially unsafe.
+ // See "http://java.sun.com/notes" for more information.
+ permission java.lang.RuntimePermission "stopThread";
+
+ // allows anyone to listen on un-privileged ports
+ permission java.net.SocketPermission "localhost:1024-", "listen";
+
+ // "standard" properies that can be read by anyone
+
+ permission java.util.PropertyPermission "java.version", "read";
+ permission java.util.PropertyPermission "java.vendor", "read";
+ permission java.util.PropertyPermission "java.vendor.url", "read";
+ permission java.util.PropertyPermission "java.class.version", "read";
+ permission java.util.PropertyPermission "os.name", "read";
+ permission java.util.PropertyPermission "os.version", "read";
+ permission java.util.PropertyPermission "os.arch", "read";
+ permission java.util.PropertyPermission "file.separator", "read";
+ permission java.util.PropertyPermission "path.separator", "read";
+ permission java.util.PropertyPermission "line.separator", "read";
+
+ permission java.util.PropertyPermission "java.specification.version", "read";
+ permission java.util.PropertyPermission "java.specification.vendor", "read";
+ permission java.util.PropertyPermission "java.specification.name", "read";
+
+ permission java.util.PropertyPermission "java.vm.specification.version", "read";
+ permission java.util.PropertyPermission "java.vm.specification.vendor", "read";
+ permission java.util.PropertyPermission "java.vm.specification.name", "read";
+ permission java.util.PropertyPermission "java.vm.version", "read";
+ permission java.util.PropertyPermission "java.vm.vendor", "read";
+ permission java.util.PropertyPermission "java.vm.name", "read";
+};
+
diff --git a/demos/lunaL.ppm b/demos/lunaL.ppm
new file mode 100644
index 0000000..aaf7c41
--- /dev/null
+++ b/demos/lunaL.ppm
Binary files differ
diff --git a/demos/makefile b/demos/makefile
new file mode 100644
index 0000000..56422c8
--- /dev/null
+++ b/demos/makefile
@@ -0,0 +1,36 @@
+JAVAC = javac
+
+
+JAVA_APPL_FILES = olympicCvs.java \
+ starCvs.java \
+ waveCvs.java \
+ glOlympicCvsApplet.java \
+ glOlympicSwingApplet.java \
+ glLogoCvs.java \
+ glLogoCvsApplet.java \
+ glDemosCvs.java \
+ testTextPPM1.java
+
+.SUFFIXES : .java .class
+
+.java.class:
+ $(JAVAC) -deprecation $< 2>&1 | tee -a errors
+
+all: ${JAVA_APPL_FILES:.java=.class}
+
+showdest:
+ echo ${JAVA_APPL_FILES:.java=.class} ${C_APPL_FILES:.c=.o}
+
+clean:
+ rm -f *.o *~ errors *.dll
+
+cleanall: clean
+ rm -f *.class ${C_APPL_FILES:.c=}
+ rm -f $(find . -name \*.o -o -name \*.exe )
+
+windllcpy:
+ cp /WIN_NT/system32/opengl32.dll .
+ cp /WIN_NT/system32/opengl.dll .
+ cp /WIN_NT/system32/gl4java.dll .
+ cp /WIN_NT/system32/gl4java32.dll .
+
diff --git a/demos/natives/bc5/cube.c b/demos/natives/bc5/cube.c
new file mode 100644
index 0000000..34c2f47
--- /dev/null
+++ b/demos/natives/bc5/cube.c
@@ -0,0 +1,289 @@
+#include <windows.h>
+#include <GL/gl.h>
+
+char *className = "OpenGL";
+char *windowName = "OpenGL Cube";
+int winX = 0, winY = 0;
+int winWidth = 300, winHeight = 300;
+
+HDC hDC;
+HGLRC hGLRC;
+HPALETTE hPalette;
+
+void
+init(void)
+{
+ /* set viewing projection */
+ glMatrixMode(GL_PROJECTION);
+ glFrustum(-0.5F, 0.5F, -0.5F, 0.5F, 1.0F, 3.0F);
+
+ /* position viewer */
+ glMatrixMode(GL_MODELVIEW);
+ glTranslatef(0.0F, 0.0F, -2.0F);
+
+ /* position object */
+ glRotatef(30.0F, 1.0F, 0.0F, 0.0F);
+ glRotatef(30.0F, 0.0F, 1.0F, 0.0F);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+}
+
+void
+redraw(void)
+{
+ /* clear color and depth buffers */
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* draw six faces of a cube */
+ glBegin(GL_QUADS);
+ glNormal3f( 0.0F, 0.0F, 1.0F);
+ glVertex3f( 0.5F, 0.5F, 0.5F); glVertex3f(-0.5F, 0.5F, 0.5F);
+ glVertex3f(-0.5F,-0.5F, 0.5F); glVertex3f( 0.5F,-0.5F, 0.5F);
+
+ glNormal3f( 0.0F, 0.0F,-1.0F);
+ glVertex3f(-0.5F,-0.5F,-0.5F); glVertex3f(-0.5F, 0.5F,-0.5F);
+ glVertex3f( 0.5F, 0.5F,-0.5F); glVertex3f( 0.5F,-0.5F,-0.5F);
+
+ glNormal3f( 0.0F, 1.0F, 0.0F);
+ glVertex3f( 0.5F, 0.5F, 0.5F); glVertex3f( 0.5F, 0.5F,-0.5F);
+ glVertex3f(-0.5F, 0.5F,-0.5F); glVertex3f(-0.5F, 0.5F, 0.5F);
+
+ glNormal3f( 0.0F,-1.0F, 0.0F);
+ glVertex3f(-0.5F,-0.5F,-0.5F); glVertex3f( 0.5F,-0.5F,-0.5F);
+ glVertex3f( 0.5F,-0.5F, 0.5F); glVertex3f(-0.5F,-0.5F, 0.5F);
+
+ glNormal3f( 1.0F, 0.0F, 0.0F);
+ glVertex3f( 0.5F, 0.5F, 0.5F); glVertex3f( 0.5F,-0.5F, 0.5F);
+ glVertex3f( 0.5F,-0.5F,-0.5F); glVertex3f( 0.5F, 0.5F,-0.5F);
+
+ glNormal3f(-1.0F, 0.0F, 0.0F);
+ glVertex3f(-0.5F,-0.5F,-0.5F); glVertex3f(-0.5F,-0.5F, 0.5F);
+ glVertex3f(-0.5F, 0.5F, 0.5F); glVertex3f(-0.5F, 0.5F,-0.5F);
+ glEnd();
+
+ SwapBuffers(hDC);
+}
+
+void
+resize(void)
+{
+ /* set viewport to cover the window */
+ glViewport(0, 0, winWidth, winHeight);
+}
+
+void
+setupPixelFormat(HDC hDC)
+{
+ PIXELFORMATDESCRIPTOR pfd = {
+ sizeof(PIXELFORMATDESCRIPTOR), /* size */
+ 1, /* version */
+ PFD_SUPPORT_OPENGL |
+ PFD_DRAW_TO_WINDOW |
+ PFD_DOUBLEBUFFER, /* support double-buffering */
+ PFD_TYPE_RGBA, /* color type */
+ 16, /* prefered color depth */
+ 0, 0, 0, 0, 0, 0, /* color bits (ignored) */
+ 0, /* no alpha buffer */
+ 0, /* alpha bits (ignored) */
+ 0, /* no accumulation buffer */
+ 0, 0, 0, 0, /* accum bits (ignored) */
+ 16, /* depth buffer */
+ 0, /* no stencil buffer */
+ 0, /* no auxiliary buffers */
+ PFD_MAIN_PLANE, /* main layer */
+ 0, /* reserved */
+ 0, 0, 0, /* no layer, visible, damage masks */
+ };
+ int pixelFormat;
+
+ pixelFormat = ChoosePixelFormat(hDC, &pfd);
+ if (pixelFormat == 0) {
+ MessageBox(WindowFromDC(hDC), "ChoosePixelFormat failed.", "Error",
+ MB_ICONERROR | MB_OK);
+ exit(1);
+ }
+
+ if (SetPixelFormat(hDC, pixelFormat, &pfd) != TRUE) {
+ MessageBox(WindowFromDC(hDC), "SetPixelFormat failed.", "Error",
+ MB_ICONERROR | MB_OK);
+ exit(1);
+ }
+}
+
+void
+setupPalette(HDC hDC)
+{
+ int pixelFormat = GetPixelFormat(hDC);
+ PIXELFORMATDESCRIPTOR pfd;
+ LOGPALETTE* pPal;
+ int paletteSize;
+
+ DescribePixelFormat(hDC, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
+
+ if (pfd.dwFlags & PFD_NEED_PALETTE) {
+ paletteSize = 1 << pfd.cColorBits;
+ } else {
+ return;
+ }
+
+ pPal = (LOGPALETTE*)
+ malloc(sizeof(LOGPALETTE) + paletteSize * sizeof(PALETTEENTRY));
+ pPal->palVersion = 0x300;
+ pPal->palNumEntries = paletteSize;
+
+ /* build a simple RGB color palette */
+ {
+ int redMask = (1 << pfd.cRedBits) - 1;
+ int greenMask = (1 << pfd.cGreenBits) - 1;
+ int blueMask = (1 << pfd.cBlueBits) - 1;
+ int i;
+
+ for (i=0; i<paletteSize; ++i) {
+ pPal->palPalEntry[i].peRed =
+ (((i >> pfd.cRedShift) & redMask) * 255) / redMask;
+ pPal->palPalEntry[i].peGreen =
+ (((i >> pfd.cGreenShift) & greenMask) * 255) / greenMask;
+ pPal->palPalEntry[i].peBlue =
+ (((i >> pfd.cBlueShift) & blueMask) * 255) / blueMask;
+ pPal->palPalEntry[i].peFlags = 0;
+ }
+ }
+
+ hPalette = CreatePalette(pPal);
+ free(pPal);
+
+ if (hPalette) {
+ SelectPalette(hDC, hPalette, FALSE);
+ RealizePalette(hDC);
+ }
+}
+
+LRESULT APIENTRY
+WndProc(
+ HWND hWnd,
+ UINT message,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ switch (message) {
+ case WM_CREATE:
+ /* initialize OpenGL rendering */
+ hDC = GetDC(hWnd);
+ setupPixelFormat(hDC);
+ setupPalette(hDC);
+ hGLRC = wglCreateContext(hDC);
+ wglMakeCurrent(hDC, hGLRC);
+ init();
+ return 0;
+ case WM_DESTROY:
+ /* finish OpenGL rendering */
+ if (hGLRC) {
+ wglMakeCurrent(NULL, NULL);
+ wglDeleteContext(hGLRC);
+ }
+ if (hPalette) {
+ DeleteObject(hPalette);
+ }
+ ReleaseDC(hWnd, hDC);
+ PostQuitMessage(0);
+ return 0;
+ case WM_SIZE:
+ /* track window size changes */
+ if (hGLRC) {
+ winWidth = (int) LOWORD(lParam);
+ winHeight = (int) HIWORD(lParam);
+ resize();
+ return 0;
+ }
+ case WM_PALETTECHANGED:
+ /* realize palette if this is *not* the current window */
+ if (hGLRC && hPalette && (HWND) wParam != hWnd) {
+ UnrealizeObject(hPalette);
+ SelectPalette(hDC, hPalette, FALSE);
+ RealizePalette(hDC);
+ redraw();
+ break;
+ }
+ break;
+ case WM_QUERYNEWPALETTE:
+ /* realize palette if this is the current window */
+ if (hGLRC && hPalette) {
+ UnrealizeObject(hPalette);
+ SelectPalette(hDC, hPalette, FALSE);
+ RealizePalette(hDC);
+ redraw();
+ return TRUE;
+ }
+ break;
+ case WM_PAINT:
+ {
+ PAINTSTRUCT ps;
+ BeginPaint(hWnd, &ps);
+ if (hGLRC) {
+ redraw();
+ }
+ EndPaint(hWnd, &ps);
+ return 0;
+ }
+ break;
+ case WM_CHAR:
+ /* handle keyboard input */
+ switch ((int)wParam) {
+ case VK_ESCAPE:
+ DestroyWindow(hWnd);
+ return 0;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ return DefWindowProc(hWnd, message, wParam, lParam);
+}
+
+int APIENTRY
+WinMain(
+ HINSTANCE hCurrentInst,
+ HINSTANCE hPreviousInst,
+ LPSTR lpszCmdLine,
+ int nCmdShow)
+{
+ WNDCLASS wndClass;
+ HWND hWnd;
+ MSG msg;
+
+ /* register window class */
+ wndClass.style = CS_HREDRAW | CS_VREDRAW;
+ wndClass.lpfnWndProc = WndProc;
+ wndClass.cbClsExtra = 0;
+ wndClass.cbWndExtra = 0;
+ wndClass.hInstance = hCurrentInst;
+ wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+ wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wndClass.hbrBackground = GetStockObject(BLACK_BRUSH);
+ wndClass.lpszMenuName = NULL;
+ wndClass.lpszClassName = className;
+ RegisterClass(&wndClass);
+
+ /* create window */
+ hWnd = CreateWindow(
+ className, windowName,
+ WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
+ winX, winY, winWidth, winHeight,
+ NULL, NULL, hCurrentInst, NULL);
+
+ /* display window */
+ ShowWindow(hWnd, nCmdShow);
+ UpdateWindow(hWnd);
+
+ /* process messages */
+ while (GetMessage(&msg, NULL, 0, 0) == TRUE) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+ return msg.wParam;
+}
+ \ No newline at end of file
diff --git a/demos/natives/bc5/cube.ide b/demos/natives/bc5/cube.ide
new file mode 100644
index 0000000..d2fab99
--- /dev/null
+++ b/demos/natives/bc5/cube.ide
Binary files differ
diff --git a/demos/natives/bc5/testGL1.c b/demos/natives/bc5/testGL1.c
new file mode 100644
index 0000000..b0094f1
--- /dev/null
+++ b/demos/natives/bc5/testGL1.c
@@ -0,0 +1,224 @@
+
+
+
+
+ #include <windows.h>
+
+ #include <stdio.h>
+ #include <stdlib.h>
+
+#include <GL/gl.h>
+#include <GL/glut.h>
+
+double width = 250;
+double height = 250;
+double fps = 25.0;
+
+ static float lmodel_twoside[] =
+ {GL_FALSE};
+ static float lmodel_local[] =
+ {GL_FALSE};
+ static float lmodel_ambient[] =
+ {0.0, 0.0, 0.0, 0.0};
+
+void CylinderDraw( )
+{
+ glBegin( GL_TRIANGLE_STRIP );
+ glNormal3f ( 1.0, 0.0, -5.0 );
+ glVertex3f ( 1.0, 0.0, -5.0 );
+ glNormal3f ( 1.0, 0.0, -5.0 );
+ glVertex3f (1.000000, 0.000000, 5.000000);
+ glNormal3f (0.707107, 0.707107, -5.000000);
+ glVertex3f (0.707107, 0.707107, -5.000000);
+ glNormal3f (0.707107, 0.707107, -5.000000);
+ glVertex3f (0.707107, 0.707107, 5.000000);
+ glNormal3f (0.000000, 1.000000, -5.000000);
+ glVertex3f (0.000000, 1.000000, -5.000000);
+ glNormal3f (0.000000, 1.000000, -5.000000);
+ glVertex3f (0.000000, 1.000000, 5.000000);
+ glNormal3f (-0.707107, 0.707107, -5.00000);
+ glVertex3f (-0.707107, 0.707107, -5.00000);
+ glNormal3f (-0.707107, 0.707107, -5.00000);
+ glVertex3f (-0.707107, 0.707107, 5.00000);
+ glNormal3f (-1.000000, 0.000000, -5.000000);
+ glVertex3f (-1.000000, 0.000000, -5.000000);
+ glNormal3f (-1.000000, 0.000000, -5.000000);
+ glVertex3f (-1.000000, 0.000000, 5.00000);
+ glNormal3f (-0.707107, -0.707107, -5.000000);
+ glVertex3f (-0.707107, -0.707107, -5.000000);
+ glNormal3f (-0.707107, -0.707107, -5.000000);
+ glVertex3f (-0.707107, -0.707107, 5.00000);
+ glNormal3f (0.000000, -1.000000, -5.000000);
+ glVertex3f (0.000000, -1.000000, -5.000000);
+ glNormal3f (0.000000, -1.000000, -5.000000);
+ glVertex3f (0.000000, -1.000000, 5.00000);
+ glNormal3f (0.707107, -0.707107, -5.00000);
+ glVertex3f (0.707107, -0.707107, -5.00000);
+ glNormal3f (0.707107, -0.707107, -5.00000);
+ glVertex3f (0.707107, -0.707107, 5.000000);
+ glNormal3f (1.000000, 0.000000, -5.00000);
+ glVertex3f (1.000000, 0.000000, -5.00000);
+ glNormal3f (1.000000, 0.000000, -5.00000);
+ glVertex3f (1.000000, 0.000000, 5.00000);
+ glEnd();
+}
+
+void reshape(int width, int height)
+{
+ double fov = 45.0,
+ aspect = width / height,
+ near_ = 1.0,
+ far_ = 200.0;
+
+ glViewport( 0, 0, width, height );
+
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+
+ gluPerspective( fov, aspect, near_, far_ );
+
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+
+}
+
+void display()
+{
+ static int FrameStep = 0;
+
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ glPushMatrix();
+ glTranslatef( 0.0, 0.0, -65.0 );
+ glRotatef( 40.0+(2*FrameStep), 0.0, 0.0, 1.0 );
+ glRotatef( 190.0+(2*FrameStep), 0.0, 1.0, 0.0 );
+ glRotatef( 200.0+(FrameStep*2), 1.0, 0.0, 0.0 );
+ glPushMatrix();
+ glScalef( 1.0, 1.0, 10.0 );
+ CylinderDraw( );
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef( 90.0, 0.0, 1.0, 0.0 );
+ glScalef( 1.0, 1.0, 10.0 );
+ CylinderDraw( );
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef( 90.0, 1.0, 0.0, 0.0 );
+ glScalef( 1.0, 1.0, 10.0 );
+ CylinderDraw( );
+ glPopMatrix();
+ glPopMatrix();
+
+ glutSwapBuffers();
+ /* glFlush(); */
+
+ FrameStep++;
+
+ if(FrameStep>100000) FrameStep=0;
+
+}
+
+void init()
+{
+ double fov = 45.0;
+ double aspect = width / height ;
+ double near_ = 1.0;
+ double far_ = 200.0;
+ float lightArr[4];
+ float farr[4];
+
+ /* initialize the widget */
+ glClearColor( 0.8f, 0.8f, 1.0f, 1.0f );
+ glFrontFace( GL_CW );
+ glEnable( GL_DEPTH_TEST );
+
+ glViewport( 0, 0, width, height );
+
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+
+ gluPerspective( fov, aspect, near_, far_ );
+
+ /* render three rotated cylinders */
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+
+ /* enable lighting */
+ lightArr[0] = 1.0f; lightArr[1] = 1.0f;
+ lightArr[2] = 1.0f; lightArr[3] = 1.0f;
+ glLightfv( GL_LIGHT0, GL_DIFFUSE, lightArr );
+ lightArr[0] = 90.0f; lightArr[1] = 90.0f;
+ lightArr[2] = 0.0f; lightArr[3] = 0.0f;
+ glLightfv( GL_LIGHT0, GL_POSITION, lightArr );
+ lightArr[0] = 0.1f; lightArr[1] = 0.1f;
+ lightArr[2] = 0.1f; lightArr[3] = 1.0f;
+ glLightfv( GL_LIGHT0, GL_AMBIENT, lightArr );
+ glEnable( GL_LIGHT0 );
+
+ /*
+ glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_local);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ */
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
+ glEnable( GL_LIGHTING );
+
+ /*
+ glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_local);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glEnable( GL_LIGHTING );
+ */
+
+
+ glMaterialf( GL_FRONT, GL_SHININESS, 30.0f );
+
+ farr[0] = 0.0f; farr[1] = 0.0f; farr[2] = 0.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_FRONT, GL_SPECULAR, farr );
+
+ farr[0] = 0.0f; farr[1] = 1.0f; farr[2] = 0.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_FRONT, GL_DIFFUSE, farr );
+
+ glMaterialf( GL_BACK, GL_SHININESS, 50.0f );
+
+ farr[0] = 0.0f; farr[1] = 0.0f; farr[2] = 1.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_BACK, GL_SPECULAR, farr );
+
+ farr[0] = 1.0f; farr[1] = 1.0f; farr[2] = 0.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_BACK, GL_DIFFUSE, farr );
+
+}
+
+void idle()
+{
+ glutPostRedisplay();
+}
+
+int main( int argc, char **argv)
+{
+ fprintf(stderr,"1\n");
+ if(argc>2 && strcmp(argv[1], "-fps")==0)
+ {
+ fprintf(stderr,"2\n");
+ fps = atof(argv[2]);
+ argc-=2;
+ argv+=2;
+ }
+ fprintf(stderr, "Frame Per Secounds %d\n ( will be ignored this time )\n", fps);
+
+ glutInit(&argc, argv);
+ glutInitDisplayMode ( GLUT_DOUBLE
+ | GLUT_DEPTH
+ | GLUT_RGBA
+ );
+ glutInitWindowSize(width,height);
+ glutInitWindowPosition(100,100);
+ glutCreateWindow("OpenGL GLUT/NATIVE");
+ init();
+ glutDisplayFunc(display);
+ glutReshapeFunc(reshape);
+ glutIdleFunc(idle);
+ glutMainLoop();
+ return 0;
+}
+
diff --git a/demos/natives/bc5/testGL1.ide b/demos/natives/bc5/testGL1.ide
new file mode 100644
index 0000000..d2fab99
--- /dev/null
+++ b/demos/natives/bc5/testGL1.ide
Binary files differ
diff --git a/demos/natives/wgl.c b/demos/natives/wgl.c
new file mode 100644
index 0000000..15119e8
--- /dev/null
+++ b/demos/natives/wgl.c
@@ -0,0 +1,517 @@
+/*****************************************************************
+
+ Xmame OpenGL driver
+
+ Written based on the x11 driver by Mike Oliphant - [email protected]
+
+ http://www.ling.ed.ac.uk/~oliphant/glmame
+
+ This code may be used and distributed under the terms of the
+ Mame license
+
+*****************************************************************/
+/* pretend we're x11.c otherwise display and a few other crucial things don't
+ get declared */
+#define __X11_C_
+#define __XOPENGL_C_
+
+#define RRand(range) (random()%range)
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <windowsx.h>
+#include <assert.h>
+#include <string.h>
+#include <excpt.h>
+#include "common.h"
+#include "usrintrf.h"
+#include "osdepend.h"
+#include "mame.h"
+#include "driver.h"
+#include "MAME32.h"
+#include "Display.h"
+#include "Sound.h"
+#include "Keyboard.h"
+#include "Joystick.h"
+#include "Trak.h"
+#include "resource.h"
+#include "M32Util.h"
+
+#include "wgl.h"
+
+/*
+#ifndef NOSEAL
+#include "SealSound.h" /* For sound devices.
+#endif
+*/
+
+struct GameOptions mame_options;
+static void MamePlayGame();
+static int page_index;
+static game_data_type* game_data;
+static int game_count;
+
+static int last_sort = 0;
+
+/* global data--know where to send messages */
+static BOOL in_emulation;
+
+/* quit after game */
+static BOOL quit;
+
+/* idle work at startup */
+static BOOL idle_work;
+static int game_index;
+
+int winwidth=640;
+int winheight=480;
+float fxgamma=1.0;
+
+static HDC thisWin;
+static HWND thisHwnd;
+/*
+static wglWnd thisCwnd;
+*/
+static HGLRC cx;
+
+static int fx=0;
+static int fxwin=0;
+extern int screendirty;
+extern int doublebuffer;
+extern int dodepth;
+
+/***************************************************************************
+ Function prototypes
+ ***************************************************************************/
+
+static LRESULT CALLBACK MAME32_MessageProc(HWND, UINT, WPARAM, LPARAM);
+static HWND MAME32_CreateWindow(void);
+static void MAME32_ProcessMessages(void);
+static BOOL MAME32_PumpAndReturnMessage(MSG* pMsg);
+static void MAME32_Quit(void);
+static BOOL OnMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT* pResult);
+static void OnActivateApp(HWND hWnd, BOOL fActivate, DWORD dwThreadId);
+static void OnSysCommand(HWND hWnd, UINT cmd, int x, int y);
+static void OnClose(HWND hWnd);
+
+/***************************************************************************
+ External variables
+ ***************************************************************************/
+
+/*
+struct tMAME32App MAME32App =
+{
+ { NULL }, /* m_hwndUI
+ { NULL }, /* m_hWnd
+ { "MAME32" }, /* m_pName
+ { FALSE }, /* m_bIsInitialized
+ { FALSE }, /* m_bIsActive
+ { FALSE }, /* m_bPaused
+ { FALSE }, /* m_bMMXDetected
+ { FALSE }, /* m_bUseAIMouse
+ { NULL }, /* m_pDisplay
+ { NULL }, /* m_pSound
+ { NULL }, /* m_pKeyboard
+ { NULL }, /* m_pJoystick
+ { NULL }, /* m_pTrak
+ { NULL }, /* m_pFMSynth
+
+ { MAME32_CreateWindow }, /* CreateMAMEWindow
+ { MAME32_ProcessMessages }, /* ProcessMessages
+ { MAME32_PumpAndReturnMessage }, /* PumpAndReturnMessage
+ { MAME32_Quit }, /* Quit
+ { NULL } /* detect MMX
+};
+*/
+
+/***************************************************************************
+ Internal structures
+ ***************************************************************************/
+
+/***************************************************************************
+ Internal variables
+ ***************************************************************************/
+
+static BOOL auto_pause;
+
+/***************************************************************************
+ External functions
+ ***************************************************************************/
+
+/*
+void MAME32App_init(options_type *options)
+{
+ MAME32App.m_hWnd = NULL;
+
+ MAME32App.m_bIsInitialized = FALSE;
+ MAME32App.m_bIsActive = FALSE;
+ MAME32App.m_bIsPaused = FALSE;
+
+ MAME32App.m_pDisplay = NULL;
+ MAME32App.m_pSound = NULL;
+ MAME32App.m_pKeyboard = NULL;
+ MAME32App.m_pJoystick = NULL;
+ MAME32App.m_pTrak = NULL;
+ MAME32App.m_pFMSynth = NULL;
+
+ auto_pause = options->auto_pause;
+
+ /*
+ Machine->scrbitmap is not initialized in the mame source
+ until after the call to osd_create_display().
+ This causes a problem if osd_create_display() detects an error,
+ then shows the error message box, which causes focus to change,
+ which causes OnPause() to be called, which uses Machine->scrbitmap.
+ Whew. So it needs to be set to NULL so it doesn't crash in OnPause().
+ /
+ Machine->scrbitmap = NULL;
+}
+*/
+
+
+
+/***************************************************************************
+ Internal OPENGL functions
+ ***************************************************************************/
+
+// Color Palette handle
+HPALETTE hPalette = NULL;
+// Set Pixel Format function - forward declaration
+void SetDCPixelFormat(HDC hDC);
+HPALETTE GetOpenGLPalette(HDC hDC);
+HGLRC tempRC;
+
+static HGLRC get_GC( HDC hDC )
+{
+ if( hDC == 0 )
+ return 0; /* printf( "get_GC: Error, HDC is zero\n"); */
+
+ // Select the pixel format
+ SetDCPixelFormat(hDC);
+
+ // Create palette if needed
+ hPalette = GetOpenGLPalette(hDC);
+
+ tempRC = wglCreateContext( hDC );
+
+ /* check if the context could be created */
+ if( tempRC == NULL ) {
+ /* fprintf(stderr, "getGC context could NOT be created \n"); */
+ return( 0 );
+ }
+
+ /* associated the context with the X window */
+ if( wglMakeCurrent( hDC, tempRC ) == FALSE) {
+ wglDeleteContext( tempRC );
+ return( 0 );
+ }
+
+ return tempRC;
+}
+
+// Select the pixel format for a given device context
+void SetDCPixelFormat(HDC hDC)
+{
+ int nPixelFormat=0;
+
+ static PIXELFORMATDESCRIPTOR pfd = {
+ sizeof(PIXELFORMATDESCRIPTOR), // Size of this structure
+ 1, // Version of this structure
+ PFD_DRAW_TO_WINDOW | // Draw to Window (not to bitmap)
+ PFD_SUPPORT_OPENGL | // Support OpenGL calls in window
+ PFD_DOUBLEBUFFER, // Double buffered
+ PFD_TYPE_RGBA, // RGBA Color mode
+ 24, // Want 24bit color
+ 0,0,0,0,0,0, // Not used to select mode
+ 0,0, // Not used to select mode
+ 0,0,0,0,0, // Not used to select mode
+ 32, // Size of depth buffer
+ 0, // Not used to select mode
+ 0, // Not used to select mode
+ PFD_MAIN_PLANE, // Draw in main plane
+ 0, // Not used to select mode
+ 0,0,0 }; // Not used to select mode
+
+ // Choose a pixel format that best matches that described in pfd
+ nPixelFormat = ChoosePixelFormat(hDC, &pfd);
+
+ // Set the pixel format for the device context
+ if(SetPixelFormat(hDC, nPixelFormat, &pfd)==FALSE)
+ MessageBox(thisHwnd, "could not set PixelFormat", "ERROR",
+ MB_OK|MB_ICONERROR);
+
+}
+
+
+// If necessary, creates a 3-3-2 palette for the device context listed.
+HPALETTE GetOpenGLPalette(HDC hDC)
+{
+ HPALETTE hRetPal = NULL; // Handle to palette to be created
+ PIXELFORMATDESCRIPTOR pfd; // Pixel Format Descriptor
+ LOGPALETTE *pPal; // Pointer to memory for logical palette
+ int nPixelFormat; // Pixel format index
+ int nColors; // Number of entries in palette
+ int i; // Counting variable
+ BYTE RedRange,GreenRange,BlueRange;
+ // Range for each color entry (7,7,and 3)
+
+
+ // Get the pixel format index and retrieve the pixel format description
+ nPixelFormat = GetPixelFormat(hDC);
+ DescribePixelFormat(hDC, nPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
+
+ // Does this pixel format require a palette? If not, do not create a
+ // palette and just return NULL
+ if(!(pfd.dwFlags & PFD_NEED_PALETTE))
+ return NULL;
+
+ // Number of entries in palette. 8 bits yeilds 256 entries
+ nColors = 1 << pfd.cColorBits;
+
+ // Allocate space for a logical palette structure plus all the palette entries
+ pPal = (LOGPALETTE*)malloc(sizeof(LOGPALETTE) + nColors*sizeof(PALETTEENTRY));
+
+ // Fill in palette header
+ pPal->palVersion = 0x300; // Windows 3.0
+ pPal->palNumEntries = nColors; // table size
+
+ // Build mask of all 1's. This creates a number represented by having
+ // the low order x bits set, where x = pfd.cRedBits, pfd.cGreenBits, and
+ // pfd.cBlueBits.
+ RedRange = (1 << pfd.cRedBits) -1;
+ GreenRange = (1 << pfd.cGreenBits) - 1;
+ BlueRange = (1 << pfd.cBlueBits) -1;
+
+ // Loop through all the palette entries
+ for(i = 0; i < nColors; i++)
+ {
+ // Fill in the 8-bit equivalents for each component
+ pPal->palPalEntry[i].peRed = (i >> pfd.cRedShift) & RedRange;
+ pPal->palPalEntry[i].peRed = (unsigned char)(
+ (double) pPal->palPalEntry[i].peRed * 255.0 / RedRange);
+
+ pPal->palPalEntry[i].peGreen = (i >> pfd.cGreenShift) & GreenRange;
+ pPal->palPalEntry[i].peGreen = (unsigned char)(
+ (double)pPal->palPalEntry[i].peGreen * 255.0 / GreenRange);
+
+ pPal->palPalEntry[i].peBlue = (i >> pfd.cBlueShift) & BlueRange;
+ pPal->palPalEntry[i].peBlue = (unsigned char)(
+ (double)pPal->palPalEntry[i].peBlue * 255.0 / BlueRange);
+
+ pPal->palPalEntry[i].peFlags = (unsigned char) NULL;
+ }
+
+
+ // Create the palette
+ hRetPal = CreatePalette(pPal);
+
+ // Go ahead and select and realize the palette for this device context
+ SelectPalette(hDC,hRetPal,FALSE);
+ RealizePalette(hDC);
+
+ // Free the memory used for the logical palette structure
+ free(pPal);
+
+ // Return the handle to the new palette
+ return hRetPal;
+}
+
+
+/***************************************************************************
+ Internal functions
+ ***************************************************************************/
+
+/* Create display */
+
+static BOOL Win32UI_init(HINSTANCE hInstance, LPSTR lpCmdLine, int nCmdShow)
+{
+ static BOOL bRegistered = FALSE;
+
+ if (bRegistered == FALSE)
+ {
+ WNDCLASS WndClass;
+
+ WndClass.style = CS_SAVEBITS | CS_BYTEALIGNCLIENT | CS_OWNDC;
+ WndClass.lpfnWndProc = MAME32_MessageProc;
+ WndClass.cbClsExtra = 0;
+ WndClass.cbWndExtra = 0;
+ WndClass.hInstance = hInstance;
+ WndClass.hIcon = LoadIcon(hInstance, MAKEINTATOM(IDI_MAME32_ICON));
+ WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
+ WndClass.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
+ WndClass.lpszMenuName = NULL;
+ WndClass.lpszClassName = (LPCSTR)"classMAME32";
+
+ if (RegisterClass(&WndClass) == 0)
+ return FALSE;
+ bRegistered = TRUE;
+ }
+
+ thisHwnd = CreateWindowEx(0,
+ "classMAME32",
+ "WGLMAME" ,
+ WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME | WS_BORDER,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ 640, 480,
+ NULL,
+ NULL,
+ hInstance,
+ NULL);
+
+ ShowWindow(thisHwnd, nCmdShow);
+
+ /* thisCwnd.attach(thisHwnd); */
+ thisWin = GetDC(thisHwnd);
+
+ wglMakeCurrent(NULL, NULL);
+
+ /* get the graphics context for this widget */
+ if( (cx = get_GC( thisWin )) == 0 )
+ {
+ MessageBox(thisHwnd, "could not create GLContext", "ERROR",
+ MB_OK|MB_ICONERROR);
+
+ } else {
+ MessageBox(thisHwnd, "could create GLContext", "OK", MB_OK);
+ }
+
+ SetFocus(thisHwnd);
+
+ return thisHwnd!=NULL;
+}
+
+static LRESULT CALLBACK MAME32_MessageProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
+{
+ LRESULT Result = 0;
+ HDC hdc = 0;
+
+ switch(Msg)
+ {
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0L;
+
+ case WM_QUIT:
+ OnClose(thisHwnd);
+ return 0;
+
+ case WM_PAINT:
+ hdc = (HDC) wParam;
+ return DefWindowProc(hWnd, Msg, wParam, lParam);
+ }
+ return DefWindowProc(hWnd, Msg, wParam, lParam);
+}
+
+
+static void OnClose(HWND hWnd)
+{
+ /* Don't call DestroyWindow, it will be called by osd_exit. */
+ wglMakeCurrent(NULL, NULL);
+ DestroyWindow(thisHwnd);
+}
+
+
+static BOOL idle_work;
+
+
+int WINAPI WinMain(HINSTANCE hInstance,
+ HINSTANCE hPrevInstance,
+ LPSTR lpCmdLine,
+ int nCmdShow)
+{
+ MSG msg;
+
+ if (!Win32UI_init(hInstance, lpCmdLine, nCmdShow))
+ {
+ MessageBox(thisHwnd, "could not create window ...", "ERROR",
+ MB_OK|MB_ICONERROR);
+ OnClose(thisHwnd);
+ return 1;
+ }
+
+ /* Set the samplerate to 0 if sound is disabled,
+ this should notify mame not to "render" it (speed improvement) */
+ Machine->sample_rate = 0;
+ mame_options.samplerate = 0;
+
+ /*
+ Simplified MFC Run() alg. See mfc/src/thrdcore.cpp.
+ */
+ /* phase2: pump messages while available */
+ while (GetMessage(&msg, NULL, 0, 0))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+ return 0;
+}
+
+
+void MamePlayGame()
+{
+ char buf[1000];
+ int index = 0;
+
+ if (run_game(index ,&mame_options) != 0)
+ {
+ const struct RomModule *romp = drivers[index]->rom;
+
+ /* This needs to be changed to use a window with a scrollbar
+ * because the list can be too large to fit on the screen.
+ */
+ sprintf(buf, "Unable to initialize machine emulation.\r\n\r\n"
+ "Most likely you have a corrupt ROM file.\r\n"
+ "The following files must exist in the specified\r\n"
+ "directory or .zip file for %s to run.\r\n\r\n",
+ drivers[index]->description);
+
+ sprintf(buf + strlen(buf), "Directory:\r\n");
+ GetCurrentDirectory(sizeof(buf) - strlen(buf), buf + strlen(buf));
+ sprintf(buf + strlen(buf), "\\%s\r\n\r\n", drivers[index]->name);
+ sprintf(buf + strlen(buf), "or .zip file:\r\n");
+ GetCurrentDirectory(sizeof(buf) - strlen(buf), buf + strlen(buf));
+ sprintf(buf + strlen(buf), "\\roms\\%s.zip\r\n\r\n", drivers[index]->name);
+
+ sprintf(buf + strlen(buf), "Files:\r\n");
+ while (romp->name || romp->offset || romp->length)
+ {
+ romp++; /* skip memory region definition */
+
+ while (romp->length)
+ {
+ char name[100];
+ int length;
+
+ sprintf(name, romp->name, drivers[index]->name);
+
+ length = 0;
+
+ do
+ {
+ /* ROM_RELOAD */
+ if (romp->name == (char *)-1)
+ length = 0; /* restart */
+
+ length += romp->length & ~0x80000000;
+
+ romp++;
+ } while (romp->length && (romp->name == 0 || romp->name == (char *)-1));
+
+ sprintf(buf + strlen(buf), "%-12s\t%u bytes\n", name, length);
+ }
+ }
+
+ MessageBox(thisHwnd, buf, "MAME32 Error", MB_OK | MB_ICONERROR);
+ }
+
+ in_emulation = FALSE;
+
+ if (quit)
+ {
+ PostMessage(thisHwnd, WM_CLOSE, 0, 0);
+ return;
+ }
+
+}
diff --git a/demos/natives/wgl.h b/demos/natives/wgl.h
new file mode 100644
index 0000000..5ebe096
--- /dev/null
+++ b/demos/natives/wgl.h
@@ -0,0 +1,81 @@
+/***************************************************************************
+
+ M.A.M.E.32 - Multiple Arcade Machine Emulator for Win32
+ Win32 Portions Copyright (C) 1997-98 Michael Soderstrom and Chris Kirmse
+
+ This file is part of MAME32, and may only be used, modified and
+ distributed under the terms of the MAME license, in "readme.txt".
+ By continuing to use, modify or distribute this file you indicate
+ that you have read the license and understand and accept it fully.
+
+ ***************************************************************************/
+
+#ifndef __MAME32_H__
+#define __MAME32_H__
+
+#include <math.h>
+/*JAU #include <X11/cursorfont.h> */
+#include <windows.h>
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include <wingdi.h>
+
+
+#define HANDLE_MESSAGE(hwnd, message, fn) \
+ case (message): \
+ { \
+ *pResult = HANDLE_##message((hwnd), (wParam), (lParam), (fn)); \
+ return TRUE; \
+ }
+
+#define PEEK_MESSAGE(hwnd, message, fn) \
+ case (message): \
+ { \
+ *pResult = HANDLE_##message((hwnd), (wParam), (lParam), (fn)); \
+ return FALSE; \
+ }
+
+/*
+struct tMAME32App
+{
+ HWND m_hwndUI;
+ HWND m_hWnd;
+ const char* m_Name;
+
+ BOOL m_bIsInitialized;
+ BOOL m_bIsActive;
+ BOOL m_bIsPaused;
+
+ BOOL m_bMMXDetected;
+
+ TRUE if using m_pTrak for standard analog inputs,
+ FALSE if using m_pJoystick for standard analog inputs.
+ BOOL m_bUseAIMouse;
+
+ struct OSDDisplay* m_pDisplay;
+ struct OSDSound* m_pSound;
+ struct OSDKeyboard* m_pKeyboard;
+ struct OSDJoystick* m_pJoystick;
+ struct OSDTrak* m_pTrak;
+
+ struct OSDFMSynth* m_pFMSynth;
+
+ HWND (*CreateMAMEWindow)(void);
+ void (*ProcessMessages)(void);
+ BOOL (*PumpAndReturnMessage)(MSG* pMsg);
+ void (*Quit)(void);
+ BOOL (*DetectMMX)(void);
+};
+
+extern struct tMAME32App MAME32App;
+
+*/
+
+/*
+class wglWnd : CWnd
+{
+}
+*/
+
+
+#endif
diff --git a/demos/natives/x11/cube.c b/demos/natives/x11/cube.c
new file mode 100644
index 0000000..6f2fd57
--- /dev/null
+++ b/demos/natives/x11/cube.c
@@ -0,0 +1,95 @@
+
+/* Copyright (c) Mark J. Kilgard, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+/* This program was requested by Patrick Earl; hopefully someone else
+ will write the equivalent Direct3D immediate mode program. */
+
+#include <GL/glut.h>
+
+GLfloat light_diffuse[] = {1.0, 0.0, 0.0, 1.0}; /* Red diffuse light. */
+GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0}; /* Infinite light location. */
+GLfloat n[6][3] = { /* Normals for the 6 faces of a cube. */
+ {-1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0},
+ {0.0, -1.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, -1.0} };
+GLint faces[6][4] = { /* Vertex indices for the 6 faces of a cube. */
+ {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4},
+ {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} };
+GLfloat v[8][3]; /* Will be filled in with X,Y,Z vertexes. */
+
+void
+drawBox(void)
+{
+ int i;
+
+ for (i = 0; i < 6; i++) {
+ glBegin(GL_QUADS);
+ glNormal3fv(&n[i][0]);
+ glVertex3fv(&v[faces[i][0]][0]);
+ glVertex3fv(&v[faces[i][1]][0]);
+ glVertex3fv(&v[faces[i][2]][0]);
+ glVertex3fv(&v[faces[i][3]][0]);
+ glEnd();
+ }
+}
+
+void
+display(void)
+{
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ drawBox();
+ glutSwapBuffers();
+}
+
+void
+init(void)
+{
+ /* Setup cube vertex data. */
+ v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1;
+ v[4][0] = v[5][0] = v[6][0] = v[7][0] = 1;
+ v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1;
+ v[2][1] = v[3][1] = v[6][1] = v[7][1] = 1;
+ v[0][2] = v[3][2] = v[4][2] = v[7][2] = 1;
+ v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1;
+
+ /* Enable a single OpenGL light. */
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, light_position);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHTING);
+
+ glClearColor( 0.3f, 0.3f, 5.0f, 1.0f );
+
+ /* Use depth buffering for hidden surface elimination. */
+ glEnable(GL_DEPTH_TEST);
+
+ /* Setup the view of the cube. */
+ glMatrixMode(GL_PROJECTION);
+ gluPerspective( /* field of view in degree */ 40.0,
+ /* aspect ratio */ 1.0,
+ /* Z near */ 1.0, /* Z far */ 10.0);
+ glMatrixMode(GL_MODELVIEW);
+ gluLookAt(0.0, 0.0, 5.0, /* eye is at (0,0,5) */
+ 0.0, 0.0, 0.0, /* center is at (0,0,0) */
+ 0.0, 1.0, 0.); /* up is in positive Y direction */
+
+ /* Adjust cube position to be asthetic angle. */
+ glTranslatef(0.0, 0.0, -1.0);
+ glRotatef(60, 1.0, 0.0, 0.0);
+ glRotatef(-20, 0.0, 0.0, 1.0);
+}
+
+int
+main(int argc, char **argv)
+{
+ glutInit(&argc, argv);
+ glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
+ glutCreateWindow("red 3D lighted cube");
+ glutDisplayFunc(display);
+ init();
+ glutMainLoop();
+ return 0; /* ANSI C requires main to return int. */
+}
diff --git a/demos/natives/x11/gears.c b/demos/natives/x11/gears.c
new file mode 100644
index 0000000..f1812ae
--- /dev/null
+++ b/demos/natives/x11/gears.c
@@ -0,0 +1,374 @@
+/* $Id$ */
+
+/*
+ * 3-D gear wheels. This program is in the public domain.
+ *
+ * Command line options:
+ * -info print GL implementation information
+ *
+ *
+ * Brian Paul
+ */
+
+/* Conversion to GLUT by Mark J. Kilgard */
+
+/*
+ * $Log$
+ * Revision 1.1 2000/11/18 06:54:01 sven
+ * Initial revision
+ *
+ * Revision 1.2 1999/10/21 16:39:06 brianp
+ * added -info command line option
+ *
+ * Revision 1.1.1.1 1999/08/19 00:55:40 jtg
+ * Imported sources
+ *
+ * Revision 3.2 1999/06/03 17:07:36 brianp
+ * an extra quad was being drawn in front and back faces
+ *
+ * Revision 3.1 1998/11/03 02:49:10 brianp
+ * added fps output
+ *
+ * Revision 3.0 1998/02/14 18:42:29 brianp
+ * initial rev
+ *
+ */
+
+
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <GL/glut.h>
+
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+static GLint T0 = 0;
+static GLint Frames = 0;
+
+
+/**
+
+ Draw a gear wheel. You'll probably want to call this function when
+ building a display list since we do a lot of trig here.
+
+ Input: inner_radius - radius of hole at center
+ outer_radius - radius at center of teeth
+ width - width of gear
+ teeth - number of teeth
+ tooth_depth - depth of tooth
+
+ **/
+
+static void
+gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
+ GLint teeth, GLfloat tooth_depth)
+{
+ GLint i;
+ GLfloat r0, r1, r2;
+ GLfloat angle, da;
+ GLfloat u, v, len;
+
+ r0 = inner_radius;
+ r1 = outer_radius - tooth_depth / 2.0;
+ r2 = outer_radius + tooth_depth / 2.0;
+
+ da = 2.0 * M_PI / teeth / 4.0;
+
+ glShadeModel(GL_FLAT);
+
+ glNormal3f(0.0, 0.0, 1.0);
+
+ /* draw front face */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+ if (i < teeth) {
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+ }
+ }
+ glEnd();
+
+ /* draw front sides of teeth */
+ glBegin(GL_QUADS);
+ da = 2.0 * M_PI / teeth / 4.0;
+ for (i = 0; i < teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+ }
+ glEnd();
+
+ glNormal3f(0.0, 0.0, -1.0);
+
+ /* draw back face */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+ if (i < teeth) {
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+ }
+ }
+ glEnd();
+
+ /* draw back sides of teeth */
+ glBegin(GL_QUADS);
+ da = 2.0 * M_PI / teeth / 4.0;
+ for (i = 0; i < teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+ }
+ glEnd();
+
+ /* draw outward faces of teeth */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i < teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+ u = r2 * cos(angle + da) - r1 * cos(angle);
+ v = r2 * sin(angle + da) - r1 * sin(angle);
+ len = sqrt(u * u + v * v);
+ u /= len;
+ v /= len;
+ glNormal3f(v, -u, 0.0);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+ glNormal3f(cos(angle), sin(angle), 0.0);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
+ u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
+ v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
+ glNormal3f(v, -u, 0.0);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+ glNormal3f(cos(angle), sin(angle), 0.0);
+ }
+
+ glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
+ glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);
+
+ glEnd();
+
+ glShadeModel(GL_SMOOTH);
+
+ /* draw inside radius cylinder */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+ glNormal3f(-cos(angle), -sin(angle), 0.0);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+ }
+ glEnd();
+
+}
+
+static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
+static GLint gear1, gear2, gear3;
+static GLfloat angle = 0.0;
+
+static void
+draw(void)
+{
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ glRotatef(view_rotx, 1.0, 0.0, 0.0);
+ glRotatef(view_roty, 0.0, 1.0, 0.0);
+ glRotatef(view_rotz, 0.0, 0.0, 1.0);
+
+ glPushMatrix();
+ glTranslatef(-3.0, -2.0, 0.0);
+ glRotatef(angle, 0.0, 0.0, 1.0);
+ glCallList(gear1);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(3.1, -2.0, 0.0);
+ glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);
+ glCallList(gear2);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(-3.1, 4.2, 0.0);
+ glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0);
+ glCallList(gear3);
+ glPopMatrix();
+
+ glPopMatrix();
+
+ glutSwapBuffers();
+
+ Frames++;
+ {
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ if (t - T0 >= 5000) {
+ GLfloat seconds = (t - T0) / 1000.0;
+ GLfloat fps = Frames / seconds;
+ printf("%d frames in %g seconds = %g FPS\n", Frames, seconds, fps);
+ T0 = t;
+ Frames = 0;
+ }
+ }
+}
+
+
+static void
+idle(void)
+{
+ angle += 2.0;
+ glutPostRedisplay();
+}
+
+/* change view angle, exit upon ESC */
+/* ARGSUSED1 */
+static void
+key(unsigned char k, int x, int y)
+{
+ switch (k) {
+ case 'z':
+ view_rotz += 5.0;
+ break;
+ case 'Z':
+ view_rotz -= 5.0;
+ break;
+ case 27: /* Escape */
+ exit(0);
+ break;
+ default:
+ return;
+ }
+ glutPostRedisplay();
+}
+
+/* change view angle */
+/* ARGSUSED1 */
+static void
+special(int k, int x, int y)
+{
+ switch (k) {
+ case GLUT_KEY_UP:
+ view_rotx += 5.0;
+ break;
+ case GLUT_KEY_DOWN:
+ view_rotx -= 5.0;
+ break;
+ case GLUT_KEY_LEFT:
+ view_roty += 5.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ view_roty -= 5.0;
+ break;
+ default:
+ return;
+ }
+ glutPostRedisplay();
+}
+
+/* new window size or exposure */
+static void
+reshape(int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport(0, 0, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -40.0);
+}
+
+static void
+init(int argc, char *argv[])
+{
+ static GLfloat pos[4] =
+ {5.0, 5.0, 10.0, 0.0};
+ static GLfloat red[4] =
+ {0.8, 0.1, 0.0, 1.0};
+ static GLfloat green[4] =
+ {0.0, 0.8, 0.2, 1.0};
+ static GLfloat blue[4] =
+ {0.2, 0.2, 1.0, 1.0};
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+
+ /* make the gears */
+ gear1 = glGenLists(1);
+ glNewList(gear1, GL_COMPILE);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
+ gear(1.0, 4.0, 1.0, 20, 0.7);
+ glEndList();
+
+ gear2 = glGenLists(1);
+ glNewList(gear2, GL_COMPILE);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
+ gear(0.5, 2.0, 2.0, 10, 0.7);
+ glEndList();
+
+ gear3 = glGenLists(1);
+ glNewList(gear3, GL_COMPILE);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+ gear(1.3, 2.0, 0.5, 10, 0.7);
+ glEndList();
+
+ glEnable(GL_NORMALIZE);
+
+ if (argc > 1 && strcmp(argv[1], "-info")==0) {
+ printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+ printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
+ printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
+ printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
+ }
+}
+
+void
+visible(int vis)
+{
+ if (vis == GLUT_VISIBLE)
+ glutIdleFunc(idle);
+ else
+ glutIdleFunc(NULL);
+}
+
+int main(int argc, char *argv[])
+{
+ glutInit(&argc, argv);
+ glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
+
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(300, 300);
+ glutCreateWindow("Gears");
+ init(argc, argv);
+
+ glutDisplayFunc(draw);
+ glutReshapeFunc(reshape);
+ glutKeyboardFunc(key);
+ glutSpecialFunc(special);
+ glutVisibilityFunc(visible);
+
+ glutMainLoop();
+ return 0; /* ANSI C requires main to return int. */
+}
diff --git a/demos/natives/x11/makeGears.sh b/demos/natives/x11/makeGears.sh
new file mode 100755
index 0000000..f7c6f27
--- /dev/null
+++ b/demos/natives/x11/makeGears.sh
@@ -0,0 +1,3 @@
+#! /bin/sh
+gcc -ogears -I/usr/X11R6/include/ gears.c \
+ -lGL -lGLU -lglut -L/usr/X11R6/lib -lm
diff --git a/demos/natives/x11/makefile b/demos/natives/x11/makefile
new file mode 100644
index 0000000..d4e03bb
--- /dev/null
+++ b/demos/natives/x11/makefile
@@ -0,0 +1,30 @@
+#
+# Uses: Linux2.0X-glibc-pthreads-mesa3.0pthreads
+#
+
+CC = cc
+
+CCINCL = -I/usr/local/include -I/usr/X11/include -I/usr/X11R6/include
+CCLIBS = -L/usr/X11R6/lib -L/usr/local/lib -L/usr/X11/lib \
+ -lGL -lGLU -lglut \
+ -lXmu -lXt -lSM -lICE -lXext -lX11 -lXi -lXext -lX11 -lm -lpthread
+
+
+C_APPL_FILES = cube.c olympic.c testGL1.c testGL2.c wave.c
+
+
+.SUFFIXES : .c .o
+
+.c.o:
+ $(CC) -c -o $@ $< $(CCINCL) 2>&1 | tee -a errors
+ $(CC) -o ${@:.o=} $@ $(CCINCL) $(CCLIBS) 2>&1 | tee -a errors
+
+all: ${C_APPL_FILES:.c=.o}
+
+
+clean:
+ rm -f *.o *~ errors
+
+cleanall: clean
+ rm -f ${C_APPL_FILES:.c=}
+
diff --git a/demos/natives/x11/makefile.mesa b/demos/natives/x11/makefile.mesa
new file mode 100644
index 0000000..9068e08
--- /dev/null
+++ b/demos/natives/x11/makefile.mesa
@@ -0,0 +1,30 @@
+#
+# Uses: Linux2.0X-glibc-pthreads-mesa3.0pthreads
+#
+
+CC = cc
+
+CCINCL = -I/usr/local/include -I/usr/local/mesa/include -I/usr/X11R6/include
+CCLIBS = -L/usr/X11R6/lib -L/usr/local/lib -L/usr/local/mesa/lib \
+ -lGL -lGLU -lglut \
+ -lXmu -lXt -lSM -lICE -lXext -lX11 -lXi -lXext -lX11 -lm -lpthread
+
+
+C_APPL_FILES = cube.c olympic.c testGL1.c testGL2.c wave.c
+
+
+.SUFFIXES : .c .o
+
+.c.o:
+ $(CC) -c -o $@ $< $(CCINCL) 2>&1 | tee -a errors
+ $(CC) -o ${@:.o=} $@ $(CCINCL) $(CCLIBS) 2>&1 | tee -a errors
+
+all: ${C_APPL_FILES:.c=.o}
+
+
+clean:
+ rm -f *.o *~ errors
+
+cleanall: clean
+ rm -f ${C_APPL_FILES:.c=}
+
diff --git a/demos/natives/x11/makefile.x11 b/demos/natives/x11/makefile.x11
new file mode 100644
index 0000000..d4e03bb
--- /dev/null
+++ b/demos/natives/x11/makefile.x11
@@ -0,0 +1,30 @@
+#
+# Uses: Linux2.0X-glibc-pthreads-mesa3.0pthreads
+#
+
+CC = cc
+
+CCINCL = -I/usr/local/include -I/usr/X11/include -I/usr/X11R6/include
+CCLIBS = -L/usr/X11R6/lib -L/usr/local/lib -L/usr/X11/lib \
+ -lGL -lGLU -lglut \
+ -lXmu -lXt -lSM -lICE -lXext -lX11 -lXi -lXext -lX11 -lm -lpthread
+
+
+C_APPL_FILES = cube.c olympic.c testGL1.c testGL2.c wave.c
+
+
+.SUFFIXES : .c .o
+
+.c.o:
+ $(CC) -c -o $@ $< $(CCINCL) 2>&1 | tee -a errors
+ $(CC) -o ${@:.o=} $@ $(CCINCL) $(CCLIBS) 2>&1 | tee -a errors
+
+all: ${C_APPL_FILES:.c=.o}
+
+
+clean:
+ rm -f *.o *~ errors
+
+cleanall: clean
+ rm -f ${C_APPL_FILES:.c=}
+
diff --git a/demos/natives/x11/olympic.c b/demos/natives/x11/olympic.c
new file mode 100644
index 0000000..0527d58
--- /dev/null
+++ b/demos/natives/x11/olympic.c
@@ -0,0 +1,409 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/**
+ * (c) Copyright 1993, 1994, 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <GL/glut.h>
+
+/* Some <math.h> files do not define M_PI... */
+#ifndef M_PI
+#define M_PI 3.141592654
+#endif
+
+extern double drand48(void);
+extern void srand48(long seedval);
+
+#define XSIZE 100
+#define YSIZE 75
+
+#define RINGS 5
+#define BLUERING 0
+#define BLACKRING 1
+#define REDRING 2
+#define YELLOWRING 3
+#define GREENRING 4
+
+#define BACKGROUND 8
+
+enum {
+ BLACK = 0,
+ RED,
+ GREEN,
+ YELLOW,
+ BLUE,
+ MAGENTA,
+ CYAN,
+ WHITE
+};
+
+typedef short Point[2];
+
+GLenum rgb, doubleBuffer, directRender;
+
+unsigned char rgb_colors[RINGS][3];
+int mapped_colors[RINGS];
+float dests[RINGS][3];
+float offsets[RINGS][3];
+float angs[RINGS];
+float rotAxis[RINGS][3];
+int iters[RINGS];
+GLuint theTorus;
+
+void
+FillTorus(float rc, int numc, float rt, int numt)
+{
+ int i, j, k;
+ double s, t;
+ double x, y, z;
+ double pi, twopi;
+
+ pi = M_PI;
+ twopi = 2 * pi;
+
+ for (i = 0; i < numc; i++) {
+ glBegin(GL_QUAD_STRIP);
+ for (j = 0; j <= numt; j++) {
+ for (k = 1; k >= 0; k--) {
+ s = (i + k) % numc + 0.5;
+ t = j % numt;
+
+ x = cos(t * twopi / numt) * cos(s * twopi / numc);
+ y = sin(t * twopi / numt) * cos(s * twopi / numc);
+ z = sin(s * twopi / numc);
+ glNormal3f(x, y, z);
+
+ x = (rt + rc * cos(s * twopi / numc)) * cos(t * twopi / numt);
+ y = (rt + rc * cos(s * twopi / numc)) * sin(t * twopi / numt);
+ z = rc * sin(s * twopi / numc);
+ glVertex3f(x, y, z);
+ }
+ }
+ glEnd();
+ }
+}
+
+float
+Clamp(int iters_left, float t)
+{
+
+ if (iters_left < 3) {
+ return 0.0;
+ }
+ return (iters_left - 2) * t / iters_left;
+}
+
+void
+Idle(void)
+{
+ int i, j;
+ int more = GL_FALSE;
+
+ for (i = 0; i < RINGS; i++) {
+ if (iters[i]) {
+ for (j = 0; j < 3; j++) {
+ offsets[i][j] = Clamp(iters[i], offsets[i][j]);
+ }
+ angs[i] = Clamp(iters[i], angs[i]);
+ iters[i]--;
+ more = GL_TRUE;
+ }
+ }
+ if (more) {
+ glutPostRedisplay();
+ } else {
+ glutIdleFunc(NULL);
+ }
+}
+
+void
+DrawScene(void)
+{
+ int i;
+
+ glPushMatrix();
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);
+
+ for (i = 0; i < RINGS; i++) {
+ if (rgb) {
+ glColor3ubv(rgb_colors[i]);
+ } else {
+ glIndexi(mapped_colors[i]);
+ }
+ glPushMatrix();
+ glTranslatef(dests[i][0] + offsets[i][0], dests[i][1] + offsets[i][1],
+ dests[i][2] + offsets[i][2]);
+ glRotatef(angs[i], rotAxis[i][0], rotAxis[i][1], rotAxis[i][2]);
+ glCallList(theTorus);
+ glPopMatrix();
+ }
+
+ glPopMatrix();
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ } else {
+ glFlush();
+ }
+}
+
+float
+MyRand(void)
+{
+ return 10.0 * (drand48() - 0.5);
+}
+
+void
+ReInit(void)
+{
+ int i;
+ float deviation;
+
+ deviation = MyRand() / 2;
+ deviation = deviation * deviation;
+ for (i = 0; i < RINGS; i++) {
+ offsets[i][0] = MyRand();
+ offsets[i][1] = MyRand();
+ offsets[i][2] = MyRand();
+ angs[i] = 260.0 * MyRand();
+ rotAxis[i][0] = MyRand();
+ rotAxis[i][1] = MyRand();
+ rotAxis[i][2] = MyRand();
+ iters[i] = (deviation * MyRand() + 60.0);
+ }
+}
+
+void
+Init(void)
+{
+ int i;
+ float top_y = 1.0;
+ float bottom_y = 0.0;
+ float top_z = 0.15;
+ float bottom_z = 0.69;
+ float spacing = 2.5;
+ static float lmodel_ambient[] =
+ {0.0, 0.0, 0.0, 0.0};
+ static float lmodel_twoside[] =
+ {GL_FALSE};
+ static float lmodel_local[] =
+ {GL_FALSE};
+ static float light0_ambient[] =
+ {0.1, 0.1, 0.1, 1.0};
+ static float light0_diffuse[] =
+ {1.0, 1.0, 1.0, 0.0};
+ static float light0_position[] =
+ {0.8660254, 0.5, 1, 0};
+ static float light0_specular[] =
+ {1.0, 1.0, 1.0, 0.0};
+ static float bevel_mat_ambient[] =
+ {0.0, 0.0, 0.0, 1.0};
+ static float bevel_mat_shininess[] =
+ {40.0};
+ static float bevel_mat_specular[] =
+ {1.0, 1.0, 1.0, 0.0};
+ static float bevel_mat_diffuse[] =
+ {1.0, 0.0, 0.0, 0.0};
+
+ srand48(0x102342);
+ ReInit();
+ for (i = 0; i < RINGS; i++) {
+ rgb_colors[i][0] = rgb_colors[i][1] = rgb_colors[i][2] = 0;
+ }
+ rgb_colors[BLUERING][2] = 255;
+ rgb_colors[REDRING][0] = 255;
+ rgb_colors[GREENRING][1] = 255;
+ rgb_colors[YELLOWRING][0] = 255;
+ rgb_colors[YELLOWRING][1] = 255;
+ mapped_colors[BLUERING] = BLUE;
+ mapped_colors[REDRING] = RED;
+ mapped_colors[GREENRING] = GREEN;
+ mapped_colors[YELLOWRING] = YELLOW;
+ mapped_colors[BLACKRING] = BLACK;
+
+ dests[BLUERING][0] = -spacing;
+ dests[BLUERING][1] = top_y;
+ dests[BLUERING][2] = top_z;
+
+ dests[BLACKRING][0] = 0.0;
+ dests[BLACKRING][1] = top_y;
+ dests[BLACKRING][2] = top_z;
+
+ dests[REDRING][0] = spacing;
+ dests[REDRING][1] = top_y;
+ dests[REDRING][2] = top_z;
+
+ dests[YELLOWRING][0] = -spacing / 2.0;
+ dests[YELLOWRING][1] = bottom_y;
+ dests[YELLOWRING][2] = bottom_z;
+
+ dests[GREENRING][0] = spacing / 2.0;
+ dests[GREENRING][1] = bottom_y;
+ dests[GREENRING][2] = bottom_z;
+
+ theTorus = glGenLists(1);
+ glNewList(theTorus, GL_COMPILE);
+ FillTorus(0.1, 8, 1.0, 25);
+ glEndList();
+
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ glEnable(GL_DEPTH_TEST);
+ glClearDepth(1.0);
+
+ if (rgb) {
+ glClearColor(0.5, 0.5, 0.5, 0.0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, light0_specular);
+ glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
+ glEnable(GL_LIGHT0);
+
+ glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_local);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glEnable(GL_LIGHTING);
+
+ glMaterialfv(GL_FRONT, GL_AMBIENT, bevel_mat_ambient);
+ glMaterialfv(GL_FRONT, GL_SHININESS, bevel_mat_shininess);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, bevel_mat_specular);
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, bevel_mat_diffuse);
+
+ glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+ glEnable(GL_COLOR_MATERIAL);
+ glShadeModel(GL_SMOOTH);
+ } else {
+ glClearIndex(BACKGROUND);
+ glShadeModel(GL_FLAT);
+ }
+
+ glMatrixMode(GL_PROJECTION);
+ gluPerspective(45, 1.33, 0.1, 100.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+void
+Reshape(int width, int height)
+{
+ glViewport(0, 0, width, height);
+}
+
+/* ARGSUSED1 */
+void
+Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(0);
+ break;
+ case ' ':
+ ReInit();
+ glutIdleFunc(Idle);
+ break;
+ }
+}
+
+GLenum
+Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_TRUE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+void
+visible(int vis)
+{
+ if (vis == GLUT_VISIBLE) {
+ glutIdleFunc(Idle);
+ } else {
+ glutIdleFunc(NULL);
+ }
+}
+
+int
+main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInitWindowSize(400, 300);
+ glutInit(&argc, argv);
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+ type = (rgb) ? GLUT_RGB : GLUT_INDEX;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ glutCreateWindow("Olympic");
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutDisplayFunc(DrawScene);
+
+ glutVisibilityFunc(visible);
+
+ glutMainLoop();
+ return 0; /* ANSI C requires main to return int. */
+}
diff --git a/demos/natives/x11/testGL1.c b/demos/natives/x11/testGL1.c
new file mode 100644
index 0000000..71f9ab2
--- /dev/null
+++ b/demos/natives/x11/testGL1.c
@@ -0,0 +1,222 @@
+
+
+
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <GL/gl.h>
+#include <GL/glut.h>
+
+double width = 250;
+double height = 250;
+double fps = 25.0;
+
+ static float lmodel_twoside[] =
+ {GL_FALSE};
+ static float lmodel_local[] =
+ {GL_FALSE};
+ static float lmodel_ambient[] =
+ {0.0, 0.0, 0.0, 0.0};
+
+void CylinderDraw( )
+{
+ glBegin( GL_TRIANGLE_STRIP );
+ glNormal3f ( 1.0, 0.0, -5.0 );
+ glVertex3f ( 1.0, 0.0, -5.0 );
+ glNormal3f ( 1.0, 0.0, -5.0 );
+ glVertex3f (1.000000, 0.000000, 5.000000);
+ glNormal3f (0.707107, 0.707107, -5.000000);
+ glVertex3f (0.707107, 0.707107, -5.000000);
+ glNormal3f (0.707107, 0.707107, -5.000000);
+ glVertex3f (0.707107, 0.707107, 5.000000);
+ glNormal3f (0.000000, 1.000000, -5.000000);
+ glVertex3f (0.000000, 1.000000, -5.000000);
+ glNormal3f (0.000000, 1.000000, -5.000000);
+ glVertex3f (0.000000, 1.000000, 5.000000);
+ glNormal3f (-0.707107, 0.707107, -5.00000);
+ glVertex3f (-0.707107, 0.707107, -5.00000);
+ glNormal3f (-0.707107, 0.707107, -5.00000);
+ glVertex3f (-0.707107, 0.707107, 5.00000);
+ glNormal3f (-1.000000, 0.000000, -5.000000);
+ glVertex3f (-1.000000, 0.000000, -5.000000);
+ glNormal3f (-1.000000, 0.000000, -5.000000);
+ glVertex3f (-1.000000, 0.000000, 5.00000);
+ glNormal3f (-0.707107, -0.707107, -5.000000);
+ glVertex3f (-0.707107, -0.707107, -5.000000);
+ glNormal3f (-0.707107, -0.707107, -5.000000);
+ glVertex3f (-0.707107, -0.707107, 5.00000);
+ glNormal3f (0.000000, -1.000000, -5.000000);
+ glVertex3f (0.000000, -1.000000, -5.000000);
+ glNormal3f (0.000000, -1.000000, -5.000000);
+ glVertex3f (0.000000, -1.000000, 5.00000);
+ glNormal3f (0.707107, -0.707107, -5.00000);
+ glVertex3f (0.707107, -0.707107, -5.00000);
+ glNormal3f (0.707107, -0.707107, -5.00000);
+ glVertex3f (0.707107, -0.707107, 5.000000);
+ glNormal3f (1.000000, 0.000000, -5.00000);
+ glVertex3f (1.000000, 0.000000, -5.00000);
+ glNormal3f (1.000000, 0.000000, -5.00000);
+ glVertex3f (1.000000, 0.000000, 5.00000);
+ glEnd();
+}
+
+void reshape(int width, int height)
+{
+ double fov = 45.0,
+ aspect = width / height,
+ near_ = 1.0,
+ far_ = 200.0;
+
+ glViewport( 0, 0, width, height );
+
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+
+ gluPerspective( fov, aspect, near_, far_ );
+
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+
+}
+
+void display()
+{
+ static int FrameStep = 0;
+
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ glPushMatrix();
+ glTranslatef( 0.0, 0.0, -65.0 );
+ glRotatef( 40.0+(2*FrameStep), 0.0, 0.0, 1.0 );
+ glRotatef( 190.0+(2*FrameStep), 0.0, 1.0, 0.0 );
+ glRotatef( 200.0+(FrameStep*2), 1.0, 0.0, 0.0 );
+ glPushMatrix();
+ glScalef( 1.0, 1.0, 10.0 );
+ CylinderDraw( );
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef( 90.0, 0.0, 1.0, 0.0 );
+ glScalef( 1.0, 1.0, 10.0 );
+ CylinderDraw( );
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef( 90.0, 1.0, 0.0, 0.0 );
+ glScalef( 1.0, 1.0, 10.0 );
+ CylinderDraw( );
+ glPopMatrix();
+ glPopMatrix();
+
+ glutSwapBuffers();
+ /* glFlush(); */
+
+ FrameStep++;
+
+ if(FrameStep>100000) FrameStep=0;
+
+}
+
+void init()
+{
+ double fov = 45.0;
+ double aspect = width / height ;
+ double near_ = 1.0;
+ double far_ = 200.0;
+ float lightArr[4];
+ float farr[4];
+
+ /* initialize the widget */
+ glClearColor( 0.8f, 0.8f, 1.0f, 1.0f );
+ glFrontFace( GL_CW );
+ glEnable( GL_DEPTH_TEST );
+
+ glViewport( 0, 0, width, height );
+
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+
+ gluPerspective( fov, aspect, near_, far_ );
+
+ /* render three rotated cylinders */
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+
+ /* enable lighting */
+ lightArr[0] = 1.0f; lightArr[1] = 1.0f;
+ lightArr[2] = 1.0f; lightArr[3] = 1.0f;
+ glLightfv( GL_LIGHT0, GL_DIFFUSE, lightArr );
+ lightArr[0] = 90.0f; lightArr[1] = 90.0f;
+ lightArr[2] = 0.0f; lightArr[3] = 0.0f;
+ glLightfv( GL_LIGHT0, GL_POSITION, lightArr );
+ lightArr[0] = 0.1f; lightArr[1] = 0.1f;
+ lightArr[2] = 0.1f; lightArr[3] = 1.0f;
+ glLightfv( GL_LIGHT0, GL_AMBIENT, lightArr );
+ glEnable( GL_LIGHT0 );
+
+ /*
+ glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_local);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ */
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
+ glEnable( GL_LIGHTING );
+
+ /*
+ glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_local);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glEnable( GL_LIGHTING );
+ */
+
+
+ glMaterialf( GL_FRONT, GL_SHININESS, 30.0f );
+
+ farr[0] = 0.0f; farr[1] = 0.0f; farr[2] = 0.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_FRONT, GL_SPECULAR, farr );
+
+ farr[0] = 0.0f; farr[1] = 1.0f; farr[2] = 0.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_FRONT, GL_DIFFUSE, farr );
+
+ glMaterialf( GL_BACK, GL_SHININESS, 50.0f );
+
+ farr[0] = 0.0f; farr[1] = 0.0f; farr[2] = 1.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_BACK, GL_SPECULAR, farr );
+
+ farr[0] = 1.0f; farr[1] = 1.0f; farr[2] = 0.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_BACK, GL_DIFFUSE, farr );
+
+}
+
+void idle()
+{
+ glutPostRedisplay();
+}
+
+int main( int argc, char **argv)
+{
+ fprintf(stderr,"1\n");
+ if(argc>2 && strcmp(argv[1], "-fps")==0)
+ {
+ fprintf(stderr,"2\n");
+ fps = atof(argv[2]);
+ argc-=2;
+ argv+=2;
+ }
+ fprintf(stderr, "Frame Per Secounds %d\n ( will be ignored this time )\n", fps);
+
+ glutInit(&argc, argv);
+ glutInitDisplayMode ( GLUT_DOUBLE
+ | GLUT_DEPTH
+ | GLUT_RGBA
+ );
+ glutInitWindowSize(width,height);
+ glutInitWindowPosition(100,100);
+ glutCreateWindow("OpenGL GLUT/NATIVE");
+ init();
+ glutDisplayFunc(display);
+ glutReshapeFunc(reshape);
+ glutIdleFunc(idle);
+ glutMainLoop();
+ return 0;
+}
+
diff --git a/demos/natives/x11/testGL2.c b/demos/natives/x11/testGL2.c
new file mode 100644
index 0000000..335acc9
--- /dev/null
+++ b/demos/natives/x11/testGL2.c
@@ -0,0 +1,517 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <GL/gl.h>
+#include <GL/glx.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+Display *dpy; /* X display connection */
+Window xid; /* X window id */
+GLXContext glid; /* GL window id */
+
+double width = 250;
+double height = 250;
+double fps = 25.0;
+
+ static float lmodel_twoside[] =
+ {GL_FALSE};
+ static float lmodel_local[] =
+ {GL_FALSE};
+ static float lmodel_ambient[] =
+ {0.0, 0.0, 0.0, 0.0};
+
+void CylinderDraw( )
+{
+ glBegin( GL_TRIANGLE_STRIP );
+ glNormal3f ( 1.0, 0.0, -5.0 );
+ glVertex3f ( 1.0, 0.0, -5.0 );
+ glNormal3f ( 1.0, 0.0, -5.0 );
+ glVertex3f (1.000000, 0.000000, 5.000000);
+ glNormal3f (0.707107, 0.707107, -5.000000);
+ glVertex3f (0.707107, 0.707107, -5.000000);
+ glNormal3f (0.707107, 0.707107, -5.000000);
+ glVertex3f (0.707107, 0.707107, 5.000000);
+ glNormal3f (0.000000, 1.000000, -5.000000);
+ glVertex3f (0.000000, 1.000000, -5.000000);
+ glNormal3f (0.000000, 1.000000, -5.000000);
+ glVertex3f (0.000000, 1.000000, 5.000000);
+ glNormal3f (-0.707107, 0.707107, -5.00000);
+ glVertex3f (-0.707107, 0.707107, -5.00000);
+ glNormal3f (-0.707107, 0.707107, -5.00000);
+ glVertex3f (-0.707107, 0.707107, 5.00000);
+ glNormal3f (-1.000000, 0.000000, -5.000000);
+ glVertex3f (-1.000000, 0.000000, -5.000000);
+ glNormal3f (-1.000000, 0.000000, -5.000000);
+ glVertex3f (-1.000000, 0.000000, 5.00000);
+ glNormal3f (-0.707107, -0.707107, -5.000000);
+ glVertex3f (-0.707107, -0.707107, -5.000000);
+ glNormal3f (-0.707107, -0.707107, -5.000000);
+ glVertex3f (-0.707107, -0.707107, 5.00000);
+ glNormal3f (0.000000, -1.000000, -5.000000);
+ glVertex3f (0.000000, -1.000000, -5.000000);
+ glNormal3f (0.000000, -1.000000, -5.000000);
+ glVertex3f (0.000000, -1.000000, 5.00000);
+ glNormal3f (0.707107, -0.707107, -5.00000);
+ glVertex3f (0.707107, -0.707107, -5.00000);
+ glNormal3f (0.707107, -0.707107, -5.00000);
+ glVertex3f (0.707107, -0.707107, 5.000000);
+ glNormal3f (1.000000, 0.000000, -5.00000);
+ glVertex3f (1.000000, 0.000000, -5.00000);
+ glNormal3f (1.000000, 0.000000, -5.00000);
+ glVertex3f (1.000000, 0.000000, 5.00000);
+ glEnd();
+}
+
+void reshape(int width, int height)
+{
+ double fov = 45.0,
+ aspect = width / height,
+ near = 1.0,
+ far = 200.0;
+
+ glViewport( 0, 0, width, height );
+
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+
+ gluPerspective( fov, aspect, near, far );
+
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+
+}
+
+void display()
+{
+ static int FrameStep = 0;
+
+ glXWaitGL();
+ glXWaitX();
+ /* associated the context with the X window */
+ if( glXMakeCurrent( dpy, xid, glid ) == False) {
+ glXDestroyContext( display, glid );
+ fprintf(stderr,"(NO GC ASSOC)\n");
+ fflush(stderr);
+ return 1;
+ }
+
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ glPushMatrix();
+ glTranslatef( 0.0, 0.0, -65.0 );
+ glRotatef( 40.0+(2*FrameStep), 0.0, 0.0, 1.0 );
+ glRotatef( 190.0+(2*FrameStep), 0.0, 1.0, 0.0 );
+ glRotatef( 200.0+(FrameStep*2), 1.0, 0.0, 0.0 );
+ glPushMatrix();
+ glScalef( 1.0, 1.0, 10.0 );
+ CylinderDraw( );
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef( 90.0, 0.0, 1.0, 0.0 );
+ glScalef( 1.0, 1.0, 10.0 );
+ CylinderDraw( );
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef( 90.0, 1.0, 0.0, 0.0 );
+ glScalef( 1.0, 1.0, 10.0 );
+ CylinderDraw( );
+ glPopMatrix();
+ glPopMatrix();
+
+ glXWaitGL();
+ glXWaitX();
+ glXSwapBuffers(dpy, xid);
+
+ glXWaitGL();
+ glXWaitX();
+ /* associated the context with the X window */
+ if( glXMakeCurrent( dpy, None, NULL ) == False) {
+ glXDestroyContext( display, glid );
+ fprintf(stderr,"(free GC failed)\n");
+ fflush(stderr);
+ return 1;
+ }
+
+ FrameStep++;
+
+ if(FrameStep>100000) FrameStep=0;
+
+}
+
+void init()
+{
+ double fov = 45.0;
+ double aspect = width / height ;
+ double near = 1.0;
+ double far = 200.0;
+ float lightArr[4];
+ float farr[4];
+
+ /* initialize the widget */
+ glClearColor( 0.8f, 0.8f, 1.0f, 1.0f );
+ glFrontFace( GL_CW );
+ glEnable( GL_DEPTH_TEST );
+
+ glViewport( 0, 0, width, height );
+
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+
+ gluPerspective( fov, aspect, near, far );
+
+ /* render three rotated cylinders */
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+
+ /* enable lighting */
+ lightArr[0] = 1.0f; lightArr[1] = 1.0f;
+ lightArr[2] = 1.0f; lightArr[3] = 1.0f;
+ glLightfv( GL_LIGHT0, GL_DIFFUSE, lightArr );
+ lightArr[0] = 90.0f; lightArr[1] = 90.0f;
+ lightArr[2] = 0.0f; lightArr[3] = 0.0f;
+ glLightfv( GL_LIGHT0, GL_POSITION, lightArr );
+ lightArr[0] = 0.1f; lightArr[1] = 0.1f;
+ lightArr[2] = 0.1f; lightArr[3] = 1.0f;
+ glLightfv( GL_LIGHT0, GL_AMBIENT, lightArr );
+ glEnable( GL_LIGHT0 );
+
+ /*
+ glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_local);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ */
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
+ glEnable( GL_LIGHTING );
+
+ /*
+ glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_local);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glEnable( GL_LIGHTING );
+ */
+
+
+ glMaterialf( GL_FRONT, GL_SHININESS, 30.0f );
+
+ farr[0] = 0.0f; farr[1] = 0.0f; farr[2] = 0.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_FRONT, GL_SPECULAR, farr );
+
+ farr[0] = 0.0f; farr[1] = 1.0f; farr[2] = 0.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_FRONT, GL_DIFFUSE, farr );
+
+ glMaterialf( GL_BACK, GL_SHININESS, 50.0f );
+
+ farr[0] = 0.0f; farr[1] = 0.0f; farr[2] = 1.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_BACK, GL_SPECULAR, farr );
+
+ farr[0] = 1.0f; farr[1] = 1.0f; farr[2] = 0.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_BACK, GL_DIFFUSE, farr );
+
+}
+
+
+static void GetLargeVisual(Display *dpy, XVisualInfo *bigVisualInfo);
+static XVisualInfo *findVisualGlX( Display *display);
+Window findAWindow( const char *frameName, Display *display, Window window);
+int verbose=1;
+
+main()
+{
+ XWMHints *p_xwmh=NULL;
+ Window xid2;
+ XEvent event;
+ XVisualInfo bigVisualInfo; /* largest pseudo color visual type */
+ XSetWindowAttributes attribs; /* X window attributes structure */
+ Colormap bigColormap; /* 12-bit color map */
+ unsigned long vmask; /* value mask for attributes */
+ int i;
+
+
+ /* Get the X display connection. We'll assume that the DISPLAY
+ * environment variable is "unix:0" since GL windows only run on
+ * on the local display. */
+ if(!(dpy = XOpenDisplay(""))) {
+ printf("\n can't open display connection \n");
+ exit(0);
+ }
+
+ /* GetLargeVisual(dpy, &bigVisualInfo); */
+ bigVisualInfo = * findVisualGlX(dpy);
+ printf("\n address of XVisualInfo structure = 0x%x \n", bigVisualInfo);
+ printf("\n address of Visual structure = 0x%x ", bigVisualInfo.visual);
+ printf("\n visualID = 0x%x ", bigVisualInfo.visualid);
+ printf("\n depth of visual = %d", bigVisualInfo.depth);
+ printf("\n class of visual = %d", bigVisualInfo.class);
+ printf("\n bits_per_rgb of visual = %d", bigVisualInfo.bits_per_rgb);
+ printf("\n colormap_size of visual = %d \n", bigVisualInfo.colormap_size);
+
+ attribs.event_mask =
+ ExposureMask;
+ attribs.border_pixel =
+ BlackPixel(dpy, bigVisualInfo.screen);
+ attribs.colormap =
+ XCreateColormap( dpy,
+ RootWindow( dpy, bigVisualInfo.screen ),
+ bigVisualInfo.visual,
+ AllocNone ) ;
+
+
+ attribs.background_pixel = 0xFFFFFFFF;
+
+ attribs.background_pixel =
+ BlackPixel(dpy, bigVisualInfo.screen);
+
+ attribs.border_pixmap = None;
+ attribs.background_pixmap = None;
+
+ vmask = CWColormap | CWBorderPixmap | CWBackPixmap;
+ vmask = CWEventMask | CWColormap | CWBorderPixel | CWBackPixel;
+
+ xid =
+ XCreateWindow(dpy,
+ RootWindow( dpy, bigVisualInfo.screen ),
+ 0,0, 400, 400,
+ 0,
+ bigVisualInfo.depth,
+ InputOutput, bigVisualInfo.visual,
+ vmask,
+ &attribs);
+
+ /* Name the window, map it, and flush the X buffer. */
+ XStoreName(dpy, xid, "GLWindow");
+ XMapWindow(dpy, xid);
+ XFlush(dpy);
+
+ glid = glXCreateContext( dpy, &bigVisualInfo, None, True );
+
+ /* check if the context could be created */
+ if( glid == NULL ) {
+ fprintf(stderr,"(NO GC)\n");
+ fflush(stderr);
+ return 1;
+ }
+ /* associated the context with the X window */
+ if( glXMakeCurrent( dpy, xid, glid ) == False) {
+ glXDestroyContext( display, glid );
+ fprintf(stderr,"(NO GC ASSOC)\n");
+ fflush(stderr);
+ return 1;
+ }
+
+ XFlush(dpy);
+ XRaiseWindow (dpy, xid);
+
+ xid2 = findAWindow("GLWindow", dpy, RootWindow( dpy, bigVisualInfo.screen ));
+
+ if(xid==xid2)
+ fprintf(stderr,"found win equals created win\n");
+ else
+ fprintf(stderr,"found win ** NOT ** equals created win\n");
+ fflush(stderr);
+
+ if((p_xwmh = XAllocWMHints()) == NULL)
+ {
+ fprintf(stderr,"No Mem for WMHints\n");
+ fflush(stderr);
+ exit(1);
+ }
+ p_xwmh->flags = (InputHint|StateHint);
+ p_xwmh->input = True;
+ p_xwmh->initial_state=NormalState;
+
+ XSetWMHints(dpy, xid, p_xwmh);
+
+ init();
+
+ for(;;)
+ display();
+
+ /* exit */
+ XDestroyWindow(dpy, xid);
+ XCloseDisplay(dpy);
+}
+
+/* ============================================================== */
+/* The following routine draws a constant pitch spiral,
+ * with initial radius r0, pitch p,
+ * nsteps line segments per revolution,
+ * and nrev revolutions */
+
+/* ============================================================== */
+
+void GetLargeVisual(Display *dpy, XVisualInfo *bigVisualInfo)
+{
+ XVisualInfo *visual_info; /* Info. about visual classes */
+ /*
+ * Get all visuals based on these masks
+ */
+ long vinfo_mask = VisualClassMask | VisualScreenMask;
+ XVisualInfo vtemp ; /* template for visuals to look for */
+ int i; /* counter */
+ int nitem ; /* number of visuals returned */
+
+ /*
+ * Get All PseudoColor Visuals
+ */
+ vtemp.class = PseudoColor ; /* Set PseudoColor class */
+ vtemp.screen = DefaultScreen(dpy) ; /* Set screen */
+ /*
+ * Get all visuals of the correct class on the correct screen
+ */
+ visual_info = XGetVisualInfo(dpy, vinfo_mask, &vtemp, &nitem) ;
+ /*
+ * Search for largest visual from all visual classes
+ */
+ *(bigVisualInfo) = *(visual_info);
+
+
+ /* NOTE: on GXT1000 and GXT500 family, winX does not support
+ * overlay window, so careful not to pick up overlay visual
+ * here!
+ */
+
+ for (i=0; i<nitem; i++, visual_info++) {
+ if (visual_info->colormap_size >= bigVisualInfo->colormap_size) {
+ *(bigVisualInfo) = *(visual_info);
+ }
+ }
+ /*
+ * return largest visual
+ */
+ return;
+}
+
+static XVisualInfo *findVisualGlX( Display *display )
+{
+ int visualAttribList[11];
+ XVisualInfo *visual;
+
+ /* Ask GLX for a visual that matches the attributes we want: Single
+ buffered and RGB with at least 4 bits for each component
+ */
+ visualAttribList[0] = GLX_RGBA;
+ visualAttribList[1] = GLX_RED_SIZE;
+ visualAttribList[2] = 1;
+ visualAttribList[3] = GLX_GREEN_SIZE;
+ visualAttribList[4] = 1;
+ visualAttribList[5] = GLX_BLUE_SIZE;
+ visualAttribList[6] = 1;
+ visualAttribList[7] = GLX_DOUBLEBUFFER;
+ visualAttribList[8] = GLX_DEPTH_SIZE;
+ visualAttribList[9] = 1;
+ visualAttribList[10] = None;
+
+ visual = glXChooseVisual( display,
+ DefaultScreen( display ),
+ visualAttribList );
+ fprintf(stderr, "\nused vi(ID:%d): \n screen %d, depth %d, class %d,\n clrmapsz %d, bitsPerRGB %d\n",
+ visual->visualid,
+ visual->screen,
+ visual->depth,
+ visual->class,
+ visual->colormap_size,
+ visual->bits_per_rgb );
+ fflush(stderr);
+
+ return( visual );
+}
+
+Window findAWindow( const char *frameName, Display *display, Window window)
+{
+ /* Variables used to find the correct java Window to render into */
+ Window root, parent, *children;
+ unsigned int numOfChildren;
+ char *buff;
+ int i, status;
+ Window retWindow, lastWindow;
+
+ /* debug helpers */
+ int i1, i2, i3;
+
+ XFlush(display);
+
+ status = XFetchName( display, window, &buff );
+
+ if( status )
+ {
+ if( !strcmp( frameName, buff ) )
+ {
+ /* Ok, we've found it,
+ so return the last child under this heirarchy
+ */
+ lastWindow = window;
+
+ XFlush(display);
+
+ status = XQueryTree( display, window,
+ &root, &parent, &children, &numOfChildren );
+
+ if(verbose)
+ {
+ fprintf(stderr,"\nfjw 4 (got :0x%x with %d childs)\n",
+ window, numOfChildren);
+ fflush(stderr);
+ }
+
+ i1=0;
+
+ while( status )
+ {
+ if( children == NULL )
+ {
+ XFlush(display);
+
+ if(verbose)
+ {
+ fprintf(stderr,"\nfjw 4 (FOUND LAST WINDOW 0x%x)\n",
+ lastWindow);
+ fflush(stderr);
+ }
+ return lastWindow;
+ }
+ lastWindow = children[numOfChildren-1];
+
+ status = XQueryTree( display, lastWindow,
+ &root, &parent, &children, &numOfChildren );
+
+ if(verbose)
+ {
+ fprintf(stderr,"fjw 4 (got :0x%x with %d childs)\n",
+ lastWindow, numOfChildren);
+ fflush(stderr);
+ }
+
+ XFlush(display);
+
+ }
+
+ return (Window)0;
+ }
+ }
+
+ /* If Window has no name, or if it's not equal to the java Frame window name
+ carry on searching recursivly
+ */
+ status = XQueryTree( display, window,
+ &root, &parent, &children, &numOfChildren );
+
+ XFlush(display);
+
+ if( status )
+ {
+ for( i=0; i < numOfChildren; i++ )
+ {
+ retWindow = findAWindow( frameName, display, children[ i ]);
+ if( retWindow )
+ {
+ /* Free up the child list */
+ /* XFree( children ); */
+ return retWindow;
+ }
+ }
+ }
+
+ /* Free up the child list */
+ /* if(children!=0) XFree( children ); */
+ return (Window)0;
+}
diff --git a/demos/natives/x11/wave.c b/demos/natives/x11/wave.c
new file mode 100644
index 0000000..36d518d
--- /dev/null
+++ b/demos/natives/x11/wave.c
@@ -0,0 +1,500 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include "GL/glut.h"
+
+
+#ifndef PI
+#define PI 3.14159265358979323846
+#endif
+
+#define GETCOORD(frame, x, y) (&(theMesh.coords[frame*theMesh.numCoords+(x)+(y)*(theMesh.widthX+1)]))
+#define GETFACET(frame, x, y) (&(theMesh.facets[frame*theMesh.numFacets+(x)+(y)*theMesh.widthX]))
+
+
+GLenum rgb, doubleBuffer, directRender;
+
+GLint colorIndexes1[3];
+GLint colorIndexes2[3];
+GLenum clearMask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;
+
+GLenum smooth = GL_FALSE;
+GLenum lighting = GL_TRUE;
+GLenum depth = GL_TRUE;
+GLenum stepMode = GL_FALSE;
+GLenum spinMode = GL_FALSE;
+GLint contouring = 0;
+
+GLint widthX, widthY;
+GLint checkerSize;
+float height;
+
+GLint frames, curFrame = 0, nextFrame = 0;
+
+struct facet {
+ float color[3];
+ float normal[3];
+};
+struct coord {
+ float vertex[3];
+ float normal[3];
+};
+struct mesh {
+ GLint widthX, widthY;
+ GLint numFacets;
+ GLint numCoords;
+ GLint frames;
+ struct coord *coords;
+ struct facet *facets;
+} theMesh;
+
+GLubyte contourTexture1[] = {
+ 255, 255, 255, 255,
+ 255, 255, 255, 255,
+ 255, 255, 255, 255,
+ 127, 127, 127, 127,
+};
+GLubyte contourTexture2[] = {
+ 255, 255, 255, 255,
+ 255, 127, 127, 127,
+ 255, 127, 127, 127,
+ 255, 127, 127, 127,
+};
+
+
+static void display(void)
+{
+ struct coord *coord;
+ struct facet *facet;
+ float *lastColor;
+ float *thisColor;
+ GLint i, j;
+
+ glClear(clearMask);
+
+ if (nextFrame || !stepMode) {
+ curFrame++;
+ }
+ if (curFrame >= theMesh.frames) {
+ curFrame = 0;
+ }
+
+ if ((nextFrame || !stepMode) && spinMode) {
+ glRotatef(5.0, 0.0, 0.0, 1.0);
+ }
+ nextFrame = 0;
+
+ for (i = 0; i < theMesh.widthX; i++) {
+ glBegin(GL_QUAD_STRIP);
+ lastColor = NULL;
+ for (j = 0; j < theMesh.widthY; j++) {
+ facet = GETFACET(curFrame, i, j);
+ if (!smooth && lighting) {
+ glNormal3fv(facet->normal);
+ }
+ if (lighting) {
+ thisColor = facet->color;
+ glColor3fv(facet->color);
+ } else {
+ thisColor = facet->color;
+ glColor3fv(facet->color);
+ }
+
+ if (!lastColor || (thisColor[0] != lastColor[0] && smooth)) {
+ if (lastColor) {
+ glEnd();
+ glBegin(GL_QUAD_STRIP);
+ }
+ coord = GETCOORD(curFrame, i, j);
+ if (smooth && lighting) {
+ glNormal3fv(coord->normal);
+ }
+ glVertex3fv(coord->vertex);
+
+ coord = GETCOORD(curFrame, i+1, j);
+ if (smooth && lighting) {
+ glNormal3fv(coord->normal);
+ }
+ glVertex3fv(coord->vertex);
+ }
+
+ coord = GETCOORD(curFrame, i, j+1);
+ if (smooth && lighting) {
+ glNormal3fv(coord->normal);
+ }
+ glVertex3fv(coord->vertex);
+
+ coord = GETCOORD(curFrame, i+1, j+1);
+ if (smooth && lighting) {
+ glNormal3fv(coord->normal);
+ }
+ glVertex3fv(coord->vertex);
+
+ lastColor = thisColor;
+ }
+ glEnd();
+ }
+
+ glFlush();
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+
+static void InitMesh(void)
+{
+ struct coord *coord;
+ struct facet *facet;
+ float dp1[3], dp2[3];
+ float *pt1, *pt2, *pt3;
+ float angle, d, x, y;
+ GLint numFacets, numCoords, frameNum, i, j;
+
+ theMesh.widthX = widthX;
+ theMesh.widthY = widthY;
+ theMesh.frames = frames;
+
+ numFacets = widthX * widthY;
+ numCoords = (widthX + 1) * (widthY + 1);
+
+ theMesh.numCoords = numCoords;
+ theMesh.numFacets = numFacets;
+
+ theMesh.coords = (struct coord *)malloc(frames*numCoords*
+ sizeof(struct coord));
+ theMesh.facets = (struct facet *)malloc(frames*numFacets*
+ sizeof(struct facet));
+ if (theMesh.coords == NULL || theMesh.facets == NULL) {
+ printf("Out of memory.\n");
+ exit(0);
+ }
+
+ for (frameNum = 0; frameNum < frames; frameNum++) {
+ for (i = 0; i <= widthX; i++) {
+ x = i / (float)widthX;
+ for (j = 0; j <= widthY; j++) {
+ y = j / (float)widthY;
+
+ d = sqrt(x*x+y*y);
+ if (d == 0.0) {
+ d = 0.0001;
+ }
+ angle = 2 * PI * d + (2 * PI / frames * frameNum);
+
+ coord = GETCOORD(frameNum, i, j);
+
+ coord->vertex[0] = x - 0.5;
+ coord->vertex[1] = y - 0.5;
+ coord->vertex[2] = (height - height * d) * cos(angle);
+
+ coord->normal[0] = -(height / d) * x * ((1 - d) * 2 * PI *
+ sin(angle) + cos(angle));
+ coord->normal[1] = -(height / d) * y * ((1 - d) * 2 * PI *
+ sin(angle) + cos(angle));
+ coord->normal[2] = -1;
+
+ d = 1.0 / sqrt(coord->normal[0]*coord->normal[0]+
+ coord->normal[1]*coord->normal[1]+1);
+ coord->normal[0] *= d;
+ coord->normal[1] *= d;
+ coord->normal[2] *= d;
+ }
+ }
+ for (i = 0; i < widthX; i++) {
+ for (j = 0; j < widthY; j++) {
+ facet = GETFACET(frameNum, i, j);
+ if (((i/checkerSize)%2)^(j/checkerSize)%2) {
+ facet->color[0] = 1.0;
+ facet->color[1] = 0.2;
+ facet->color[2] = 0.2;
+ } else {
+ facet->color[0] = 0.2;
+ facet->color[1] = 1.0;
+ facet->color[2] = 0.2;
+ }
+ pt1 = GETCOORD(frameNum, i, j)->vertex;
+ pt2 = GETCOORD(frameNum, i, j+1)->vertex;
+ pt3 = GETCOORD(frameNum, i+1, j+1)->vertex;
+
+ dp1[0] = pt2[0] - pt1[0];
+ dp1[1] = pt2[1] - pt1[1];
+ dp1[2] = pt2[2] - pt1[2];
+
+ dp2[0] = pt3[0] - pt2[0];
+ dp2[1] = pt3[1] - pt2[1];
+ dp2[2] = pt3[2] - pt2[2];
+
+ facet->normal[0] = dp1[1] * dp2[2] - dp1[2] * dp2[1];
+ facet->normal[1] = dp1[2] * dp2[0] - dp1[0] * dp2[2];
+ facet->normal[2] = dp1[0] * dp2[1] - dp1[1] * dp2[0];
+
+ d = 1.0 / sqrt(facet->normal[0]*facet->normal[0]+
+ facet->normal[1]*facet->normal[1]+
+ facet->normal[2]*facet->normal[2]);
+
+ facet->normal[0] *= d;
+ facet->normal[1] *= d;
+ facet->normal[2] *= d;
+ }
+ }
+ }
+}
+
+static void InitMaterials(void)
+{
+ static float ambient[] = {0.1, 0.1, 0.1, 1.0};
+ static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
+ static float position[] = {90.0, 90.0, 150.0, 0.0};
+ static float front_mat_shininess[] = {60.0};
+ static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
+ static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0};
+ static float back_mat_shininess[] = {60.0};
+ static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
+ static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
+ static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
+ static float lmodel_twoside[] = {GL_TRUE};
+
+ glMatrixMode(GL_PROJECTION);
+ gluPerspective(450, 1.0, 0.5, 10.0);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
+ glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
+ glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
+ glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
+ glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+
+ glEnable(GL_COLOR_MATERIAL);
+}
+
+static void InitTexture(void)
+{
+
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+}
+
+void
+Idle(void)
+{
+ glutPostRedisplay();
+}
+
+static void Init(void)
+{
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+
+ glShadeModel(GL_FLAT);
+
+ glFrontFace(GL_CW);
+
+ glEnable(GL_DEPTH_TEST);
+
+ InitMaterials();
+ InitTexture();
+ InitMesh();
+
+ glMatrixMode(GL_MODELVIEW);
+ glTranslatef(0.0, 0.4, -1.8);
+ glScalef(2.0, 2.0, 2.0);
+ glRotatef(-35.0, 1.0, 0.0, 0.0);
+ glRotatef(35.0, 0.0, 0.0, 1.0);
+}
+
+static void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+}
+
+void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(0); break;
+ case 'c':
+ contouring++;
+ if (contouring == 1) {
+ static GLfloat map[4] = {0, 0, 20, 0};
+
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, 4, 4, 0, GL_LUMINANCE,
+ GL_UNSIGNED_BYTE, (GLvoid *)contourTexture1);
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGenfv(GL_S, GL_OBJECT_PLANE, map);
+ glTexGenfv(GL_T, GL_OBJECT_PLANE, map);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ } else if (contouring == 2) {
+ static GLfloat map[4] = {0, 0, 20, 0};
+
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ glPushMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTexGenfv(GL_S, GL_EYE_PLANE, map);
+ glTexGenfv(GL_T, GL_EYE_PLANE, map);
+ glPopMatrix();
+ } else {
+ contouring = 0;
+ glDisable(GL_TEXTURE_GEN_S);
+ glDisable(GL_TEXTURE_GEN_T);
+ glDisable(GL_TEXTURE_2D);
+ }
+ break;
+ case 's':
+ smooth = !smooth;
+ if (smooth) {
+ glShadeModel(GL_SMOOTH);
+ } else {
+ glShadeModel(GL_FLAT);
+ }
+ break;
+ case 'l':
+ lighting = !lighting;
+ if (lighting) {
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_COLOR_MATERIAL);
+ } else {
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_COLOR_MATERIAL);
+ }
+ break;
+ case 'd':
+ depth = !depth;
+ if (depth) {
+ glEnable(GL_DEPTH_TEST);
+ clearMask |= GL_DEPTH_BUFFER_BIT;
+ } else {
+ glDisable(GL_DEPTH_TEST);
+ clearMask &= ~GL_DEPTH_BUFFER_BIT;
+ }
+ break;
+ case ' ':
+ stepMode = !stepMode;
+ if (stepMode) {
+ glutIdleFunc(0);
+ } else {
+ glutIdleFunc(Idle);
+ }
+ break;
+ case 'n':
+ if (stepMode) {
+ nextFrame = 1;
+ }
+ break;
+ case 'a':
+ spinMode = !spinMode;
+ break;
+ default:
+ return ;
+ }
+ return ;
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ doubleBuffer = GL_TRUE;
+ directRender = GL_TRUE;
+ rgb = GL_TRUE;
+ frames = 10;
+ widthX = 10;
+ widthY = 10;
+ checkerSize = 2;
+ height = 0.2;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else if (strcmp(argv[i], "-dr") == 0) {
+ directRender = GL_TRUE;
+ } else if (strcmp(argv[i], "-ir") == 0) {
+ directRender = GL_FALSE;
+ } else if (strcmp(argv[i], "-grid") == 0) {
+ if (i+2 >= argc || argv[i+1][0] == '-' || argv[i+2][0] == '-') {
+ printf("-grid (No numbers).\n");
+ return GL_FALSE;
+ } else {
+ widthX = atoi(argv[++i]);
+ widthY = atoi(argv[++i]);
+ }
+ } else if (strcmp(argv[i], "-size") == 0) {
+ if (i+1 >= argc || argv[i+1][0] == '-') {
+ printf("-checker (No number).\n");
+ return GL_FALSE;
+ } else {
+ checkerSize = atoi(argv[++i]);
+ }
+ } else if (strcmp(argv[i], "-wave") == 0) {
+ if (i+1 >= argc || argv[i+1][0] == '-') {
+ printf("-wave (No number).\n");
+ return GL_FALSE;
+ } else {
+ height = atof(argv[++i]);
+ }
+ } else if (strcmp(argv[i], "-frames") == 0) {
+ if (i+1 >= argc || argv[i+1][0] == '-') {
+ printf("-frames (No number).\n");
+ return GL_FALSE;
+ } else {
+ frames = atoi(argv[++i]);
+ }
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int
+main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInitWindowSize(300, 300);
+ glutInit(&argc, argv);
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+ type = (rgb) ? GLUT_RGB : GLUT_INDEX;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ glutCreateWindow("wave");
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutIdleFunc(Idle);
+ glutDisplayFunc(display);
+
+ glutMainLoop();
+ return 0; /* ANSI C requires main to return int. */
+}
+
diff --git a/demos/olympicCvs.java b/demos/olympicCvs.java
new file mode 100644
index 0000000..189e52d
--- /dev/null
+++ b/demos/olympicCvs.java
@@ -0,0 +1,282 @@
+/**
+ * @(#) olympicCvs.java
+ */
+
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.Math;
+
+
+class olympicCvs extends GLAnimCanvas
+{
+/**
+ * Instead of using suspend (JAVA2)
+ *
+ * @see run
+ */
+ protected boolean threadSuspended = true;
+
+ static final double M_PI= 3.141592654;
+ static final double M_2PI= 2*3.141592654;
+
+ static final int
+ XSIZE= 100,
+ YSIZE= 75,
+ RINGS= 5,
+ BLUERING= 0,
+ BLACKRING= 1,
+ REDRING= 2,
+ YELLOWRING =3,
+ GREENRING =4,
+ BACKGROUND =8,
+ BLACK = 0,
+ RED=1,
+ GREEN=2,
+ YELLOW=3,
+ BLUE=4,
+ MAGENTA=5,
+ CYAN=6,
+ WHITE=7;
+
+ byte rgb_colors[][];
+ int mapped_colors[];
+ float dests[][];
+ float offsets[][];
+ float angs[];
+ float rotAxis[][];
+ int iters[];
+ int theTorus;
+
+ float lmodel_ambient[] = {0.0f, 0.0f, 0.0f, 0.0f};
+ float lmodel_twoside[] = {0.0f, 0.0f, 0.0f, 0.0f};
+ float lmodel_local[] = {0.0f, 0.0f, 0.0f, 0.0f};
+ float light0_ambient[] = {0.1f, 0.1f, 0.1f, 1.0f};
+ float light0_diffuse[] = {1.0f, 1.0f, 1.0f, 0.0f};
+ float light0_position[] = {0.8660254f, 0.5f, 1f, 0f};
+ float light0_specular[] = {1.0f, 1.0f, 1.0f, 0.0f};
+ float bevel_mat_ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
+ float bevel_mat_shininess[] = {40.0f, 0f, 0f, 0f};
+ float bevel_mat_specular[] = {1.0f, 1.0f, 1.0f, 0.0f};
+ float bevel_mat_diffuse[] = {1.0f, 0.0f, 0.0f, 0.0f};
+
+ public olympicCvs (int w, int h,
+ String glClass, String gluClass )
+ {
+ super(w, h, glClass, gluClass );
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = true;
+ }
+
+ public void init()
+ {
+ rgb_colors=new byte[RINGS][3];
+ mapped_colors=new int [RINGS];
+ dests=new float [RINGS][3];
+ offsets=new float[RINGS][3];
+ angs=new float[RINGS];
+ rotAxis=new float[RINGS][3];
+ iters=new int[RINGS];
+
+ int i;
+ float top_y = 1.0f;
+ float bottom_y = 0.0f;
+ float top_z = 0.15f;
+ float bottom_z = 0.69f;
+ float spacing = 2.5f;
+
+ ReInit();
+ for (i = 0; i < RINGS; i++) {
+ rgb_colors[i][0] = rgb_colors[i][1] = rgb_colors[i][2] = (byte)0;
+ }
+ rgb_colors[BLUERING][2] = (byte)255;
+ rgb_colors[REDRING][0] = (byte)255;
+ rgb_colors[GREENRING][1] = (byte)255;
+ rgb_colors[YELLOWRING][0] = (byte)255;
+ rgb_colors[YELLOWRING][1] = (byte)255;
+ mapped_colors[BLUERING] = BLUE;
+ mapped_colors[REDRING] = RED;
+ mapped_colors[GREENRING] = GREEN;
+ mapped_colors[YELLOWRING] = YELLOW;
+ mapped_colors[BLACKRING] = BLACK;
+
+ dests[BLUERING][0] = -spacing;
+ dests[BLUERING][1] = top_y;
+ dests[BLUERING][2] = top_z;
+
+ dests[BLACKRING][0] = 0.0f;
+ dests[BLACKRING][1] = top_y;
+ dests[BLACKRING][2] = top_z;
+
+ dests[REDRING][0] = spacing;
+ dests[REDRING][1] = top_y;
+ dests[REDRING][2] = top_z;
+
+ dests[YELLOWRING][0] = -spacing / 2.0f;
+ dests[YELLOWRING][1] = bottom_y;
+ dests[YELLOWRING][2] = bottom_z;
+
+ dests[GREENRING][0] = spacing / 2.0f;
+ dests[GREENRING][1] = bottom_y;
+ dests[GREENRING][2] = bottom_z;
+
+ theTorus = gl.glGenLists(1);
+ gl.glNewList(theTorus, GL_COMPILE);
+ FillTorus(0.1f, 8, 1.0f, 25);
+ gl.glEndList();
+
+ gl.glEnable(GL_CULL_FACE);
+ gl.glCullFace(GL_BACK);
+ gl.glEnable(GL_DEPTH_TEST);
+ gl.glClearDepth(1.0);
+
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
+ gl.glLightfv(GL_LIGHT0, GL_SPECULAR, light0_specular);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
+ gl.glEnable(GL_LIGHT0);
+
+ gl.glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_local);
+ gl.glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ gl.glEnable(GL_LIGHTING);
+
+ gl.glClearColor(0.5f, 0.5f, 0.5f, 0.0f);
+
+ gl.glMaterialfv(GL_FRONT, GL_AMBIENT, bevel_mat_ambient);
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, bevel_mat_shininess);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, bevel_mat_specular);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, bevel_mat_diffuse);
+
+ gl.glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+ gl.glEnable(GL_COLOR_MATERIAL);
+ gl.glShadeModel(GL_SMOOTH);
+
+ gl.glMatrixMode(GL_PROJECTION);
+ glu.gluPerspective(45f, 1.33f, 0.1f, 100.0f);
+ gl.glMatrixMode(GL_MODELVIEW);
+ glj.gljCheckGL();
+ }
+
+
+ public void display()
+ {
+ int i;
+
+ /* Standard GL4Java Init */
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ gl.glPushMatrix();
+
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glu.gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);
+
+ for (i = 0; i < RINGS; i++) {
+ gl.glColor3ubv(rgb_colors[i]);
+ gl.glPushMatrix();
+ gl.glTranslatef(dests[i][0] + offsets[i][0], dests[i][1] + offsets[i][1],
+ dests[i][2] + offsets[i][2]);
+ gl.glRotatef(angs[i], rotAxis[i][0], rotAxis[i][1], rotAxis[i][2]);
+ gl.glCallList(theTorus);
+ gl.glPopMatrix();
+ }
+
+ gl.glPopMatrix();
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ animationCalc();
+ }
+
+ public void animationCalc()
+ {
+ int i, j;
+
+ for (i = 0; i < RINGS; i++) {
+ if (iters[i]!=0) {
+ for (j = 0; j < 3; j++) {
+ offsets[i][j] = Clamp(iters[i], offsets[i][j]);
+ }
+ angs[i] = Clamp(iters[i], angs[i]);
+ iters[i]--;
+ }
+ }
+ if (iters[0]==0)
+ {
+ shallWeRender=false;
+ }
+ }
+
+ public void ReInit()
+ {
+ int i;
+ float deviation;
+
+ deviation = MyRand() / 2;
+ deviation = deviation * deviation;
+ for (i = 0; i < RINGS; i++) {
+ offsets[i][0] = MyRand();
+ offsets[i][1] = MyRand();
+ offsets[i][2] = MyRand();
+ angs[i] = (float) (260.0 * MyRand());
+ rotAxis[i][0] = MyRand();
+ rotAxis[i][1] = MyRand();
+ rotAxis[i][2] = MyRand();
+ iters[i] = ( int ) (deviation * MyRand() + 60.0);
+ }
+ }
+
+ public void FillTorus(float rc, int numc, float rt, int numt)
+ {
+ int i, j, k;
+ double s, t;
+ float x, y, z;
+
+ for (i = 0; i < numc; i++) {
+ gl.glBegin(GL_QUAD_STRIP);
+ for (j = 0; j <= numt; j++) {
+ for (k = 1; k >= 0; k--) {
+ s = (i + k) % numc + 0.5;
+ t = j % numt;
+
+ x = (float) Math.cos(t * M_2PI / numt) * (float) Math.cos(s * M_2PI / numc);
+ y = (float) Math.sin(t * M_2PI / numt) * (float) Math.cos(s * M_2PI / numc);
+ z = (float) Math.sin(s * M_2PI / numc);
+ gl.glNormal3f(x, y, z);
+
+ x = (rt + rc * (float) Math.cos(s * M_2PI / numc)) * (float) Math.cos(t * M_2PI / numt);
+ y = (rt + rc * (float) Math.cos(s * M_2PI / numc)) * (float) Math.sin(t * M_2PI / numt);
+ z = rc * (float) Math.sin(s * M_2PI / numc);
+ gl.glVertex3f(x, y, z);
+ }
+ }
+ gl.glEnd();
+ }
+ }
+
+ public float Clamp(int iters_left, float t)
+ {
+
+ if (iters_left < 3) {
+ return 0.0f;
+ }
+ return (iters_left - 2) * t / iters_left;
+ }
+
+ public float MyRand()
+ {
+ // return 10.0 * (drand48() - 0.5);
+ return (float) ( 10.0 * (Math.random() - 0.5) );
+ }
+
+}
+
diff --git a/demos/sappletviewer.bat b/demos/sappletviewer.bat
new file mode 100755
index 0000000..90f7666
--- /dev/null
+++ b/demos/sappletviewer.bat
@@ -0,0 +1 @@
+appletviewer.exe -J-Djava.security.policy=gl4java.policy %*
diff --git a/demos/sappletviewer.sh b/demos/sappletviewer.sh
new file mode 100755
index 0000000..21c2e07
--- /dev/null
+++ b/demos/sappletviewer.sh
@@ -0,0 +1,4 @@
+#! /bin/sh
+
+echo aa
+appletviewer -J-Djava.security.policy=gl4java.policy $*
diff --git a/demos/starCvs.java b/demos/starCvs.java
new file mode 100644
index 0000000..b7c942c
--- /dev/null
+++ b/demos/starCvs.java
@@ -0,0 +1,205 @@
+/*
+ * Leo Chan
+ *
+ * October 1995
+ *
+ * -----------
+ *
+ * Sven Goethel
+ * September 1997
+ *
+ * @version 1.0, 23. JUNI 1998
+ */
+
+
+import gl4java.awt.*;
+import java.awt.*;
+import java.awt.event.*;
+
+
+class starCvs extends GLAnimCanvas
+{
+ protected int FrameStep =0;
+
+ float lmodel_twoside[] = null;
+ float lmodel_local[] = null;
+ float lmodel_ambient[] = null;
+
+ public starCvs(int w, int h, String glClass, String gluClass)
+ {
+ super( w, h, glClass, gluClass);
+ }
+
+ public void init()
+ {
+ lmodel_twoside= new float[4];
+ lmodel_twoside[0]=0f;
+ lmodel_twoside[1]=0f;
+ lmodel_twoside[2]=0f;
+ lmodel_twoside[3]=0f;
+ lmodel_local= new float[4];
+ lmodel_local[0]=0f;
+ lmodel_local[1]=0f;
+ lmodel_local[2]=0f;
+ lmodel_local[3]=0f;
+ lmodel_ambient= new float[4];
+ lmodel_ambient[0]=0f;
+ lmodel_ambient[1]=0f;
+ lmodel_ambient[2]=0f;
+ lmodel_ambient[3]=0f;
+
+ /* initialize the widget */
+ gl.glClearColor( 0.8f, 0.8f, 1.0f, 1.0f );
+ gl.glFrontFace( GL_CW );
+ gl.glEnable( GL_DEPTH_TEST );
+
+ int width = cvsGetWidth();
+ int height = cvsGetHeight();
+
+ gl.glViewport( 0, 0, width, height );
+
+ gl.glMatrixMode( GL_PROJECTION );
+ gl.glLoadIdentity();
+
+ double fov = 45.0,
+ aspect = width / height,
+ near = 1.0,
+ far = 200.0;
+ glu.gluPerspective( fov, aspect, near, far );
+
+ gl.glMatrixMode( GL_MODELVIEW );
+ gl.glLoadIdentity();
+
+ /* render three rotated cylinders */
+ gl.glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+
+ float lightArr[] = new float[4];
+ float farr[] = new float[4];
+
+ /* enable lighting */
+
+ lightArr[0] = 1.0f; lightArr[1] = 1.0f;
+ lightArr[2] = 1.0f; lightArr[3] = 1.0f;
+ gl.glLightfv( GL_LIGHT0, GL_DIFFUSE, lightArr );
+ lightArr[0] = 90.0f; lightArr[1] = 90.0f;
+ lightArr[2] = 0.0f; lightArr[3] = 0.0f;
+ gl.glLightfv( GL_LIGHT0, GL_POSITION, lightArr );
+ lightArr[0] = 0.1f; lightArr[1] = 0.1f;
+ lightArr[2] = 0.1f; lightArr[3] = 1.0f;
+ gl.glLightfv( GL_LIGHT0, GL_AMBIENT, lightArr );
+ gl.glLightModeli( GL_LIGHT_MODEL_TWO_SIDE,
+ 1 );
+ gl.glEnable( GL_LIGHT0 );
+
+ /*
+ gl.glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_local);
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ */
+ gl.glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
+ gl.glEnable( GL_LIGHTING );
+
+
+ gl.glMaterialf( GL_FRONT, GL_SHININESS, 30.0f );
+
+ farr[0] = 0.0f; farr[1] = 0.0f; farr[2] = 0.0f; farr[3] = 1.0f;
+ gl.glMaterialfv( GL_FRONT, GL_SPECULAR, farr );
+
+ farr[0] = 0.0f; farr[1] = 1.0f; farr[2] = 0.0f; farr[3] = 1.0f;
+ gl.glMaterialfv( GL_FRONT, GL_DIFFUSE, farr );
+
+ gl.glMaterialf( GL_BACK, GL_SHININESS, 50.0f );
+
+ farr[0] = 0.0f; farr[1] = 0.0f; farr[2] = 1.0f; farr[3] = 1.0f;
+ gl.glMaterialfv( GL_BACK, GL_SPECULAR, farr );
+
+ farr[0] = 1.0f; farr[1] = 1.0f; farr[2] = 0.0f; farr[3] = 1.0f;
+ gl.glMaterialfv( GL_BACK, GL_DIFFUSE, farr );
+ }
+
+ public void animationCalc()
+ {
+ FrameStep+=1;
+ if(FrameStep>100000) FrameStep=0;
+ }
+
+ public void display()
+ {
+ /* Standard gl4java Init */
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ gl.glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ gl.glPushMatrix();
+ gl.glTranslatef( 0.0f, 0.0f, -65.0f );
+ gl.glRotatef( 40.0f+(2f*FrameStep), 0.0f, 0.0f, 1.0f );
+ gl.glRotatef( 190.0f+(2f*FrameStep), 0.0f, 1.0f, 0.0f );
+ gl.glRotatef( 200.0f+(FrameStep*2f), 1.0f, 0.0f, 0.0f );
+ gl.glPushMatrix();
+ gl.glScalef( 1.0f, 1.0f, 10.0f );
+ drawCylinder();
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef( 90.0f, 0.0f, 1.0f, 0.0f );
+ gl.glScalef( 1.0f, 1.0f, 10.0f );
+ drawCylinder();
+ gl.glPopMatrix();
+ gl.glPushMatrix();
+ gl.glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
+ gl.glScalef( 1.0f, 1.0f, 10.0f );
+ drawCylinder();
+ gl.glPopMatrix();
+ gl.glPopMatrix();
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ animationCalc() ;
+ }
+
+ public void drawCylinder()
+ {
+ gl.glBegin( GL_TRIANGLE_STRIP );
+ gl.glNormal3f ( 1.0f, 0.0f, -5.0f);
+ gl.glVertex3f ( 1.0f, 0.0f, -5.0f);
+ gl.glNormal3f ( 1.0f, 0.0f, -5.0f);
+ gl.glVertex3f (1.000000f, 0.000000f, 5.000000f);
+ gl.glNormal3f (0.707107f, 0.707107f, -5.000000f);
+ gl.glVertex3f (0.707107f, 0.707107f, -5.000000f);
+ gl.glNormal3f (0.707107f, 0.707107f, -5.000000f);
+ gl.glVertex3f (0.707107f, 0.707107f, 5.000000f);
+ gl.glNormal3f (0.000000f, 1.000000f, -5.000000f);
+ gl.glVertex3f (0.000000f, 1.000000f, -5.000000f);
+ gl.glNormal3f (0.000000f, 1.000000f, -5.000000f);
+ gl.glVertex3f (0.000000f, 1.000000f, 5.000000f);
+ gl.glNormal3f (-0.707107f, 0.707107f, -5.00000f);
+ gl.glVertex3f (-0.707107f, 0.707107f, -5.00000f);
+ gl.glNormal3f (-0.707107f, 0.707107f, -5.00000f);
+ gl.glVertex3f (-0.707107f, 0.707107f, 5.00000f);
+ gl.glNormal3f (-1.000000f, 0.000000f, -5.000000f);
+ gl.glVertex3f (-1.000000f, 0.000000f, -5.000000f);
+ gl.glNormal3f (-1.000000f, 0.000000f, -5.000000f);
+ gl.glVertex3f (-1.000000f, 0.000000f, 5.00000f);
+ gl.glNormal3f (-0.707107f, -0.707107f, -5.000000f);
+ gl.glVertex3f (-0.707107f, -0.707107f, -5.000000f);
+ gl.glNormal3f (-0.707107f, -0.707107f, -5.000000f);
+ gl.glVertex3f (-0.707107f, -0.707107f, 5.00000f);
+ gl.glNormal3f (0.000000f, -1.000000f, -5.000000f);
+ gl.glVertex3f (0.000000f, -1.000000f, -5.000000f);
+ gl.glNormal3f (0.000000f, -1.000000f, -5.000000f);
+ gl.glVertex3f (0.000000f, -1.000000f, 5.00000f);
+ gl.glNormal3f (0.707107f, -0.707107f, -5.00000f);
+ gl.glVertex3f (0.707107f, -0.707107f, -5.00000f);
+ gl.glNormal3f (0.707107f, -0.707107f, -5.00000f);
+ gl.glVertex3f (0.707107f, -0.707107f, 5.000000f);
+ gl.glNormal3f (1.000000f, 0.000000f, -5.00000f);
+ gl.glVertex3f (1.000000f, 0.000000f, -5.00000f);
+ gl.glNormal3f (1.000000f, 0.000000f, -5.00000f);
+ gl.glVertex3f (1.000000f, 0.000000f, 5.00000f);
+ gl.glEnd();
+ }
+}
+
diff --git a/demos/starCvs.java-orig b/demos/starCvs.java-orig
new file mode 100644
index 0000000..9a45e68
--- /dev/null
+++ b/demos/starCvs.java-orig
@@ -0,0 +1,444 @@
+/*
+ * Leo Chan
+ *
+ * October 1995
+ *
+ * -----------
+ *
+ * Sven Goethel
+ * September 1997
+ *
+ * @version 1.0, 23. JUNI 1998
+ */
+
+
+import GL4Java.*;
+import java.awt.*;
+import java.awt.event.*;
+
+
+class testGL1 extends GLFrame
+ implements ActionListener, ComponentListener, MouseListener, Runnable
+{
+
+ protected double FramesPerSec=20;
+ protected long fps_count=0;
+ protected long fps_start=0;
+
+ protected Thread killme = null;
+ protected int FrameStep =0;
+
+ protected boolean inAnApplet = true;
+
+ float lmodel_twoside[] = null;
+ float lmodel_local[] = null;
+ float lmodel_ambient[] = null;
+
+ InfoWin iw=null;
+
+ public static void main( String args[] )
+ {
+ GLFrame.glNativeDebug = false;
+ GLFrame.glClassDebug = false;
+ testGL1 tt = new testGL1();
+ tt.inAnApplet=false;
+ }
+
+ public testGL1()
+ {
+ super( "Star GL4Java", 300, 250 );
+ setVisible(true);
+ }
+
+ Frame ctrl = null;
+
+ Button ButtonFps; TextField TextFps;
+
+ public void init()
+ {
+ ctrl = new Frame ("Features");
+
+ ctrl.setLayout(new GridLayout(1,2));
+ ctrl.add ( ButtonFps=new Button("Frames per secound") );
+ ctrl.add ( TextFps=new TextField() );
+
+ ctrl.pack();
+ ctrl.setVisible( true );
+
+ ButtonFps.addMouseListener(this);
+ TextFps.addActionListener(this);
+
+ ctrl.addWindowListener(this);
+
+ iw = new InfoWin(this);
+ iw.pack();
+ iw.show();
+
+ iw.addWindowListener(this);
+
+ lmodel_twoside= new float[4];
+ lmodel_twoside[0]=0f;
+ lmodel_twoside[1]=0f;
+ lmodel_twoside[2]=0f;
+ lmodel_twoside[3]=0f;
+ lmodel_local= new float[4];
+ lmodel_local[0]=0f;
+ lmodel_local[1]=0f;
+ lmodel_local[2]=0f;
+ lmodel_local[3]=0f;
+ lmodel_ambient= new float[4];
+ lmodel_ambient[0]=0f;
+ lmodel_ambient[1]=0f;
+ lmodel_ambient[2]=0f;
+ lmodel_ambient[3]=0f;
+
+ /* Standard GL4Java Init */
+ if( gljUse() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ /* initialize the widget */
+ glClearColor( 0.8f, 0.8f, 1.0f, 1.0f );
+ glFrontFace( GL_CW );
+ glEnable( GL_DEPTH_TEST );
+
+ int width = gljGetWidth();
+ int height = gljGetHeight();
+
+ glViewport( 0, 0, width, height );
+
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+
+ double fov = 45.0,
+ aspect = width / height,
+ near = 1.0,
+ far = 200.0;
+ gluPerspective( fov, aspect, near, far );
+
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+
+ /* render three rotated cylinders */
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+
+ float lightArr[] = new float[4];
+ float farr[] = new float[4];
+
+ /* enable lighting */
+
+ lightArr[0] = 1.0f; lightArr[1] = 1.0f;
+ lightArr[2] = 1.0f; lightArr[3] = 1.0f;
+ glLightfv( GL_LIGHT0, GL_DIFFUSE, lightArr );
+ lightArr[0] = 90.0f; lightArr[1] = 90.0f;
+ lightArr[2] = 0.0f; lightArr[3] = 0.0f;
+ glLightfv( GL_LIGHT0, GL_POSITION, lightArr );
+ lightArr[0] = 0.1f; lightArr[1] = 0.1f;
+ lightArr[2] = 0.1f; lightArr[3] = 1.0f;
+ glLightfv( GL_LIGHT0, GL_AMBIENT, lightArr );
+ glLightModeli( GL_LIGHT_MODEL_TWO_SIDE,
+ 1 );
+ glEnable( GL_LIGHT0 );
+
+ /*
+ glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_local);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ */
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
+ glEnable( GL_LIGHTING );
+
+
+ glMaterialf( GL_FRONT, GL_SHININESS, 30.0f );
+
+ farr[0] = 0.0f; farr[1] = 0.0f; farr[2] = 0.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_FRONT, GL_SPECULAR, farr );
+
+ farr[0] = 0.0f; farr[1] = 1.0f; farr[2] = 0.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_FRONT, GL_DIFFUSE, farr );
+
+ glMaterialf( GL_BACK, GL_SHININESS, 50.0f );
+
+ farr[0] = 0.0f; farr[1] = 0.0f; farr[2] = 1.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_BACK, GL_SPECULAR, farr );
+
+ farr[0] = 1.0f; farr[1] = 1.0f; farr[2] = 0.0f; farr[3] = 1.0f;
+ glMaterialfv( GL_BACK, GL_DIFFUSE, farr );
+
+ start();
+ }
+
+ public void start()
+ {
+ if(killme == null)
+ {
+ killme = new Thread(this,"star");
+ killme.start();
+
+ fps_count=0;
+ fps_start=System.currentTimeMillis();
+ }
+ }
+ public void stop()
+ {
+ killme.stop();
+ killme = null;
+ }
+
+ public void run()
+ {
+
+ while (killme!=null)
+ {
+
+ /* DRAW THE TINGS .. */
+ repaint();
+ try {Thread.sleep((int)((1.0/FramesPerSec)*1000.0));} catch (InterruptedException e){}
+
+ //sDisplay();
+
+ FrameStep+=1;
+ if(FrameStep>100000) FrameStep=0;
+
+ //Thread.yield();
+ }
+
+ }
+
+ public void display()
+ {
+ /* Standard GL4Java Init */
+ if( gljUse() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ glPushMatrix();
+ glTranslatef( 0.0f, 0.0f, -65.0f );
+ glRotatef( 40.0f+(2f*FrameStep), 0.0f, 0.0f, 1.0f );
+ glRotatef( 190.0f+(2f*FrameStep), 0.0f, 1.0f, 0.0f );
+ glRotatef( 200.0f+(FrameStep*2f), 1.0f, 0.0f, 0.0f );
+ glPushMatrix();
+ glScalef( 1.0f, 1.0f, 10.0f );
+ drawCylinder();
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef( 90.0f, 0.0f, 1.0f, 0.0f );
+ glScalef( 1.0f, 1.0f, 10.0f );
+ drawCylinder();
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef( 90.0f, 1.0f, 0.0f, 0.0f );
+ glScalef( 1.0f, 1.0f, 10.0f );
+ drawCylinder();
+ glPopMatrix();
+ glPopMatrix();
+
+ gljSwap();
+ gljCheckGL();
+
+ fps_count++;
+ }
+
+ public void drawCylinder()
+ {
+ glBegin( GL_TRIANGLE_STRIP );
+ glNormal3f ( 1.0f, 0.0f, -5.0f);
+ glVertex3f ( 1.0f, 0.0f, -5.0f);
+ glNormal3f ( 1.0f, 0.0f, -5.0f);
+ glVertex3f (1.000000f, 0.000000f, 5.000000f);
+ glNormal3f (0.707107f, 0.707107f, -5.000000f);
+ glVertex3f (0.707107f, 0.707107f, -5.000000f);
+ glNormal3f (0.707107f, 0.707107f, -5.000000f);
+ glVertex3f (0.707107f, 0.707107f, 5.000000f);
+ glNormal3f (0.000000f, 1.000000f, -5.000000f);
+ glVertex3f (0.000000f, 1.000000f, -5.000000f);
+ glNormal3f (0.000000f, 1.000000f, -5.000000f);
+ glVertex3f (0.000000f, 1.000000f, 5.000000f);
+ glNormal3f (-0.707107f, 0.707107f, -5.00000f);
+ glVertex3f (-0.707107f, 0.707107f, -5.00000f);
+ glNormal3f (-0.707107f, 0.707107f, -5.00000f);
+ glVertex3f (-0.707107f, 0.707107f, 5.00000f);
+ glNormal3f (-1.000000f, 0.000000f, -5.000000f);
+ glVertex3f (-1.000000f, 0.000000f, -5.000000f);
+ glNormal3f (-1.000000f, 0.000000f, -5.000000f);
+ glVertex3f (-1.000000f, 0.000000f, 5.00000f);
+ glNormal3f (-0.707107f, -0.707107f, -5.000000f);
+ glVertex3f (-0.707107f, -0.707107f, -5.000000f);
+ glNormal3f (-0.707107f, -0.707107f, -5.000000f);
+ glVertex3f (-0.707107f, -0.707107f, 5.00000f);
+ glNormal3f (0.000000f, -1.000000f, -5.000000f);
+ glVertex3f (0.000000f, -1.000000f, -5.000000f);
+ glNormal3f (0.000000f, -1.000000f, -5.000000f);
+ glVertex3f (0.000000f, -1.000000f, 5.00000f);
+ glNormal3f (0.707107f, -0.707107f, -5.00000f);
+ glVertex3f (0.707107f, -0.707107f, -5.00000f);
+ glNormal3f (0.707107f, -0.707107f, -5.00000f);
+ glVertex3f (0.707107f, -0.707107f, 5.000000f);
+ glNormal3f (1.000000f, 0.000000f, -5.00000f);
+ glVertex3f (1.000000f, 0.000000f, -5.00000f);
+ glNormal3f (1.000000f, 0.000000f, -5.00000f);
+ glVertex3f (1.000000f, 0.000000f, 5.00000f);
+ glEnd();
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+
+ if( gljUse() == false )
+ {
+ System.out.println("CtrlWin: problem in use() method");
+ return;
+ }
+
+ glFinish();
+
+ if(comp.equals(ButtonFps))
+ {
+ long fps_end=System.currentTimeMillis();
+ long timed= (fps_end-fps_start)/1000;
+ if(timed==0) timed=1;
+ TextFps.setText(String.valueOf(fps_count/timed));
+ System.out.println("calculated fps: "+TextFps.getText());
+
+ fps_count=0;
+ fps_start=System.currentTimeMillis();
+ }
+
+ glFinish();
+ gljFree();
+
+ if ( killme==null || ! Thread.currentThread().equals(killme) )
+ repaint();
+ }
+
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ }
+
+ public void windowClosing(WindowEvent e)
+ {
+ Component comp = e.getComponent();
+
+ if(ctrl!=null && ( comp.equals(ctrl) || comp.equals(this) ) )
+ {
+ ctrl.dispose();
+ }
+
+ if(iw!=null && ( comp.equals(iw) || comp.equals(this) ) )
+ {
+ iw.dispose();
+ }
+
+
+ if(killme!=null && comp.equals(this) )
+ {
+ ctrl.dispose();
+ iw.dispose();
+ super.windowClosing(e);
+ killme.stop();
+ }
+ }
+
+ public void actionPerformed(ActionEvent event)
+ {
+ Object source = event.getSource();
+
+ if ( source == TextFps)
+ {
+ try {
+ FramesPerSec=Double.valueOf(TextFps.getText()).doubleValue();
+ System.out.println("trying "+FramesPerSec+" fps.");
+ } catch (NumberFormatException s) {
+ System.out.println("wrong fps format, use float ..");
+ }
+
+ fps_count=0;
+ fps_start=System.currentTimeMillis();
+ }
+ }
+
+ public class InfoWin extends Frame
+ implements ActionListener
+ {
+ GLFrame glFrame = null;
+
+ TextArea output = null;
+
+ MenuItem miGLInfo = null;
+
+ public InfoWin(GLFrame glf)
+ {
+ glFrame=glf;
+
+ setTitle("Info Window");
+
+ output = new TextArea(5, 30);
+ output.setEditable(false);
+ setLayout(new BorderLayout()); //give max space to the output
+ add("Center", output);
+
+
+ MenuBar mb = new MenuBar();
+ setMenuBar( mb );
+
+ Menu info = new Menu( "Info");
+ info.add( (miGLInfo=new MenuItem( "about GL/GLU")));
+ mb.add( info );
+
+ miGLInfo.addActionListener(this);
+
+ }
+
+ public void actionPerformed(ActionEvent event)
+ {
+ String str = new String();
+
+ if (event.getSource().equals(miGLInfo)) {
+ if( gljUse() == false )
+ {
+ str=str+"problem in use() method\n";
+ } else {
+ String glVen = glGetString(GL_VENDOR);
+ String glRen = glGetString(GL_RENDERER);
+ String glVer = glGetString(GL_VERSION);
+ String glExt = glGetString(GL_EXTENSIONS);
+ String gluVer = gluGetString(GLU_VERSION);
+ String gluExt = gluGetString(GLU_EXTENSIONS);
+
+ str=str+"GL VENDOR: "+glVen+"\n";
+ str=str+"GL RENDERER: "+glRen+"\n";
+ str=str+"GL VERSION: "+glVer+"\n";
+ str=str+"GL EXTENSIONS: "+glExt+"\n";
+ str=str+"GLU VERSION: "+gluVer+"\n";
+ str=str+"GLU EXTENSIONS: "+gluExt+"\n";
+ gljFree();
+ }
+
+ }
+ str += "\n\n";
+ output.append(str);
+ }
+
+ }
+
+}
+
diff --git a/demos/test-jni12tst.sh b/demos/test-jni12tst.sh
new file mode 100755
index 0000000..d5f0d45
--- /dev/null
+++ b/demos/test-jni12tst.sh
@@ -0,0 +1,3 @@
+#! /bin/sh
+
+java gl4java.utils.Test -gljlib GL4JavaJauGljJNI12 -gllib GL4JavaJauGLJNI12tst -glulib GL4JavaJauGLUJNI12tst -testclass $1
diff --git a/demos/test-jnitst.sh b/demos/test-jnitst.sh
new file mode 100755
index 0000000..b078d5e
--- /dev/null
+++ b/demos/test-jnitst.sh
@@ -0,0 +1,3 @@
+#! /bin/sh
+
+java gl4java.utils.Test -gljlib GL4JavaJauGljJNI -gllib GL4JavaJauGLJNItst -glulib GL4JavaJauGLUJNItst -testclass $1
diff --git a/demos/test.sh b/demos/test.sh
new file mode 100755
index 0000000..3b1eb58
--- /dev/null
+++ b/demos/test.sh
@@ -0,0 +1,3 @@
+#! /bin/sh
+
+java gl4java.utils.Test -testclass $1
diff --git a/demos/test1Cvs.java b/demos/test1Cvs.java
new file mode 100644
index 0000000..85e03bb
--- /dev/null
+++ b/demos/test1Cvs.java
@@ -0,0 +1,100 @@
+/**
+ * @(#) test1Cvs.java
+ */
+
+import gl4java.GLContext;
+import gl4java.awt.GLCanvas;
+import java.awt.*;
+import java.awt.event.*;
+import java.lang.Math;
+
+
+class test1Cvs extends GLCanvas
+{
+/**
+ * Instead of using suspend (JAVA2)
+ *
+ * @see run
+ */
+ protected boolean threadSuspended = true;
+
+ protected int[] textures = null;
+
+ public test1Cvs (int w, int h,
+ String glClass, String gluClass )
+ {
+ super(w, h, glClass, gluClass );
+ }
+
+ public void preInit()
+ {
+ doubleBuffer = true;
+ stereoView = true;
+ }
+
+ public void init()
+ {
+ textures = new int[10];
+ gl.glGenTextures(10, textures);
+ for (int i=0; i<10; i++)
+ System.out.println("Texture "+ i +" maps to GL tex "+ textures[i]);
+ }
+
+
+ public void display()
+ {
+ /* Standard GL4Java Init */
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("problem in use() method");
+ return;
+ }
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void ReInit()
+ {
+ }
+
+ public static void main( String args[] ) {
+ String gljLib=null;
+ String glLib=null;
+ String gluLib=null;
+ String glClass=null;
+ String gluClass=null;
+
+ if(args.length>0)
+ gljLib = args[0];
+ if(args.length>1)
+ glLib = args[1];
+ if(args.length>2)
+ gluLib = args[2];
+
+ if(GLContext.loadNativeLibraries(gljLib, glLib, gluLib)==false)
+ System.out.println("could not load native libs:"+
+ gljLib + ", " + glLib + ", " + gluLib);
+ else
+ System.out.println("load native libs:"+
+ gljLib + ", " + glLib + ", " + gluLib);
+
+
+ Frame mainFrame = new Frame("glDemosCvs");
+
+ if(args.length>3)
+ glClass = args[3];
+ if(args.length>4)
+ gluClass = args[4];
+
+ test1Cvs cvs1 = new test1Cvs(100, 100, glClass, gluClass);
+
+ mainFrame.add(cvs1);
+
+ mainFrame.pack();
+ mainFrame.setVisible(true);
+ }
+
+}
+
diff --git a/demos/testTextPPM1.html b/demos/testTextPPM1.html
new file mode 100644
index 0000000..abc9237
--- /dev/null
+++ b/demos/testTextPPM1.html
@@ -0,0 +1,13 @@
+
+<HTML>
+<HEAD>
+<TITLE>test</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<applet code="testTextPPM1.class" width=550 height=550 >
+</applet>
+<hr>
+</BODY>
+</HTML>
+
diff --git a/demos/testTextPPM1.java b/demos/testTextPPM1.java
new file mode 100755
index 0000000..e7d876c
--- /dev/null
+++ b/demos/testTextPPM1.java
@@ -0,0 +1,496 @@
+//-? IMPORTS
+import gl4java.awt.GLCanvas;
+import gl4java.GLContext;
+import gl4java.utils.textures.*;
+
+import javax.swing.*;
+import javax.swing.event.*;
+import javax.swing.border.*;
+
+import java.awt.*;
+import java.awt.Color.*;
+import java.awt.event.*;
+import java.applet.*;
+import java.io.*;
+import java.net.*;
+
+//// TEST
+// UniversalFileAccess -> netscape
+/////////////////////////////////////////////////////////////////
+public class testTextPPM1 extends JApplet
+{
+
+//-? VARIABLES GLOBALS APPLET
+ JPanel panelControl,panelDibuix;
+ JButton botoShading,botoTexture;
+ dibuix dib;
+// ActionsListener Actions;
+// SliderListener Sliders;
+
+ //-? VARIABLES de CONTROL
+ double obsX=0 , obsY=0 , obsZ=1.0; //-? POSICIO OBSERVADOR
+ JSlider sl_alfaUsu,sl_betaUsu;
+
+ //-? VARIABLES GL
+ int tipusPolMode;
+
+ boolean isAnApplet = true;
+
+//---------------------------------------------------------------
+
+public void init() {
+
+
+// Actions = new ActionsListener();
+
+ panelDibuix = iniDibuix();
+ panelControl = iniControl();
+
+
+ getContentPane().setLayout(new BoxLayout(getContentPane(),BoxLayout.Y_AXIS));
+ getContentPane().add(panelControl);
+ getContentPane().add(panelDibuix);
+
+ getContentPane().repaint();
+}
+ public static void main( String args[] ) {
+ testTextPPM1 applet =
+ new testTextPPM1();
+
+ Frame f = new Frame("testTextPPM1");
+
+ f.addWindowListener( new WindowAdapter()
+ {
+ public void windowClosed(WindowEvent e)
+ {
+ System.exit(0);
+ }
+ public void windowClosing(WindowEvent e)
+ {
+ windowClosed(e);
+ }
+ }
+ );
+
+ f.setLayout(new BorderLayout());
+ f.add("Center", applet);
+ applet.setSize(500,300);
+ applet.isAnApplet = false;
+ applet.init();
+ applet.start();
+ Dimension ps = applet.getPreferredSize();
+ f.setBounds(-100,-100,99,99);
+ f.setVisible(true);
+ f.setVisible(false);
+ Insets i = f.getInsets();
+ f.setBounds(0,0,
+ ps.width+i.left+i.right,
+ ps.height+i.top+i.bottom);
+ f.setVisible(true);
+ }
+
+//---------------------------------------------------------------
+public void paint(Graphics g) {
+ getContentPane().repaint();
+ dib.display();
+}
+
+//---------------------------------------------------------------
+public JPanel iniControl() {
+
+ panelControl = new JPanel();
+
+ sl_alfaUsu = new JSlider(JSlider.HORIZONTAL,-180,180,0);
+ sl_alfaUsu.setMajorTickSpacing(45);
+ sl_alfaUsu.setMinorTickSpacing(15);
+ sl_alfaUsu.setPaintTicks(true);
+ sl_alfaUsu.setPaintLabels(true);
+ sl_alfaUsu.setPreferredSize(new Dimension(350,50));
+ sl_alfaUsu.setMaximumSize(new Dimension(350,50));
+ sl_alfaUsu.setMinimumSize(new Dimension(350,50));
+
+ sl_betaUsu = new JSlider(JSlider.HORIZONTAL,-90,90,0);
+ sl_betaUsu.setMajorTickSpacing(30);
+ sl_betaUsu.setMinorTickSpacing(10);
+ sl_betaUsu.setPaintTicks(true);
+ sl_betaUsu.setPaintLabels(true);
+ sl_betaUsu.setPreferredSize(new Dimension(350,50));
+ sl_betaUsu.setMaximumSize(new Dimension(350,50));
+ sl_betaUsu.setMinimumSize(new Dimension(350,50));
+
+ sl_alfaUsu.addChangeListener(dib);
+ sl_betaUsu.addChangeListener(dib);
+
+ //-? PANEL DE BOTONS
+ JPanel panelBotons = new JPanel();
+ panelBotons.setLayout(new BoxLayout(panelBotons,BoxLayout.X_AXIS));
+
+ botoShading = new JButton("Shading Model");
+ botoShading.addActionListener(dib);
+ botoShading.setActionCommand("bS");
+
+ botoTexture = new JButton("Textures");
+ botoTexture.addActionListener(dib);
+ botoTexture.setActionCommand("bT");
+
+ panelBotons.add(botoShading);
+ panelBotons.add(botoTexture);
+
+ //-? PANEL GLOBAL DE CONTROLS
+ panelControl.setLayout(new BoxLayout(panelControl,BoxLayout.Y_AXIS));
+ panelControl.add(sl_alfaUsu);
+ panelControl.add(sl_betaUsu);
+ panelControl.add(panelBotons);
+
+ return panelControl;
+}
+
+//---------------------------------------------------------------
+public JPanel iniDibuix() {
+
+ dib = new dibuix(550,550);
+
+ panelDibuix = new JPanel();
+ panelDibuix.setLayout(new BoxLayout(panelDibuix,BoxLayout.X_AXIS));
+ panelDibuix.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));
+ panelDibuix.add(dib);
+
+ return panelDibuix;
+}
+
+/////////////////////////////////////////////////////////////////
+//// DIBUIX
+/////////////////////////////////////////////////////////////////
+class dibuix extends GLCanvas
+ implements ActionListener,ChangeListener,MouseMotionListener,MouseListener
+{
+ //-? VARIABLES GLOBALS DE LA CLASSE
+
+ float n[][] = null; //-? NORMALS
+ int f[][] = null; //-? FACES
+ float v[][] = null; //-? VERTEXS
+
+ //-? POSICIO OBSERVADOR
+ //L'HEM POSADA GLOBAL double obsX=0 , obsY=0 , obsZ=5.0;
+
+ float llum_d[]; //-? LLUM DIFOSA
+ float llum_d_pos[]; //-? POSICIO LLUM DIFOSA
+ float llum_d2[]; //-? LLUM DIFOSA
+ float llum_d2_pos[]; //-? POSICIO LLUM DIFOSA
+
+ int texName[]={0};
+ boolean textures=false;
+
+ int anclaX,anclaY,anclaAlfa,anclaBeta;
+//---------------------------------------------------------------
+public dibuix(int x, int y){
+
+ //-? PASSEM A CLASSE SUPERIOR ELS 2 PARAMS. DE CONSTRUCTOR
+ super(x,y);
+}
+//---------------------------------------------------------------
+
+public void init(){
+
+ System.out.println("-- INIT");
+
+ addMouseMotionListener(this);
+ addMouseListener(this);
+
+ //-? INICIALITZEM NORMALS, VERTEXS , CARES i LLUMS
+ n = new float[6][3];
+ n[0][0]=-1f;
+ n[0][1]=0f;
+ n[0][2]=0f;
+ n[1][0]=0f;
+ n[1][1]=1f;
+ n[1][2]=0f;
+ n[2][0]=1f;
+ n[2][1]=0f;
+ n[2][2]=0f;
+ n[3][0]=0f;
+ n[3][1]=-1f;
+ n[3][2]=0f;
+ n[4][0]=0f;
+ n[4][1]=0f;
+ n[4][2]=1f;
+ n[5][0]=0f;
+ n[5][1]=0f;
+ n[5][2]=-1f;
+
+ f = new int[6][4];
+ f[0][0]=0;
+ f[0][1]=1;
+ f[0][2]=2;
+ f[0][3]=3;
+ f[1][0]=3;
+ f[1][1]=2;
+ f[1][2]=6;
+ f[1][3]=7;
+ f[2][0]=7;
+ f[2][1]=6;
+ f[2][2]=5;
+ f[2][3]=4;
+ f[3][0]=4;
+ f[3][1]=5;
+ f[3][2]=1;
+ f[3][3]=0;
+ f[4][0]=5;
+ f[4][1]=6;
+ f[4][2]=2;
+ f[4][3]=1;
+ f[5][0]=7;
+ f[5][1]=4;
+ f[5][2]=0;
+ f[5][3]=3;
+
+ v = new float[8][3];
+ v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1;
+ v[4][0] = v[5][0] = v[6][0] = v[7][0] = 1;
+ v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1;
+ v[2][1] = v[3][1] = v[6][1] = v[7][1] = 1;
+ v[0][2] = v[3][2] = v[4][2] = v[7][2] = 1;
+ v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1;
+
+ //-? DEFINICIO DE LLUMS
+ //-? LLUM DIFOSA 1
+ llum_d = new float[4];
+ llum_d[0] = 1.0f;
+ llum_d[1] = 0.0f;
+ llum_d[2] = 0.0f;
+ llum_d[3] = 1.0f;
+
+ llum_d_pos = new float[4];
+ llum_d_pos[0] = -3.0f;
+ llum_d_pos[1] = -3.0f;
+ llum_d_pos[2] = -4.0f;
+ llum_d_pos[3] = 0.0f;
+
+ //-? LLUM DIFOSA 2
+ llum_d2 = new float[4];
+ llum_d2[0] = 1.0f;
+ llum_d2[1] = 1.0f;
+ llum_d2[2] = 0.0f;
+ llum_d2[3] = 1.0f;
+
+ llum_d2_pos = new float[4];
+ llum_d2_pos[0] = 3.0f;
+ llum_d2_pos[1] = 3.0f;
+ llum_d2_pos[2] = 4.0f;
+ llum_d2_pos[3] = 0.0f;
+
+ //-? INICIALITZACIO GL -> NOPE
+
+ gl.glClearColor( 0.4f, 0.4f, 5.0f, 1.0f );
+ gl.glShadeModel(GL_SMOOTH);
+ gl.glEnable(GL_DEPTH_TEST);
+
+ //-? CREEM LA TEXTURA
+ TextureLoader txtLoader1 = new PPMAsciiTextureLoader(gl, glu);
+ if(isAnApplet)
+ txtLoader1.readTexture(getCodeBase(), "lunaL.ppm");
+ else {
+ txtLoader1.readTexture("lunaL.ppm");
+ }
+
+ gl.glPixelStorei(GL_UNPACK_ALIGNMENT,1);
+ gl.glGenTextures(1,texName);
+ gl.glBindTexture(GL_TEXTURE_2D,texName[0]);
+
+ gl.glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ gl.glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ gl.glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl.glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+ txtLoader1.texImage2DNonScaled(true);
+ // The Scaled Way
+ // txtLoader1.texImage2DScaled2Pow2();
+
+ //-? ILUMINACIO
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, llum_d);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, llum_d_pos);
+ gl.glLightfv(GL_LIGHT1, GL_DIFFUSE, llum_d2);
+ gl.glLightfv(GL_LIGHT1, GL_POSITION, llum_d2_pos);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ gl.glEnable(GL_LIGHT1);
+
+ puntVista();
+}
+//---------------------------------------------------------------
+public void display()
+{
+ int i;
+
+ if (cvsIsInit()==false || glj.gljMakeCurrent() == false)
+ {
+ System.out.println("-- Tenim algun problema glj.gljUse -2-");
+ return;
+ }
+ puntVista();
+
+ gl.glLineWidth(1.4f);
+ gl.glPolygonMode(GL_FRONT_AND_BACK,tipusPolMode);
+ gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (textures)
+ {
+ gl.glEnable(GL_TEXTURE_2D);
+ gl.glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ gl.glBindTexture(GL_TEXTURE_2D,texName[0]);
+ }
+
+ for(i=0;i<6;i++)
+ {
+ gl.glBegin(GL_QUADS);
+ gl.glNormal3fv(n[i]);
+ gl.glTexCoord2f(0.0f,0.0f);gl.glVertex3fv(v[f[i][0]]);
+ gl.glTexCoord2f(0.0f,1.0f);gl.glVertex3fv(v[f[i][1]]);
+ gl.glTexCoord2f(1.0f,1.0f);gl.glVertex3fv(v[f[i][2]]);
+ gl.glTexCoord2f(1.0f,0.0f);gl.glVertex3fv(v[f[i][3]]);
+
+ gl.glEnd();
+ gl.glFlush();
+ }
+ if (textures) gl.glDisable(GL_TEXTURE_2D);
+ glj.gljSwap();
+ glj.gljFree();
+}
+//---------------------------------------------------------------
+
+public void puntVista()
+{
+
+ if (cvsIsInit()==false || glj.gljMakeCurrent() == false)
+ {
+ System.out.println("-- Tenim algun problema glj.gljUse -3-");
+ return;
+ }
+ //-? Actualitzem PUNT OBS
+
+ Integer IaU = new Integer(sl_alfaUsu.getValue());
+ Integer IbU = new Integer(sl_betaUsu.getValue());
+
+ double daU =-(((double)IaU.doubleValue())*((double)2.0*java.lang.Math.PI))/ (double)360.0;
+ double dbU = (((double)IbU.doubleValue())*((double)2.0*java.lang.Math.PI))/ (double)360.0;
+
+ obsX = 5.0 * java.lang.Math.sin(-daU) * java.lang.Math.cos(dbU);
+ obsY = 5.0 * java.lang.Math.sin(dbU);
+ obsZ = 5.0 * java.lang.Math.cos(-daU) * java.lang.Math.cos(dbU);
+
+ //-? PUNT DE VISTA
+ gl.glMatrixMode(GL_PROJECTION);
+ gl.glLoadIdentity();
+ glu.gluPerspective( /* field of view in degree */ 90.0,
+ /* aspect ratio */ 1.0,
+ /* Z near */ 1.0,
+ /* Z far */ 100.0);
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ glu.gluLookAt(obsX, obsY, obsZ, /* eye is at (0,0,5) */
+ 0.0, 0.0, 0.0, /* center is at (0,0,0) */
+ 0.0, 1.0, 0.); /* up is in positive Y direction */
+
+
+
+ //gl.glTranslatef(0.0f, 0.0f, -1.0f);
+ //gl.glRotatef(-60f, 1.0f, 0.0f, 0.0f);
+ //gl.glRotatef(-20f, 0.0f, 0.0f, 1.0f);
+
+}
+//---------------------------------------------------------------
+ public void actionPerformed(java.awt.event.ActionEvent e)
+ {
+
+ if (e.getActionCommand().equals("bS"))
+ {
+ if (tipusPolMode == GL_LINE)
+ {
+ tipusPolMode=GL_FILL;
+ }
+ else
+ {
+ tipusPolMode=GL_LINE;
+ }
+ display();
+ }
+ if (e.getActionCommand().equals("bT"))
+ {
+ if (textures)
+ textures = false;
+ else
+ textures = true;
+ display();
+ }
+
+ }
+
+//---------------------------------------------------------------
+public void mouseClicked(MouseEvent e)
+{
+
+}
+//---------------------------------------------------------------
+public void mouseEntered(MouseEvent e)
+{
+
+}
+//---------------------------------------------------------------
+public void mouseExited(MouseEvent e)
+{
+
+}
+//---------------------------------------------------------------
+public void mousePressed(MouseEvent e)
+{
+ anclaX=e.getX();
+ anclaY=e.getY();
+
+ anclaAlfa=sl_alfaUsu.getValue();
+ anclaBeta=sl_betaUsu.getValue();
+}
+//---------------------------------------------------------------
+public void mouseReleased(MouseEvent e)
+{
+}
+//---------------------------------------------------------------
+public void mouseDragged(MouseEvent e)
+{
+ int difX=anclaX-e.getX();
+ int difY=e.getY()-anclaY;
+
+ sl_alfaUsu.setValue(anclaAlfa+difX);
+ sl_betaUsu.setValue(anclaBeta+difY);
+
+ // puntVista(); JAU
+ // display(); JAU ... -> sDisplay() or repaint ...
+ repaint();
+}
+//---------------------------------------------------------------
+public void mouseMoved(MouseEvent e)
+{
+
+}
+//---------------------------------------------------------------
+public void stateChanged(ChangeEvent e)
+{
+ JSlider source = (JSlider) e.getSource();
+
+ dib.repaint();
+
+ if (source.equals(sl_alfaUsu))
+ {
+
+ }
+
+ if (source.equals(sl_betaUsu))
+ {
+
+ }
+}
+//---------------------------------------------------------------
+} //-? Fi CLASSE Dibuix
+
+//---------------------------------------------------------------
+}// Fi Applet testTextPPM1
+
diff --git a/demos/testTextPPM1J2P.html b/demos/testTextPPM1J2P.html
new file mode 100644
index 0000000..4d76baf
--- /dev/null
+++ b/demos/testTextPPM1J2P.html
@@ -0,0 +1,43 @@
+
+<HTML>
+<HEAD>
+<TITLE>test</TITLE>
+</HEAD>
+<BODY LINK="#0000ff" VLINK="#800080" BGCOLOR="#e6e6ff">
+<hr>
+<!--"CONVERTED_APPLET"-->
+<!-- CONVERTER VERSION 1.0 -->
+<SCRIPT LANGUAGE="JavaScript"><!--
+ var _info = navigator.userAgent; var _ns = false;
+ var _ie = (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 && _info.indexOf("Windows 3.1") < 0);
+//--></SCRIPT>
+<COMMENT><SCRIPT LANGUAGE="JavaScript1.1"><!--
+ var _ns = (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 && _info.indexOf("Win16") < 0 && java.lang.System.getProperty("os.version").indexOf("3.5") < 0) || (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0)));
+//--></SCRIPT></COMMENT>
+
+<SCRIPT LANGUAGE="JavaScript"><!--
+ if (_ie == true) document.writeln('<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = 550 HEIGHT = 550 codebase="http://java.sun.com/products/plugin/1.2/jinstall-12-win32.cab#Version=1,2,0,0"><NOEMBED><XMP>');
+ else if (_ns == true) document.writeln('<EMBED type="application/x-java-applet;version=1.2" java_CODE = "testTextPPM1.class" WIDTH = 550 HEIGHT = 550 pluginspage="http://java.sun.com/products/plugin/1.2/plugin-install.html"><NOEMBED><XMP>');
+//--></SCRIPT>
+<APPLET CODE = "testTextPPM1.class" WIDTH = 550 HEIGHT = 550 ></XMP>
+<PARAM NAME = CODE VALUE = "testTextPPM1.class" >
+
+<PARAM NAME="type" VALUE="application/x-java-applet;version=1.2">
+
+</APPLET>
+
+</NOEMBED></EMBED></OBJECT>
+
+
+<!--
+<APPLET CODE = "testTextPPM1.class" WIDTH = 550 HEIGHT = 550 >
+
+
+</APPLET>
+-->
+<!--"END_CONVERTED_APPLET"-->
+
+<hr>
+</BODY>
+</HTML>
+
diff --git a/demos/waveCvs.java b/demos/waveCvs.java
new file mode 100644
index 0000000..bd7afbe
--- /dev/null
+++ b/demos/waveCvs.java
@@ -0,0 +1,634 @@
+
+/*
+ * @version 1.0, 23. JUNI 1998
+ */
+
+import gl4java.GLContext;
+import gl4java.awt.GLAnimCanvas;
+import java.awt.*;
+import java.awt.event.*;
+
+
+class waveCvs extends GLAnimCanvas
+ implements MouseListener
+{
+
+ class facet {
+ public float color[];
+ public float normal[];
+
+ public facet()
+ { color = new float[3];
+ normal = new float[3];
+ }
+ }
+
+ class coord {
+ public float vertex[];
+ public float normal[];
+
+ public coord()
+ { vertex = new float[3];
+ normal = new float[3];
+ }
+ }
+
+ class mesh {
+ public int widthX, widthY;
+ public int numFacets;
+ public int numCoords;
+ public int frames;
+ coord coords[];
+ facet facets[];
+ }
+
+/**
+ * The thread for referencing Thread (Animation)
+ *
+ * @see sbin
+ */
+ boolean rgb;
+
+ int colorIndexes1[];
+ int colorIndexes2[];
+ int clearMask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;
+
+ boolean smooth = GL_TRUE;
+ boolean lighting = GL_TRUE;
+ boolean depth = GL_TRUE;
+ boolean stepMode = GL_FALSE;
+ boolean spinMode = GL_FALSE;
+ int contouring = 0;
+ int widthX, widthY;
+
+ int checkerSize;
+ float height;
+
+ int frames, curFrame = 0, nextFrame = 0;
+
+ mesh theMesh;
+
+ static final float PI = 3.14159265358979323846f;
+
+
+ byte contourTexture1[] = {
+ (byte) 255, (byte)255, (byte) 255, (byte) 255,
+ (byte) 255, (byte)255, (byte) 255, (byte) 255,
+ (byte) 255, (byte)255, (byte) 255, (byte) 255,
+ (byte) 127, (byte)127, (byte) 127, (byte) 127
+ };
+ byte contourTexture2[] = {
+ (byte) 255, (byte) 255, (byte) 255, (byte) 255,
+ (byte) 255, (byte) 127, (byte) 127, (byte) 127,
+ (byte) 255, (byte) 127, (byte) 127, (byte) 127,
+ (byte) 255, (byte) 127, (byte) 127, (byte) 127
+ };
+
+
+ public waveCvs(int w, int h, String glClass, String gluClass)
+ {
+ super( w, h, glClass, gluClass);
+ }
+
+ Frame ctrl = null;
+
+ Button ButtonCont; TextField TextCont;
+ Button ButtonShade; TextField TextShade;
+ Button ButtonLight; TextField TextLight;
+ Button ButtonDepth; TextField TextDepth;
+ Button ButtonStepMode; TextField TextStepMode;
+ Button ButtonStep; TextField TextStep;
+ Button ButtonSpinMode; TextField TextSpinMode;
+
+ public void init()
+ {
+ ctrl = new Frame ("Wave-Features");
+
+ ctrl.setLayout(new GridLayout(7,2));
+ ctrl.add ( ButtonCont=new Button("Contour") );
+ ctrl.add ( TextCont=new TextField() );
+ ctrl.add ( ButtonShade=new Button("Shade") );
+ ctrl.add ( TextShade=new TextField() );
+ ctrl.add ( ButtonLight=new Button("Light") );
+ ctrl.add ( TextLight=new TextField() );
+ ctrl.add ( ButtonDepth=new Button("Depth") );
+ ctrl.add ( TextDepth=new TextField() );
+ ctrl.add ( ButtonStepMode=new Button("StepMod") );
+ ctrl.add ( TextStepMode=new TextField() );
+ ctrl.add ( ButtonStep=new Button("Step") );
+ ctrl.add ( TextStep=new TextField() );
+ ctrl.add ( ButtonSpinMode=new Button("SpinMod") );
+ ctrl.add ( TextSpinMode=new TextField() );
+
+ TextCont.setEditable(false);
+ TextShade.setEditable(false);
+ TextLight.setEditable(false);
+ TextDepth.setEditable(false);
+ TextStepMode.setEditable(false);
+ TextStep.setEditable(false);
+ TextSpinMode.setEditable(false);
+
+ updateTextFields();
+
+ ctrl.pack();
+ ctrl.setVisible( true );
+
+ ButtonCont.addMouseListener(this);
+ ButtonShade.addMouseListener(this);
+ ButtonLight.addMouseListener(this);
+ ButtonDepth.addMouseListener(this);
+ ButtonStepMode.addMouseListener(this);
+ ButtonStep.addMouseListener(this);
+ ButtonSpinMode.addMouseListener(this);
+
+ rgb = GL_TRUE;
+ frames = 10;
+ widthX = 10;
+ widthY = 10;
+ checkerSize = 2;
+ height = 0.2f;
+
+ /* here we should add and initialize our JAVA components */
+ colorIndexes1=new int [3];
+ colorIndexes2=new int [3];
+
+ /* Standard gl4java Init */
+ if(rgb==GL_TRUE)
+ System.out.println("using rgb...");
+ else
+ System.out.println("using color index...");
+
+ gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+
+ gl.glShadeModel(GL_SMOOTH);
+
+ gl.glFrontFace(GL_CW);
+
+ gl.glEnable(GL_DEPTH_TEST);
+
+ InitMaterials();
+ InitTexture();
+ InitMesh();
+
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glTranslatef(0.0f, 0.4f, -1.8f);
+ gl.glScalef(2.0f, 2.0f, 2.0f);
+ gl.glRotatef(-35.0f, 1.0f, 0.0f, 0.0f);
+ gl.glRotatef(35.0f, 0.0f, 0.0f, 1.0f);
+ /* ... and furthet OpenGL init's - like you want to */
+ glj.gljCheckGL();
+ }
+
+ public coord GETCOORD(int frame, int x, int y)
+ {
+ return
+ theMesh.coords[frame*theMesh.numCoords+(x)+(y)*(theMesh.widthX+1)];
+ }
+ public facet GETFACET(int frame, int x, int y)
+ {
+ return
+ theMesh.facets[frame*theMesh.numFacets+(x)+(y)*(theMesh.widthX)];
+ }
+
+ public void display()
+ {
+ coord coord_;
+ facet facet_;
+ float lastColor[] = null;
+ float thisColor[] = null;
+ int i, j;
+
+ /* Standard gl4java Init */
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("wave-display: problem in use() method");
+ return;
+ }
+
+ gl.glClear(clearMask);
+
+ if (nextFrame>0 || stepMode==GL_FALSE) {
+ curFrame++;
+ }
+ if (curFrame >= theMesh.frames) {
+ curFrame = 0;
+ }
+
+ if ((nextFrame>0 || stepMode==GL_FALSE) && spinMode==GL_TRUE)
+ {
+ gl.glRotatef(5.0f, 0.0f, 0.0f, 1.0f);
+ }
+ nextFrame = 0;
+
+ for (i = 0; i < theMesh.widthX; i++) {
+ gl.glBegin(GL_QUAD_STRIP);
+ lastColor = null;
+ for (j = 0; j < theMesh.widthY; j++) {
+ facet_ = GETFACET(curFrame, i, j);
+ if (smooth==GL_FALSE && lighting==GL_TRUE)
+ {
+ gl.glNormal3fv(facet_.normal);
+ }
+ if (lighting==GL_TRUE) {
+ if (rgb==GL_TRUE) {
+ thisColor = facet_.color;
+ gl.glColor3fv(facet_.color);
+ } else {
+ thisColor = facet_.color;
+ gl.glMaterialfv(GL_FRONT_AND_BACK, GL_COLOR_INDEXES,
+ facet_.color);
+ }
+ } else {
+ if (rgb==GL_TRUE) {
+ thisColor = facet_.color;
+ gl.glColor3fv(facet_.color);
+ } else {
+ thisColor = facet_.color;
+ gl.glIndexf(facet_.color[1]);
+ }
+ }
+
+ if (lastColor==null ||
+ (thisColor[0] != lastColor[0] && smooth==GL_TRUE)
+ )
+ {
+ if (lastColor!=null) {
+ gl.glEnd();
+ gl.glBegin(GL_QUAD_STRIP);
+ }
+ coord_ = GETCOORD(curFrame, i, j);
+ if (smooth==GL_TRUE && lighting==GL_TRUE)
+ {
+ gl.glNormal3fv(coord_.normal);
+ }
+ gl.glVertex3fv(coord_.vertex);
+
+ coord_ = GETCOORD(curFrame, i+1, j);
+ if (smooth==GL_TRUE && lighting==GL_TRUE)
+ {
+ gl.glNormal3fv(coord_.normal);
+ }
+ gl.glVertex3fv(coord_.vertex);
+ }
+
+ coord_ = GETCOORD(curFrame, i, j+1);
+ if (smooth==GL_TRUE && lighting==GL_TRUE) {
+ gl.glNormal3fv(coord_.normal);
+ }
+ gl.glVertex3fv(coord_.vertex);
+
+ coord_ = GETCOORD(curFrame, i+1, j+1);
+ if (smooth==GL_TRUE && lighting==GL_TRUE) {
+ gl.glNormal3fv(coord_.normal);
+ }
+ gl.glVertex3fv(coord_.vertex);
+
+ lastColor = thisColor;
+ }
+ gl.glEnd();
+ }
+
+ glj.gljSwap();
+ glj.gljCheckGL();
+ glj.gljFree();
+ }
+
+ public void InitMesh()
+ {
+ coord coord_;
+ facet facet_;
+ float dp1[], dp2[];
+ float pt1[], pt2[], pt3[];
+ float angle, d, x, y;
+ int numFacets, numCoords, frameNum, i, j;
+
+ dp1=new float[3];
+ dp2=new float[3];
+
+ theMesh = new mesh();
+ theMesh.widthX = widthX;
+ theMesh.widthY = widthY;
+ theMesh.frames = frames;
+
+ numFacets = widthX * widthY;
+ numCoords = (widthX + 1) * (widthY + 1);
+
+ theMesh.numCoords = numCoords;
+ theMesh.numFacets = numFacets;
+
+ theMesh.coords = new coord[frames*numCoords];
+ for(i=0; i<frames*numCoords; i++)
+ theMesh.coords[i]=new coord();
+
+ theMesh.facets = new facet[frames*numFacets];
+ for(i=0; i<frames*numFacets; i++)
+ theMesh.facets[i]=new facet();
+
+ for (frameNum = 0; frameNum < frames; frameNum++) {
+ for (i = 0; i <= widthX; i++) {
+ x = i / (float)widthX;
+ for (j = 0; j <= widthY; j++) {
+ y = j / (float)widthY;
+
+ d = (float) Math.sqrt(x*x+y*y);
+ if (d == 0.0) {
+ d = 0.0001f;
+ }
+ angle = 2 * (float)PI * d +
+ (2 * (float)PI / frames * frameNum);
+
+ coord_ = GETCOORD(frameNum, i, j);
+
+ coord_.vertex[0] = x - 0.5f;
+ coord_.vertex[1] = y - 0.5f;
+ coord_.vertex[2] = (height - height * d) *
+ (float)Math.cos(angle);
+
+ coord_.normal[0] = -(height / d) * x * ((1 - d) * 2 *
+ PI * (float)Math.sin(angle) +
+ (float)Math.cos(angle));
+ coord_.normal[1] = -(height / d) * y * ((1 - d) * 2 *
+ PI * (float)Math.sin(angle) +
+ (float)Math.cos(angle));
+ coord_.normal[2] = -1;
+
+ d = 1.0f /
+ (float)Math.sqrt(coord_.normal[0]*coord_.normal[0]+
+ coord_.normal[1]*coord_.normal[1]+1);
+ coord_.normal[0] *= d;
+ coord_.normal[1] *= d;
+ coord_.normal[2] *= d;
+ }
+ }
+ for (i = 0; i < widthX; i++) {
+ for (j = 0; j < widthY; j++) {
+ facet_ = GETFACET(frameNum, i, j);
+ if ( ( ( (i/checkerSize)%2 ) ^ (j/checkerSize) %2 )
+ >0
+ )
+ {
+ if (rgb==GL_TRUE) {
+ facet_.color[0] = 1.0f;
+ facet_.color[1] = 0.2f;
+ facet_.color[2] = 0.2f;
+ } else {
+ facet_.color[0] = colorIndexes1[0];
+ facet_.color[1] = colorIndexes1[1];
+ facet_.color[2] = colorIndexes1[2];
+ }
+ } else {
+ if (rgb==GL_TRUE) {
+ facet_.color[0] = 0.2f;
+ facet_.color[1] = 1.0f;
+ facet_.color[2] = 0.2f;
+ } else {
+ facet_.color[0] = colorIndexes2[0];
+ facet_.color[1] = colorIndexes2[1];
+ facet_.color[2] = colorIndexes2[2];
+ }
+ }
+ pt1 = GETCOORD(frameNum, i, j).vertex;
+ pt2 = GETCOORD(frameNum, i, j+1).vertex;
+ pt3 = GETCOORD(frameNum, i+1, j+1).vertex;
+
+ dp1[0] = pt2[0] - pt1[0];
+ dp1[1] = pt2[1] - pt1[1];
+ dp1[2] = pt2[2] - pt1[2];
+
+ dp2[0] = pt3[0] - pt2[0];
+ dp2[1] = pt3[1] - pt2[1];
+ dp2[2] = pt3[2] - pt2[2];
+
+ facet_.normal[0] = dp1[1] * dp2[2] - dp1[2] * dp2[1];
+ facet_.normal[1] = dp1[2] * dp2[0] - dp1[0] * dp2[2];
+ facet_.normal[2] = dp1[0] * dp2[1] - dp1[1] * dp2[0];
+
+ d = 1.0f / (float)Math.sqrt(facet_.normal[0]*facet_.normal[0]+
+ facet_.normal[1]*facet_.normal[1]+
+ facet_.normal[2]*facet_.normal[2]);
+
+ facet_.normal[0] *= d;
+ facet_.normal[1] *= d;
+ facet_.normal[2] *= d;
+ }
+ }
+ }
+ }
+
+ static float ambient[] = {0.1f, 0.1f, 0.1f, 1.0f};
+ static float diffuse[] = {0.5f, 1.0f, 1.0f, 1.0f};
+ static float position[] = {90.0f, 90.0f, 150.0f, 0.0f};
+ static float front_mat_shininess[] = {60.0f, 0f, 0f, 0f};
+ static float front_mat_specular[] = {0.2f, 0.2f, 0.2f, 1.0f};
+ static float front_mat_diffuse[] = {0.5f, 0.28f, 0.38f, 1.0f};
+ static float back_mat_shininess[] = {60.0f, 0f, 0f, 0f};
+ static float back_mat_specular[] = {0.5f, 0.5f, 0.2f, 1.0f};
+ static float back_mat_diffuse[] = {1.0f, 1.0f, 0.2f, 1.0f};
+ static float lmodel_ambient[] = {1.0f, 1.0f, 1.0f, 1.0f};
+ static float lmodel_twoside[] = {1f, 0f, 0f, 0f};
+
+ public void InitMaterials()
+ {
+ gl.glMatrixMode(GL_PROJECTION);
+ glu.gluPerspective(450, 1.0, 0.5, 10.0);
+
+ gl.glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ gl.glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ gl.glLightfv(GL_LIGHT0, GL_POSITION, position);
+ gl.glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ gl.glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+
+ gl.glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
+ gl.glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
+ gl.glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
+ gl.glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
+ gl.glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
+ gl.glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
+ if (rgb==GL_TRUE) {
+ gl.glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+ }
+
+ if (rgb==GL_TRUE) {
+ gl.glEnable(GL_COLOR_MATERIAL);
+ } /* else {
+ SetColorMap();
+ } */
+ }
+
+ public void InitTexture()
+ {
+
+ gl.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ gl.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ gl.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ gl.glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ gl.glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ }
+
+ // Methods required for the implementation of MouseListener
+ public void mouseClicked( MouseEvent evt )
+ {
+ Component comp = evt.getComponent();
+
+ if( cvsIsInit()==false ) return ;
+
+ if( glj.gljMakeCurrent() == false )
+ {
+ System.out.println("CtrlWin: problem in use() method");
+ return;
+ } else {
+ gl.glFinish();
+ }
+
+ if(comp.equals(ButtonCont))
+ {
+ contouring++;
+ if (contouring == 1) {
+ float map[];
+ map=new float[4];
+ map[0]=0f;
+ map[1]=0f;
+ map[2]=20f;
+ map[3]=0f;
+
+ gl.glTexImage2D(GL_TEXTURE_2D, 0, 3, 4, 4, 0, GL_LUMINANCE,
+ GL_UNSIGNED_BYTE, contourTexture1);
+ gl.glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ gl.glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ gl.glTexGenfv(GL_S, GL_OBJECT_PLANE, map);
+ gl.glTexGenfv(GL_T, GL_OBJECT_PLANE, map);
+ gl.glEnable(GL_TEXTURE_2D);
+ gl.glEnable(GL_TEXTURE_GEN_S);
+ gl.glEnable(GL_TEXTURE_GEN_T);
+ } else if (contouring == 2) {
+ float map[];
+ map=new float[4];
+ map[0]=0f;
+ map[1]=0f;
+ map[2]=20f;
+ map[3]=0f;
+
+ gl.glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ gl.glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ gl.glPushMatrix();
+ gl.glMatrixMode(GL_MODELVIEW);
+ gl.glLoadIdentity();
+ gl.glTexGenfv(GL_S, GL_EYE_PLANE, map);
+ gl.glTexGenfv(GL_T, GL_EYE_PLANE, map);
+ gl.glPopMatrix();
+ } else {
+ contouring = 0;
+ gl.glDisable(GL_TEXTURE_GEN_S);
+ gl.glDisable(GL_TEXTURE_GEN_T);
+ gl.glDisable(GL_TEXTURE_2D);
+ }
+ }
+ else if(comp.equals(ButtonShade))
+ {
+ smooth = (smooth==GL_TRUE)?GL_FALSE:GL_TRUE;
+ if (smooth==GL_TRUE) {
+ gl.glShadeModel(GL_SMOOTH);
+ } else {
+ gl.glShadeModel(GL_FLAT);
+ }
+ }
+ else if(comp.equals(ButtonLight))
+ {
+ lighting = (lighting==GL_TRUE)?GL_FALSE:GL_TRUE;
+ if (lighting==GL_TRUE) {
+ gl.glEnable(GL_LIGHTING);
+ gl.glEnable(GL_LIGHT0);
+ if (rgb==GL_TRUE) {
+ gl.glEnable(GL_COLOR_MATERIAL);
+ }
+ } else {
+ gl.glDisable(GL_LIGHTING);
+ gl.glDisable(GL_LIGHT0);
+ if (rgb==GL_TRUE) {
+ gl.glDisable(GL_COLOR_MATERIAL);
+ }
+ }
+ }
+ else if(comp.equals(ButtonDepth))
+ {
+ depth = (depth==GL_TRUE)?GL_FALSE:GL_TRUE;
+ if (depth==GL_TRUE) {
+ gl.glEnable(GL_DEPTH_TEST);
+ clearMask |= GL_DEPTH_BUFFER_BIT;
+ } else {
+ gl.glDisable(GL_DEPTH_TEST);
+ clearMask &= ~GL_DEPTH_BUFFER_BIT;
+ }
+ }
+ else if(comp.equals(ButtonStepMode))
+ {
+ stepMode = (stepMode==GL_TRUE)?GL_FALSE:GL_TRUE;
+ if (stepMode==GL_TRUE) {
+ stop();
+ } else {
+ start();
+ }
+ }
+ else if(comp.equals(ButtonStep))
+ {
+ if (stepMode==GL_TRUE) {
+ nextFrame = 1;
+ }
+ }
+ else if(comp.equals(ButtonSpinMode))
+ {
+ spinMode = (spinMode==GL_TRUE)?GL_FALSE:GL_TRUE;
+ }
+
+ updateTextFields();
+
+ gl.glFinish();
+ glj.gljFree();
+
+ repaint();
+ }
+
+ public void updateTextFields()
+ {
+ TextCont.setText(String.valueOf(contouring));
+
+ TextShade.setText((smooth==GL_TRUE)?"ON":"OFF");
+
+ TextLight.setText((lighting==GL_TRUE)?"ON":"OFF");
+
+ TextDepth.setText((depth==GL_TRUE)?"ON":"OFF");
+
+ TextStepMode.setText((stepMode==GL_TRUE)?"ON":"OFF");
+
+ TextStep.setText((stepMode==GL_TRUE)?"ON":"OFF");
+
+ TextSpinMode.setText((spinMode==GL_TRUE)?"ON":"OFF");
+ }
+
+ public void mouseEntered( MouseEvent evt )
+ {
+ }
+
+ public void mouseExited( MouseEvent evt )
+ {
+ }
+
+ public void mousePressed( MouseEvent evt )
+ {
+ }
+
+ public void mouseReleased( MouseEvent evt )
+ {
+ }
+
+ public void cvsDispose()
+ {
+ if(ctrl!=null)
+ {
+ ctrl.dispose();
+ }
+ super.cvsDispose();
+ }
+}